Defect and enhancement in multi-log support
authorDilip Kumar <[email protected]>
Fri, 7 Jun 2019 09:33:37 +0000 (15:03 +0530)
committerThomas Munro <[email protected]>
Wed, 17 Jul 2019 06:55:35 +0000 (18:55 +1200)
src/backend/access/undo/undolog.c
src/include/access/undolog.h

index f2e0272ab13b8ba19c24c0b96103e8ab55c7a899..b5502f2417cb32c14f94ae4eaf42d32012dfd19f 100644 (file)
@@ -940,11 +940,11 @@ UndoLogAllocateInRecovery(UndoLogAllocContext *context,
                        context->recovery_logno = slot->logno;
 
                        /* Read log switch information from meta and reset it. */
-                       *prevlog_xact_start = slot->meta.unlogged.prevlog_xact_start;
-                       *prevlog_last_urp = slot->meta.unlogged.prevlog_last_urp;
+                       *prevlog_xact_start = slot->meta.prevlog_xact_start;
+                       *prevlog_last_urp = slot->meta.prevlog_last_urp;
 
-                       slot->meta.unlogged.prevlog_xact_start = InvalidUndoRecPtr;
-                       slot->meta.unlogged.prevlog_last_urp = InvalidUndoRecPtr;
+                       slot->meta.prevlog_xact_start = InvalidUndoRecPtr;
+                       slot->meta.prevlog_last_urp = InvalidUndoRecPtr;
 
                        return MakeUndoRecPtr(slot->logno, slot->meta.unlogged.insert);
                }
@@ -1284,8 +1284,8 @@ UndoLogSwitchSetPrevLogInfo(UndoLogNumber logno, UndoRecPtr prevlog_xact_start,
        Assert(AmAttachedToUndoLogSlot(slot));
 
        LWLockAcquire(&slot->mutex, LW_EXCLUSIVE);
-       slot->meta.unlogged.prevlog_xact_start = prevlog_last_urp;
-       slot->meta.unlogged.prevlog_last_urp = prevlog_last_urp;
+       slot->meta.prevlog_xact_start = prevlog_xact_start;
+       slot->meta.prevlog_last_urp = prevlog_last_urp;
        LWLockRelease(&slot->mutex);
 
        /* Wal log the log switch. */
@@ -1293,7 +1293,7 @@ UndoLogSwitchSetPrevLogInfo(UndoLogNumber logno, UndoRecPtr prevlog_xact_start,
                xl_undolog_switch xlrec;
 
                xlrec.logno = logno;
-               xlrec.prevlog_xact_start = prevlog_last_urp;
+               xlrec.prevlog_xact_start = prevlog_xact_start;
                xlrec.prevlog_last_urp = prevlog_xact_start;
 
                XLogBeginInsert();
@@ -2571,8 +2571,8 @@ undolog_xlog_switch(XLogReaderState *record)
         * Restore the log switch information in the MyUndoLogState this will be
         * reset by following UndoLogAllocateDuringRecovery.
         */
-       slot->meta.unlogged.prevlog_xact_start = xlrec->prevlog_xact_start;
-       slot->meta.unlogged.prevlog_last_urp = xlrec->prevlog_last_urp;
+       slot->meta.prevlog_xact_start = xlrec->prevlog_xact_start;
+       slot->meta.prevlog_last_urp = xlrec->prevlog_last_urp;
 }
 
 void
index c4a6b29ef0ef7f11f0d01cf5937232230b52dcb0..1c79c1ff32df20cf86d9a8beb717434a96057b1a 100644 (file)
@@ -211,16 +211,6 @@ typedef struct UndoLogUnloggedMetaData
        UndoLogOffset last_xact_start;  /* last transaction's first byte in this log */
        UndoLogOffset this_xact_start;  /* this transaction's first byte in this log */
        TransactionId xid;                              /* currently attached/writing xid */
-
-       /*
-        * Below two variable are used during recovery when transaction's undo
-        * records are split across undo logs.  Replay of switch will restore
-        * these two undo record pointers which will be reset on next allocation
-        * during recovery. */
-       UndoRecPtr      prevlog_xact_start; /* Transaction's start undo record pointer
-                                                                        * in the previous log. */
-       UndoRecPtr      prevlog_last_urp;       /* Transaction's last undo record pointer in
-                                                                        * the previous log. */
 } UndoLogUnloggedMetaData;
 
 /*
@@ -241,6 +231,16 @@ typedef struct UndoLogMetaData
        UndoLogStatus status;
        UndoLogOffset end;                              /* one past end of highest segment */
        UndoLogOffset discard;                  /* oldest data needed (tail) */
+
+       /*
+        * Below two variable are used during recovery when transaction's undo
+        * records are split across undo logs.  Replay of switch will restore
+        * these two undo record pointers which will be reset on next allocation
+        * during recovery. */
+       UndoRecPtr      prevlog_xact_start; /* Transaction's start undo record pointer
+                                                                        * in the previous log. */
+       UndoRecPtr      prevlog_last_urp;       /* Transaction's last undo record pointer in
+                                                                        * the previous log. */
 } UndoLogMetaData;
 
 /*