From c963e84fb8c8ec75bfdbe6a7a0857ccd1378baa0 Mon Sep 17 00:00:00 2001 From: Michael Paquier Date: Mon, 14 Feb 2022 09:30:35 +0900 Subject: [PATCH] Make origin data initialization consistent other fields in 2PC header 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 | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/src/backend/access/transam/twophase.c b/src/backend/access/transam/twophase.c index 608c5149e5..874c8ed125 100644 --- a/src/backend/access/transam/twophase.c +++ b/src/backend/access/transam/twophase.c @@ -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