]> granicus.if.org Git - postgresql/commitdiff
Fix incorrect initialization of ProcGlobal->startupBufferPinWaitBufId.
authorTom Lane <tgl@sss.pgh.pa.us>
Tue, 2 Aug 2011 17:23:52 +0000 (13:23 -0400)
committerTom Lane <tgl@sss.pgh.pa.us>
Tue, 2 Aug 2011 17:23:52 +0000 (13:23 -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 5420dbe61a1786574f765bb8135177495a5076ed..4c7cfb0b404cb63f8f2d300397763c2cecbe97ae 100644 (file)
@@ -2449,10 +2449,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 f9b3028cfea45dd6b55d50220010fd513ec038de..106625d87afd3e3bcb71f3ac7aa45a7127c669ea 100644 (file)
@@ -171,6 +171,9 @@ InitProcGlobal(void)
        ProcGlobal->spins_per_delay = DEFAULT_SPINS_PER_DELAY;
        ProcGlobal->freeProcs = NULL;
        ProcGlobal->autovacFreeProcs = NULL;
+       ProcGlobal->startupProc = NULL;
+       ProcGlobal->startupProcPid = 0;
+       ProcGlobal->startupBufferPinWaitBufId = -1;
 
        /*
         * Create and initialize all the PGPROC structures we'll need (except for
@@ -493,7 +496,6 @@ PublishStartupProcessInformation(void)
 
        procglobal->startupProc = MyProc;
        procglobal->startupProcPid = MyProcPid;
-       procglobal->startupBufferPinWaitBufId = 0;
 
        SpinLockRelease(ProcStructLock);
 }
@@ -520,14 +522,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 09ac3cf967b88872a0205cdc1c030881567cb58e..92b3b19f2d6af627b081f77d2b2fae6ac775ff5b 100644 (file)
@@ -178,7 +178,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;