]> granicus.if.org Git - postgresql/commitdiff
Hope that this is valid localbuf.c version
authorVadim B. Mikheev <vadim4o@yahoo.com>
Thu, 30 Nov 2000 19:03:26 +0000 (19:03 +0000)
committerVadim B. Mikheev <vadim4o@yahoo.com>
Thu, 30 Nov 2000 19:03:26 +0000 (19:03 +0000)
src/backend/storage/buffer/bufmgr.c
src/backend/storage/buffer/localbuf.c

index 9400da3805816719e32265dd2e9f430bd66e3656..7978924553c44260fe4d3fd644eb4ed6eb909153 100644 (file)
@@ -1,6 +1,6 @@
 /*-------------------------------------------------------------------------
  *
- * xlog_bufmgr.c
+ * bufmgr.c
  *       buffer manager interface routines
  *
  * Portions Copyright (c) 1996-2000, PostgreSQL, Inc
@@ -8,7 +8,7 @@
  *
  *
  * IDENTIFICATION
- *       $Header: /cvsroot/pgsql/src/backend/storage/buffer/bufmgr.c,v 1.97 2000/11/30 08:46:23 vadim Exp $
+ *       $Header: /cvsroot/pgsql/src/backend/storage/buffer/bufmgr.c,v 1.98 2000/11/30 19:03:25 vadim Exp $
  *
  *-------------------------------------------------------------------------
  */
index 828523c0b302816f4cbfdcf8f9ac5975e7551d19..1fc704c7221799df3d94db8deaedcf65001a83b8 100644 (file)
  * Portions Copyright (c) 1996-2000, PostgreSQL, Inc
  * Portions Copyright (c) 1994-5, Regents of the University of California
  *
- *
- * IDENTIFICATION
- *       $Header: /cvsroot/pgsql/src/backend/storage/buffer/localbuf.c,v 1.36 2000/11/30 01:39:07 tgl Exp $
- *
  *-------------------------------------------------------------------------
  */
-   
 #include "postgres.h"
 
-#ifdef XLOG
-#include "xlog_localbuf.c"
-#else
-
 #include <sys/types.h>
 #include <sys/file.h>
 #include <math.h>
@@ -109,7 +100,7 @@ LocalBufferAlloc(Relation reln, BlockNumber blockNum, bool *foundPtr)
         * transaction to touch it doesn't need its contents but has not
         * flushed it).  if that's the case, write it out before reusing it!
         */
-       if (bufHdr->flags & BM_DIRTY)
+       if (bufHdr->flags & BM_DIRTY || bufHdr->cntxDirty)
        {
                Relation        bufrel = RelationNodeCacheGetRelation(bufHdr->tag.rnode);
 
@@ -136,6 +127,7 @@ LocalBufferAlloc(Relation reln, BlockNumber blockNum, bool *foundPtr)
        bufHdr->tag.rnode = reln->rd_node;
        bufHdr->tag.blockNum = blockNum;
        bufHdr->flags &= ~BM_DIRTY;
+       bufHdr->cntxDirty = false;
 
        /*
         * lazy memory allocation: allocate space on first use of a buffer.
@@ -189,50 +181,6 @@ WriteLocalBuffer(Buffer buffer, bool release)
        return true;
 }
 
-/*
- * FlushLocalBuffer -
- *       flushes a local buffer
- */
-int
-FlushLocalBuffer(Buffer buffer, bool sync, bool release)
-{
-       int                     bufid;
-       Relation        bufrel;
-       BufferDesc *bufHdr;
-
-       Assert(BufferIsLocal(buffer));
-
-#ifdef LBDEBUG
-       fprintf(stderr, "LB FLUSH %d\n", buffer);
-#endif
-
-       bufid = -(buffer + 1);
-       bufHdr = &LocalBufferDescriptors[bufid];
-       bufHdr->flags &= ~BM_DIRTY;
-       bufrel = RelationNodeCacheGetRelation(bufHdr->tag.rnode);
-       Assert(bufrel != NULL);
-
-       if (sync)
-               smgrflush(DEFAULT_SMGR, bufrel, bufHdr->tag.blockNum,
-                                 (char *) MAKE_PTR(bufHdr->data));
-       else
-               smgrwrite(DEFAULT_SMGR, bufrel, bufHdr->tag.blockNum,
-                                 (char *) MAKE_PTR(bufHdr->data));
-
-       LocalBufferFlushCount++;
-
-       /* drop relcache refcount incremented by RelationNodeCacheGetRelation */
-       RelationDecrementReferenceCount(bufrel);
-
-       if (release)
-       {
-               Assert(LocalRefCount[bufid] > 0);
-               LocalRefCount[bufid]--;
-       }
-
-       return true;
-}
-
 /*
  * InitLocalBuffer -
  *       init the local buffer cache. Since most queries (esp. multi-user ones)
@@ -273,6 +221,9 @@ InitLocalBuffer(void)
  * Flush all dirty buffers in the local buffer cache at commit time.
  * Since the buffer cache is only used for keeping relations visible
  * during a transaction, we will not need these buffers again.
+ *
+ * Note that we have to *flush* local buffers because of them are not
+ * visible to checkpoint makers. But we can skip XLOG flush check.
  */
 void
 LocalBufferSync(void)
@@ -284,7 +235,7 @@ LocalBufferSync(void)
                BufferDesc *buf = &LocalBufferDescriptors[i];
                Relation        bufrel;
 
-               if (buf->flags & BM_DIRTY)
+               if (buf->flags & BM_DIRTY || buf->cntxDirty)
                {
 #ifdef LBDEBUG
                        fprintf(stderr, "LB SYNC %d\n", -i - 1);
@@ -295,12 +246,14 @@ LocalBufferSync(void)
 
                        smgrwrite(DEFAULT_SMGR, bufrel, buf->tag.blockNum,
                                          (char *) MAKE_PTR(buf->data));
+                       smgrmarkdirty(DEFAULT_SMGR, bufrel, buf->tag.blockNum);
                        LocalBufferFlushCount++;
 
                        /* drop relcache refcount from RelationIdCacheGetRelation */
                        RelationDecrementReferenceCount(bufrel);
 
                        buf->flags &= ~BM_DIRTY;
+                       buf->cntxDirty = false;
                }
        }
 
@@ -319,10 +272,9 @@ ResetLocalBufferPool(void)
 
                buf->tag.rnode.relNode = InvalidOid;
                buf->flags &= ~BM_DIRTY;
+               buf->cntxDirty = false;
        }
 
        MemSet(LocalRefCount, 0, sizeof(long) * NLocBuffer);
        nextFreeLocalBuf = 0;
 }
-
-#endif /* XLOG */