Fix incorrect initialization of ProcGlobal->startupBufferPinWaitBufId.
authorTom Lane <tgl@sss.pgh.pa.us>
Tue, 2 Aug 2011 17:24:06 +0000 (13:24 -0400)
committerTom Lane <tgl@sss.pgh.pa.us>
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;