1
0
mirror of https://github.com/postgres/postgres.git synced 2025-08-21 10:42:50 +03:00

Fix WAL format incompatibility introduced by backpatching of 52ac6cd2d0

52ac6cd2d0 added new field to ginxlogDeletePage and was backpatched to 9.4.
That led to problems when patched postgres instance applies WAL records
generated by non-patched one.  WAL records generated by non-patched instance
don't contain new field, which patched one is expecting to see.

Thankfully, we can distinguish patched and non-patched WAL records by their data
size.  If we see that WAL record is generated by non-patched instance, we skip
processing of new field.  This commit comes with some assertions.  In
particular, if it appears that on some platform struct data size didn't change
then static assertion will trigger.

Reported-by: Simon Riggs
Discussion: https://postgr.es/m/CANP8%2Bj%2BK4whxf7ET7%2BgO%2BG-baC3-WxqqH%3DnV4X2CgfEPA3Yu3g%40mail.gmail.com
Author: Alexander Korotkov
Reviewed-by: Simon Riggs, Alvaro Herrera
Backpatch-through: 9.4
This commit is contained in:
Alexander Korotkov
2019-03-24 15:26:45 +03:00
parent 7d7435c5c5
commit 89f39736f4
2 changed files with 28 additions and 1 deletions

View File

@@ -161,6 +161,16 @@ typedef struct ginxlogDeletePage
TransactionId deleteXid; /* last Xid which could see this page in scan */
} ginxlogDeletePage;
/*
* Previous version of ginxlogDeletePage struct, which didn't have deleteXid
* field. Used for size comparison (see ginRedoDeletePage()).
*/
typedef struct ginxlogDeletePageOld
{
OffsetNumber parentOffset;
BlockNumber rightLink;
} ginxlogDeletePageOld;
#define XLOG_GIN_UPDATE_META_PAGE 0x60
/*