LockBuffer should not elog while holding buffer's cntx_lock.
authorTom Lane <tgl@sss.pgh.pa.us>
Mon, 8 Jan 2001 18:31:49 +0000 (18:31 +0000)
committerTom Lane <tgl@sss.pgh.pa.us>
Mon, 8 Jan 2001 18:31:49 +0000 (18:31 +0000)
src/backend/storage/buffer/bufmgr.c

index d97ddfdbff449210a2c0f260f895697be8a6d201..6ba74f5e06c73e94d5cc04cd812d6c673871cc73 100644 (file)
@@ -8,7 +8,7 @@
  *
  *
  * IDENTIFICATION
- *   $Header: /cvsroot/pgsql/src/backend/storage/buffer/bufmgr.c,v 1.101 2000/12/29 21:31:21 tgl Exp $
+ *   $Header: /cvsroot/pgsql/src/backend/storage/buffer/bufmgr.c,v 1.102 2001/01/08 18:31:49 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -1977,7 +1977,10 @@ LockBuffer(Buffer buffer, int mode)
            *buflock &= ~BL_W_LOCK;
        }
        else
+       {
+           S_UNLOCK(&(buf->cntx_lock));
            elog(ERROR, "UNLockBuffer: buffer %lu is not locked", buffer);
+       }
    }
    else if (mode == BUFFER_LOCK_SHARE)
    {
@@ -2033,7 +2036,10 @@ LockBuffer(Buffer buffer, int mode)
        }
    }
    else
+   {
+       S_UNLOCK(&(buf->cntx_lock));
        elog(ERROR, "LockBuffer: unknown lock mode %d", mode);
+   }
 
    S_UNLOCK(&(buf->cntx_lock));
 }
@@ -2122,11 +2128,11 @@ InitBufferIO(void)
 #endif
 
 /*
+ * Clean up any active buffer I/O after an error.
  * This function is called from ProcReleaseSpins().
  * BufMgrLock isn't held when this function is called.
- * BM_IO_ERROR is always set. If BM_IO_ERROR was already
- * set in case of output,this routine would kill all
- * backends and reset postmaster.
+ *
+ * If I/O was in progress, BM_IO_ERROR is always set.
  */
 void
 AbortBufferIO(void)
@@ -2142,6 +2148,7 @@ AbortBufferIO(void)
        else
        {
            Assert(buf->flags & BM_DIRTY || buf->cntxDirty);
+           /* Issue notice if this is not the first failure... */
            if (buf->flags & BM_IO_ERROR)
            {
                elog(NOTICE, "write error may be permanent: cannot write block %u for %s/%s",