@@ -871,6 +871,7 @@ typedef struct TwoPhaseFileHeader
871
871
int32 ninvalmsgs ; /* number of cache invalidation messages */
872
872
bool initfileinval ; /* does relcache init file need invalidation? */
873
873
uint16 gidlen ; /* length of the GID - GID follows the header */
874
+ xl_xact_origin xl_origin ; /* replication origin information */
874
875
} TwoPhaseFileHeader ;
875
876
876
877
/*
@@ -1022,12 +1023,10 @@ EndPrepare(GlobalTransaction gxact)
1022
1023
{
1023
1024
TwoPhaseFileHeader * hdr ;
1024
1025
StateFileChunk * record ;
1025
- xl_xact_origin xl_origin ;
1026
- xl_xact_xinfo xl_xinfo ;
1027
1026
uint8 info = XLOG_XACT_PREPARE ;
1028
- bool replorigin ;
1027
+ bool replorigin ;
1029
1028
1030
- replorigin = (replorigin_session_origin != InvalidRepOriginId &&
1029
+ replorigin = (replorigin_session_origin != InvalidRepOriginId &&
1031
1030
replorigin_session_origin != DoNotReplicateId );
1032
1031
1033
1032
/* Add the end sentinel to the list of 2PC records */
@@ -1039,6 +1038,15 @@ EndPrepare(GlobalTransaction gxact)
1039
1038
Assert (hdr -> magic == TWOPHASE_MAGIC );
1040
1039
hdr -> total_len = records .total_len + sizeof (pg_crc32c );
1041
1040
1041
+ if (replorigin ) {
1042
+ Assert (replorigin_session_origin_lsn != InvalidXLogRecPtr );
1043
+ hdr -> xl_origin .origin_lsn = replorigin_session_origin_lsn ;
1044
+ hdr -> xl_origin .origin_timestamp = replorigin_session_origin_timestamp ;
1045
+ } else {
1046
+ hdr -> xl_origin .origin_lsn = InvalidXLogRecPtr ;
1047
+ hdr -> xl_origin .origin_timestamp = 0 ;
1048
+ }
1049
+
1042
1050
/*
1043
1051
* If the data size exceeds MaxAllocSize, we won't be able to read it in
1044
1052
* ReadTwoPhaseFile. Check for that now, rather than fail in the case
@@ -1065,31 +1073,12 @@ EndPrepare(GlobalTransaction gxact)
1065
1073
XLogEnsureRecordSpace (0 , records .num_chunks );
1066
1074
1067
1075
START_CRIT_SECTION ();
1068
- xl_xinfo .xinfo = 0 ;
1069
- /* dump transaction origin information */
1070
- if (replorigin )
1071
- {
1072
- xl_xinfo .xinfo |= XACT_XINFO_HAS_ORIGIN ;
1073
- Assert (replorigin_session_origin_lsn != InvalidXLogRecPtr );
1074
- xl_origin .origin_lsn = replorigin_session_origin_lsn ;
1075
- xl_origin .origin_timestamp = replorigin_session_origin_timestamp ;
1076
- }
1077
-
1078
- if (xl_xinfo .xinfo != 0 )
1079
- info |= XLOG_XACT_HAS_INFO ;
1080
-
1081
1076
MyPgXact -> delayChkpt = true;
1082
1077
1083
1078
XLogBeginInsert ();
1084
1079
for (record = records .head ; record != NULL ; record = record -> next )
1085
1080
XLogRegisterData (record -> data , record -> len );
1086
1081
1087
- if (xl_xinfo .xinfo != 0 )
1088
- XLogRegisterData ((char * ) (& xl_xinfo .xinfo ), sizeof (xl_xinfo .xinfo ));
1089
-
1090
- if (xl_xinfo .xinfo & XACT_XINFO_HAS_ORIGIN )
1091
- XLogRegisterData ((char * ) (& xl_origin ), sizeof (xl_xact_origin ));
1092
-
1093
1082
XLogIncludeOrigin ();
1094
1083
1095
1084
gxact -> prepare_end_lsn = XLogInsert (RM_XACT_ID , info );
@@ -1285,6 +1274,9 @@ ParsePrepareRecord(uint8 info, char *xlrec, xl_xact_parsed_prepare *parsed)
1285
1274
hdr = (TwoPhaseFileHeader * ) xlrec ;
1286
1275
bufptr = xlrec + MAXALIGN (sizeof (TwoPhaseFileHeader ));
1287
1276
1277
+ parsed -> origin_lsn = hdr -> xl_origin .origin_lsn ;
1278
+ parsed -> origin_timestamp = hdr -> xl_origin .origin_timestamp ;
1279
+
1288
1280
strncpy (parsed -> twophase_gid , bufptr , hdr -> gidlen );
1289
1281
bufptr += MAXALIGN (hdr -> gidlen );
1290
1282
@@ -1305,33 +1297,6 @@ ParsePrepareRecord(uint8 info, char *xlrec, xl_xact_parsed_prepare *parsed)
1305
1297
1306
1298
parsed -> msgs = (SharedInvalidationMessage * ) bufptr ;
1307
1299
bufptr += MAXALIGN (hdr -> ninvalmsgs * sizeof (SharedInvalidationMessage ));
1308
-
1309
- /*
1310
- * Parse xinfo now.
1311
- */
1312
-
1313
- parsed -> xinfo = 0 ;
1314
- bufptr = xlrec + hdr -> total_len - sizeof (pg_crc32c );
1315
-
1316
- if (info & XLOG_XACT_HAS_INFO )
1317
- {
1318
- xl_xact_xinfo * xl_xinfo = (xl_xact_xinfo * ) bufptr ;
1319
- parsed -> xinfo = xl_xinfo -> xinfo ;
1320
- bufptr += sizeof (xl_xact_xinfo );
1321
- }
1322
-
1323
-
1324
- if (parsed -> xinfo & XACT_XINFO_HAS_ORIGIN )
1325
- {
1326
- xl_xact_origin xl_origin ;
1327
- /* we're only guaranteed 4 byte alignment, so copy onto stack */
1328
- memcpy (& xl_origin , bufptr , sizeof (xl_origin ));
1329
- parsed -> origin_lsn = xl_origin .origin_lsn ;
1330
- Assert (parsed -> origin_lsn != 0 );
1331
- parsed -> origin_timestamp = xl_origin .origin_timestamp ;
1332
- bufptr += sizeof (xl_xact_origin );
1333
- }
1334
-
1335
1300
}
1336
1301
1337
1302
0 commit comments