]> granicus.if.org Git - postgresql/commitdiff
Move call of MarkBufferDirty() before XLogInsert() as required.
authorTeodor Sigaev <teodor@sigaev.ru>
Tue, 5 Jun 2007 12:47:49 +0000 (12:47 +0000)
committerTeodor Sigaev <teodor@sigaev.ru>
Tue, 5 Jun 2007 12:47:49 +0000 (12:47 +0000)
Many thanks to Heikki Linnakangas <heikki@enterprisedb.com> for his
sharp eyes.

src/backend/access/gin/ginbtree.c
src/backend/access/gin/gininsert.c
src/backend/access/gin/ginvacuum.c

index 854a358682782aac445419edc79db30bd1dfab31..1a711e93c645688abbe192420da29f47c28b4e5e 100644 (file)
@@ -8,7 +8,7 @@
  * Portions Copyright (c) 1994, Regents of the University of California
  *
  * IDENTIFICATION
- *                     $PostgreSQL: pgsql/src/backend/access/gin/ginbtree.c,v 1.8 2007/02/01 04:16:07 neilc Exp $
+ *                     $PostgreSQL: pgsql/src/backend/access/gin/ginbtree.c,v 1.9 2007/06/05 12:47:49 teodor Exp $
  *-------------------------------------------------------------------------
  */
 
@@ -294,6 +294,8 @@ ginInsertValue(GinBtree btree, GinBtreeStack *stack)
                        START_CRIT_SECTION();
                        btree->placeToPage(btree, stack->buffer, stack->off, &rdata);
 
+                       MarkBufferDirty(stack->buffer);
+
                        if (!btree->index->rd_istemp)
                        {
                                XLogRecPtr      recptr;
@@ -303,7 +305,6 @@ ginInsertValue(GinBtree btree, GinBtreeStack *stack)
                                PageSetTLI(page, ThisTimeLineID);
                        }
 
-                       MarkBufferDirty(stack->buffer);
                        UnlockReleaseBuffer(stack->buffer);
                        END_CRIT_SECTION();
 
@@ -351,6 +352,11 @@ ginInsertValue(GinBtree btree, GinBtreeStack *stack)
                                GinInitBuffer(stack->buffer, GinPageGetOpaque(newlpage)->flags & ~GIN_LEAF);
                                PageRestoreTempPage(newlpage, lpage);
                                btree->fillRoot(btree, stack->buffer, lbuffer, rbuffer);
+
+                               MarkBufferDirty(rbuffer);
+                               MarkBufferDirty(lbuffer);
+                               MarkBufferDirty(stack->buffer);
+
                                if (!btree->index->rd_istemp)
                                {
                                        XLogRecPtr      recptr;
@@ -364,11 +370,8 @@ ginInsertValue(GinBtree btree, GinBtreeStack *stack)
                                        PageSetTLI(rpage, ThisTimeLineID);
                                }
 
-                               MarkBufferDirty(rbuffer);
                                UnlockReleaseBuffer(rbuffer);
-                               MarkBufferDirty(lbuffer);
                                UnlockReleaseBuffer(lbuffer);
-                               MarkBufferDirty(stack->buffer);
                                UnlockReleaseBuffer(stack->buffer);
 
                                END_CRIT_SECTION();
@@ -389,6 +392,10 @@ ginInsertValue(GinBtree btree, GinBtreeStack *stack)
 
                                START_CRIT_SECTION();
                                PageRestoreTempPage(newlpage, lpage);
+
+                               MarkBufferDirty(rbuffer);
+                               MarkBufferDirty(stack->buffer);
+
                                if (!btree->index->rd_istemp)
                                {
                                        XLogRecPtr      recptr;
@@ -399,9 +406,7 @@ ginInsertValue(GinBtree btree, GinBtreeStack *stack)
                                        PageSetLSN(rpage, recptr);
                                        PageSetTLI(rpage, ThisTimeLineID);
                                }
-                               MarkBufferDirty(rbuffer);
                                UnlockReleaseBuffer(rbuffer);
-                               MarkBufferDirty(stack->buffer);
                                END_CRIT_SECTION();
                        }
                }
index 1d4d57c0d4e0b02ff90a2dd094e83f3c3deb3fcf..db5fa68338ab414c1deabc79ed5e9fd2dc29d082 100644 (file)
@@ -8,7 +8,7 @@
  * Portions Copyright (c) 1994, Regents of the University of California
  *
  * IDENTIFICATION
