Fix incorrect initialization of ProcGlobal->startupBufferPinWaitBufId.
authorTom Lane
Tue, 2 Aug 2011 17:24:06 +0000 (13:24 -0400)
committerTom Lane
Tue, 2 Aug 2011 17:24:06 +0000 (13:24 -0400)
It was initialized in the wrong place and to the wrong value.  With bad
luck this could result in incorrect query-cancellation failures in hot
standby sessions, should a HS backend be holding pin on buffer number 1
while trying to acquire a lock.

src/backend/storage/buffer/bufmgr.c
src/backend/storage/lmgr/proc.c
src/include/storage/proc.h

index 3b6938135aca02ab4baa6bbedb8509c2522e9955..8a66896b5cfea03d557272336085db03cf9cc113 100644 (file)
@@ -2422,10 +2422,11 @@ LockBufferForCleanup(Buffer buffer)
        /* Wait to be signaled by UnpinBuffer() */
        if (InHotStandby)
        {
-           /* Share the bufid that Startup process waits on */
+           /* Publish the bufid that Startup process waits on */
            SetStartupBufferPinWaitBufId(buffer - 1);
            /* Set alarm and then wait to be signaled by UnpinBuffer() */
            ResolveRecoveryConflictWithBufferPin();
+           /* Reset the published bufid */
            SetStartupBufferPinWaitBufId(-1);
        }
        else
index c9993a79dbacc8cebd1d96f63a2eb599d0f10eea..2608fea94510d141210745f8c5d7fcd9df16c02e 100644 (file)
@@ -179,6 +179,9 @@ InitProcGlobal(void)
     */
    ProcGlobal->freeProcs = NULL;
    ProcGlobal->autovacFreeProcs = NULL;
+   ProcGlobal->startupProc = NULL;
+   ProcGlobal->startupProcPid = 0;
+   ProcGlobal->startupBufferPinWaitBufId = -1;
 
    ProcGlobal->spins_per_delay = DEFAULT_SPINS_PER_DELAY;
 
@@ -487,7 +490,6 @@ PublishStartupProcessInformation(void)
 
    procglobal->startupProc = MyProc;
    procglobal->startupProcPid = MyProcPid;
-   procglobal->startupBufferPinWaitBufId = 0;
 
    SpinLockRelease(ProcStructLock);
 }
@@ -514,14 +516,10 @@ SetStartupBufferPinWaitBufId(int bufid)
 int
 GetStartupBufferPinWaitBufId(void)
 {
-   int         bufid;
-
    /* use volatile pointer to prevent code rearrangement */
    volatile PROC_HDR *procglobal = ProcGlobal;
 
-   bufid = procglobal->startupBufferPinWaitBufId;
-
-   return bufid;
+   return procglobal->startupBufferPinWaitBufId;
 }
 
 /*
index f77c4d3fc2917b70e9dbdf9d34ce059af32550fa..fe35db13dc3ba79ef2d58af03fd27d111c03be97 100644 (file)
@@ -145,7 +145,7 @@ typedef struct PROC_HDR
    /* The proc of the Startup process, since not in ProcArray */
    PGPROC     *startupProc;
    int         startupProcPid;
-   /* Buffer id of the buffer that Startup process waits for pin on */
+   /* Buffer id of the buffer that Startup process waits for pin on, or -1 */
    int         startupBufferPinWaitBufId;
 } PROC_HDR;