Make origin data initialization consistent other fields in 2PC header
authorMichael Paquier <[email protected]>
Mon, 14 Feb 2022 00:30:35 +0000 (09:30 +0900)
committerMichael Paquier <[email protected]>
Mon, 14 Feb 2022 00:30:35 +0000 (09:30 +0900)
As of 1eb6d65, the origin data is optionally stored in a 2PC file
header, with the data filled in EndPrepare() even in the default case
where there is no origin data to add.  This was inconsistent with all
the other fields of TwoPhaseFileHeader which are initialized in
StartPrepare(), so move the initialization of origin_lsn and
origin_timestamp there instead.  The effect of missing the
initialization at this early stage is only cosmetic based on the current
logic of the code, but could have led to issues in the long-term, and it
is more consistent done this way.

Reported-by: Ranier Vilela
Discussion: https://postgr.es/m/CAEudQAooECJ+gU_RZB-yhioPOV94R4ucoHAf68PiJhLpgpVpBw@mail.gmail.com

src/backend/access/transam/twophase.c

index 608c5149e52cac2dd335dc9d50a05f4872bf8a88..874c8ed1256cf3f0bbc8fe0e894f52c95f974b45 100644 (file)
@@ -1074,6 +1074,9 @@ StartPrepare(GlobalTransaction gxact)
    hdr.ninvalmsgs = xactGetCommittedInvalidationMessages(&invalmsgs,
                                                          &hdr.initfileinval);
    hdr.gidlen = strlen(gxact->gid) + 1;    /* Include '\0' */
+   /* EndPrepare will fill the origin data, if necessary */
+   hdr.origin_lsn = InvalidXLogRecPtr;
+   hdr.origin_timestamp = 0;
 
    save_state_data(&hdr, sizeof(TwoPhaseFileHeader));
    save_state_data(gxact->gid, hdr.gidlen);
@@ -1133,11 +1136,6 @@ EndPrepare(GlobalTransaction gxact)
        hdr->origin_lsn = replorigin_session_origin_lsn;
        hdr->origin_timestamp = replorigin_session_origin_timestamp;
    }
-   else
-   {
-       hdr->origin_lsn = InvalidXLogRecPtr;
-       hdr->origin_timestamp = 0;
-   }
 
    /*
     * If the data size exceeds MaxAllocSize, we won't be able to read it in