- *                     $PostgreSQL: pgsql/src/backend/access/gin/gininsert.c,v 1.8 2007/02/01 04:16:08 neilc Exp $
+ *                     $PostgreSQL: pgsql/src/backend/access/gin/gininsert.c,v 1.9 2007/06/05 12:47:49 teodor Exp $
  *-------------------------------------------------------------------------
  */
 
@@ -48,6 +48,8 @@ createPostingTree(Relation index, ItemPointerData *items, uint32 nitems)
        memcpy(GinDataPageGetData(page), items, sizeof(ItemPointerData) * nitems);
        GinPageGetOpaque(page)->maxoff = nitems;
 
+       MarkBufferDirty(buffer);
+
        if (!index->rd_istemp)
        {
                XLogRecPtr      recptr;
@@ -76,7 +78,6 @@ createPostingTree(Relation index, ItemPointerData *items, uint32 nitems)
 
        }
 
-       MarkBufferDirty(buffer);
        UnlockReleaseBuffer(buffer);
 
        END_CRIT_SECTION();
@@ -281,6 +282,8 @@ ginbuild(PG_FUNCTION_ARGS)
        buffer = GinNewBuffer(index);
        START_CRIT_SECTION();
        GinInitBuffer(buffer, GIN_LEAF);
+       MarkBufferDirty(buffer);
+
        if (!index->rd_istemp)
        {
                XLogRecPtr      recptr;
@@ -301,7 +304,6 @@ ginbuild(PG_FUNCTION_ARGS)
 
        }
 
-       MarkBufferDirty(buffer);
        UnlockReleaseBuffer(buffer);
        END_CRIT_SECTION();
 
index 6174be35bf2313cf933c5255f4f67264bdc20a18..2a636762c0f24006f81bd7bd3e9619542fe7e4c0 100644 (file)
@@ -8,7 +8,7 @@
  * Portions Copyright (c) 1994, Regents of the University of California
  *
  * IDENTIFICATION
- *                     $PostgreSQL: pgsql/src/backend/access/gin/ginvacuum.c,v 1.14 2007/06/04 15:56:28 teodor Exp $
+ *                     $PostgreSQL: pgsql/src/backend/access/gin/ginvacuum.c,v 1.15 2007/06/05 12:47:49 teodor Exp $
  *-------------------------------------------------------------------------
  */
 
@@ -191,9 +191,9 @@ ginVacuumPostingTreeLeaves(GinVacuumState *gvs, BlockNumber blkno, bool isRoot,
                        pfree(cleaned);
                        GinPageGetOpaque(page)->maxoff = newMaxOff;
 
+                       MarkBufferDirty(buffer);
                        xlogVacuumPage(gvs->index, buffer);
 
-                       MarkBufferDirty(buffer);
                        END_CRIT_SECTION();
 
                        /* if root is a leaf page, we don't desire further processing */
@@ -282,6 +282,11 @@ ginDeletePage(GinVacuumState *gvs, BlockNumber deleteBlkno, BlockNumber leftBlkn
         */
        GinPageGetOpaque(page)->flags = GIN_DELETED;
 
+       MarkBufferDirty(pBuffer);
+       if (leftBlkno != InvalidBlockNumber)
+               MarkBufferDirty(lBuffer);
+       MarkBufferDirty(dBuffer);
+
        if (!gvs->index->rd_istemp)
        {
                XLogRecPtr      recptr;
@@ -339,18 +344,13 @@ ginDeletePage(GinVacuumState *gvs, BlockNumber deleteBlkno, BlockNumber leftBlkn
                }
        }
 
-       MarkBufferDirty(pBuffer);
        if (!isParentRoot)
                LockBuffer(pBuffer, GIN_UNLOCK);
        ReleaseBuffer(pBuffer);
 
        if (leftBlkno != InvalidBlockNumber)
-       {
-               MarkBufferDirty(lBuffer);
                UnlockReleaseBuffer(lBuffer);
-       }
 
-       MarkBufferDirty(dBuffer);
        UnlockReleaseBuffer(dBuffer);
 
        END_CRIT_SECTION();
@@ -636,8 +636,8 @@ ginbulkdelete(PG_FUNCTION_ARGS)
                {
                        START_CRIT_SECTION();
                        PageRestoreTempPage(resPage, page);
-                       xlogVacuumPage(gvs.index, buffer);
                        MarkBufferDirty(buffer);
+                       xlogVacuumPage(gvs.index, buffer);
                        UnlockReleaseBuffer(buffer);
                        END_CRIT_SECTION();
                }