Remove NEXTXID xlog record type to avoid three-way deadlock risk.
authorTom Lane <[email protected]>
Sun, 18 Mar 2001 20:18:59 +0000 (20:18 +0000)
committerTom Lane <[email protected]>
Sun, 18 Mar 2001 20:18:59 +0000 (20:18 +0000)
NEXTXID isn't really necessary, per previous discussion in pghackers,
but I mulishy insisted we should put it in anyway.  Mea culpa.

src/backend/access/transam/transam.c
src/backend/access/transam/varsup.c
src/backend/access/transam/xlog.c
src/backend/storage/ipc/sinval.c
src/include/access/transam.h
src/include/access/xlog.h
src/include/catalog/pg_control.h

index cc3569cbea32a7428bc83d7d2cc78354af66f9a5..9b2e73b16b327373d20abfbf70abf5ffb88e89b8 100644 (file)
@@ -430,7 +430,6 @@ InitializeTransactionLog(void)
                Assert(!IsUnderPostmaster && 
                                ShmemVariableCache->nextXid <= FirstTransactionId);
                ShmemVariableCache->nextXid = FirstTransactionId;
-               ShmemVariableCache->xidCount = 0; /* force an XLOG rec right away */
        }
        else if (RecoveryCheckingEnabled())
        {
index 0007438ab2c3d170bcd9760404d41505aace5681..0e72962f46552542bc1312e245a8a0292fd4b908 100644 (file)
@@ -44,17 +44,9 @@ GetNewTransactionId(TransactionId *xid)
 
        SpinAcquire(XidGenLockId);
 
-       /* If we run out of logged for use xids then we must log more */
-       if (ShmemVariableCache->xidCount == 0)
-       {
-               XLogPutNextXid(ShmemVariableCache->nextXid + VAR_XID_PREFETCH);
-               ShmemVariableCache->xidCount = VAR_XID_PREFETCH;
-       }
-
        *xid = ShmemVariableCache->nextXid;
 
        (ShmemVariableCache->nextXid)++;
-       (ShmemVariableCache->xidCount)--;
 
        SpinRelease(XidGenLockId);
 
index 7558795e8be037ccdba2684566f15aea97402ba0..683136110bb256d23120d8f52febcfb8b900195a 100644 (file)
@@ -2161,7 +2161,6 @@ BootStrapXLOG(void)
        checkPoint.time = time(NULL);
 
        ShmemVariableCache->nextXid = checkPoint.nextXid;
-       ShmemVariableCache->xidCount = 0;
        ShmemVariableCache->nextOid = checkPoint.nextOid;
        ShmemVariableCache->oidCount = 0;
 
@@ -2317,7 +2316,6 @@ StartupXLOG(void)
                elog(STOP, "Invalid NextTransactionId/NextOid");
 
        ShmemVariableCache->nextXid = checkPoint.nextXid;
-       ShmemVariableCache->xidCount = 0;
        ShmemVariableCache->nextOid = checkPoint.nextOid;
        ShmemVariableCache->oidCount = 0;
 
@@ -2368,11 +2366,7 @@ StartupXLOG(void)
                        do
                        {
                                if (record->xl_xid >= ShmemVariableCache->nextXid)
-                               {
-                                       /* This probably shouldn't happen... */
                                        ShmemVariableCache->nextXid = record->xl_xid + 1;
-                                       ShmemVariableCache->xidCount = 0;
-                               }
                                if (XLOG_DEBUG)
                                {
                                        char    buf[8192];
@@ -2717,8 +2711,6 @@ CreateCheckPoint(bool shutdown)
 
        SpinAcquire(XidGenLockId);
        checkPoint.nextXid = ShmemVariableCache->nextXid;
-       if (!shutdown)
-               checkPoint.nextXid += ShmemVariableCache->xidCount;
        SpinRelease(XidGenLockId);
 
        SpinAcquire(OidGenLockId);
@@ -2803,21 +2795,6 @@ CreateCheckPoint(bool shutdown)
        END_CRIT_SECTION();
 }
 
-/*
- * Write a NEXTXID log record
- */
-void
-XLogPutNextXid(TransactionId nextXid)
-{
-       XLogRecData             rdata;
-
-       rdata.buffer = InvalidBuffer;
-       rdata.data = (char *)(&nextXid);
-       rdata.len = sizeof(TransactionId);
-       rdata.next = NULL;
-       (void) XLogInsert(RM_XLOG_ID, XLOG_NEXTXID, &rdata);
-}
-
 /*
  * Write a NEXTOID log record
  */
@@ -2841,18 +2818,7 @@ xlog_redo(XLogRecPtr lsn, XLogRecord *record)
 {
        uint8   info = record->xl_info & ~XLR_INFO_MASK;
 
-       if (info == XLOG_NEXTXID)
-       {
-               TransactionId           nextXid;
-
-               memcpy(&nextXid, XLogRecGetData(record), sizeof(TransactionId));
-               if (ShmemVariableCache->nextXid < nextXid)
-               {
-                       ShmemVariableCache->nextXid = nextXid;
-                       ShmemVariableCache->xidCount = 0;
-               }
-       }
-       else if (info == XLOG_NEXTOID)
+       if (info == XLOG_NEXTOID)
        {
                Oid             nextOid;
 
@@ -2870,7 +2836,6 @@ xlog_redo(XLogRecPtr lsn, XLogRecord *record)
                memcpy(&checkPoint, XLogRecGetData(record), sizeof(CheckPoint));
                /* In a SHUTDOWN checkpoint, believe the counters exactly */
                ShmemVariableCache->nextXid = checkPoint.nextXid;
-               ShmemVariableCache->xidCount = 0;
                ShmemVariableCache->nextOid = checkPoint.nextOid;
                ShmemVariableCache->oidCount = 0;
        }
@@ -2879,11 +2844,10 @@ xlog_redo(XLogRecPtr lsn, XLogRecord *record)
                CheckPoint      checkPoint;
 
                memcpy(&checkPoint, XLogRecGetData(record), sizeof(CheckPoint));
-               /* In an ONLINE checkpoint, treat the counters like NEXTXID/NEXTOID */
+               /* In an ONLINE checkpoint, treat the counters like NEXTOID */
                if (ShmemVariableCache->nextXid < checkPoint.nextXid)
                {
                        ShmemVariableCache->nextXid = checkPoint.nextXid;
-                       ShmemVariableCache->xidCount = 0;
                }
                if (ShmemVariableCache->nextOid < checkPoint.nextOid)
                {
@@ -2915,13 +2879,6 @@ xlog_desc(char *buf, uint8 xl_info, char* rec)
                        checkpoint->nextOid,
                        (info == XLOG_CHECKPOINT_SHUTDOWN) ? "shutdown" : "online");
        }
-       else if (info == XLOG_NEXTXID)
-       {
-               TransactionId           nextXid;
-
-               memcpy(&nextXid, rec, sizeof(TransactionId));
-               sprintf(buf + strlen(buf), "nextXid: %u", nextXid);
-       }
        else if (info == XLOG_NEXTOID)
        {
                Oid             nextOid;
index 52432dd25f21beb00a0d04dd20565381fcf1c3e3..7afc532164a4a9a983c5dfaf51e40dd33434a27f 100644 (file)
@@ -296,7 +296,7 @@ GetSnapshotData(bool serializable)
        /*
         * Unfortunately, we have to call ReadNewTransactionId() after
         * acquiring SInvalLock above. It's not good because
-        * ReadNewTransactionId() does SpinAcquire(OidGenLockId) but
+        * ReadNewTransactionId() does SpinAcquire(XidGenLockId) but
         * _necessary_.
         */
        ReadNewTransactionId(&(snapshot->xmax));
index a3d54dfd11c1af2bf09b1f1fde1b280d709bb72c..822e93b7b7ec6776b8fd60fade74fe37a8d5eefe 100644 (file)
@@ -129,9 +129,8 @@ typedef VariableRelationContentsData *VariableRelationContents;
 typedef struct VariableCacheData
 {
        TransactionId   nextXid;        /* next XID to assign */
-       uint32                  xidCount;       /* XIDs available before must do XLOG work */
-       Oid                             nextOid;        /* and similarly for OIDs */
-       uint32                  oidCount;
+       Oid                             nextOid;        /* next OID to assign */
+       uint32                  oidCount;       /* OIDs available before must do XLOG work */
 } VariableCacheData;
 
 typedef VariableCacheData *VariableCache;
index 218d725595490d98e53b9c1c23b5de56ac17b714..83bfc2b2b5757234ff4ce6f7abbb74ca64191619 100644 (file)
@@ -201,7 +201,6 @@ extern void StartupXLOG(void);
 extern void ShutdownXLOG(void);
 extern void CreateCheckPoint(bool shutdown);
 extern void SetThisStartUpID(void);
-extern void XLogPutNextXid(TransactionId nextXid);
 extern void XLogPutNextOid(Oid nextOid);
 extern void SetRedoRecPtr(void);
 extern void GetRedoRecPtr(void);
index fa6f2dfe9b6f189563504a32bc048c3f2c13e732..113b47dc25ffa8fc61f761047bdb35007e6709f6 100644 (file)
@@ -45,7 +45,6 @@ typedef struct CheckPoint
 /* XLOG info values for XLOG rmgr */
 #define XLOG_CHECKPOINT_SHUTDOWN               0x00
 #define XLOG_CHECKPOINT_ONLINE                 0x10
-#define XLOG_NEXTXID                                   0x20
 #define XLOG_NEXTOID                                   0x30