Make the found-a-buffer-when-we-were-expecting-to-extend-the-rel path
authorTom Lane <tgl@sss.pgh.pa.us>
Mon, 2 Jul 2001 18:47:18 +0000 (18:47 +0000)
committerTom Lane <tgl@sss.pgh.pa.us>
Mon, 2 Jul 2001 18:47:18 +0000 (18:47 +0000)
actually work.  It had been throwing an Assert as of my recent changes
to bufmgr.c, but was not really right even before that AFAICT.

src/backend/storage/buffer/bufmgr.c

index 85afa46ce3bf19e6abc9bd52c7e0d5ce9b272a36..6090e729c0479719386342eb1a7f9a9c5fb32356 100644 (file)
@@ -8,7 +8,7 @@
  *
  *
  * IDENTIFICATION
- *   $Header: /cvsroot/pgsql/src/backend/storage/buffer/bufmgr.c,v 1.114 2001/06/29 21:08:24 tgl Exp $
+ *   $Header: /cvsroot/pgsql/src/backend/storage/buffer/bufmgr.c,v 1.115 2001/07/02 18:47:18 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -198,13 +198,22 @@ ReadBufferInternal(Relation reln, BlockNumber blockNum,
    /* if it's already in the buffer pool, we're done */
    if (found)
    {
-       /*
-        * Could have found && isExtend if a buffer was already created for
-        * the next page position, but then smgrextend failed to write
-        * the page.  Must fall through and try to extend file again.
-        */
+       /* That is, we're done if we expected to be able to find it ... */
        if (!isExtend)
            return BufferDescriptorGetBuffer(bufHdr);
+       /*
+        * If we found a buffer when we were expecting to extend the relation,
+        * the implication is that a buffer was already created for the next
+        * page position, but then smgrextend failed to write the page.
+        * We'd better try the smgrextend again.  But since BufferAlloc
+        * won't have done StartBufferIO, we must do that first.
+        */
+       if (!isLocalBuf)
+       {
+           SpinAcquire(BufMgrLock);
+           StartBufferIO(bufHdr, false);
+           SpinRelease(BufMgrLock);
+       }
    }
 
    /*