OSDN Git Service

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 85afa46..6090e72 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);
+               }
        }
 
        /*