Skip to content

Commit f744262

Browse files
committed
Move call of MarkBufferDirty() before XLogInsert() as required.
Many thanks to Heikki Linnakangas <heikki@enterprisedb.com> for his sharp eyes.
1 parent 4c0fe51 commit f744262

File tree

3 files changed

+25
-18
lines changed

3 files changed

+25
-18
lines changed

src/backend/access/gin/ginbtree.c

Lines changed: 12 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
* Portions Copyright (c) 1994, Regents of the University of California
99
*
1010
* IDENTIFICATION
11-
* $PostgreSQL: pgsql/src/backend/access/gin/ginbtree.c,v 1.8 2007/02/01 04:16:07 neilc Exp $
11+
* $PostgreSQL: pgsql/src/backend/access/gin/ginbtree.c,v 1.9 2007/06/05 12:47:49 teodor Exp $
1212
*-------------------------------------------------------------------------
1313
*/
1414

@@ -294,6 +294,8 @@ ginInsertValue(GinBtree btree, GinBtreeStack *stack)
294294
START_CRIT_SECTION();
295295
btree->placeToPage(btree, stack->buffer, stack->off, &rdata);
296296

297+
MarkBufferDirty(stack->buffer);
298+
297299
if (!btree->index->rd_istemp)
298300
{
299301
XLogRecPtr recptr;
@@ -303,7 +305,6 @@ ginInsertValue(GinBtree btree, GinBtreeStack *stack)
303305
PageSetTLI(page, ThisTimeLineID);
304306
}
305307

306-
MarkBufferDirty(stack->buffer);
307308
UnlockReleaseBuffer(stack->buffer);
308309
END_CRIT_SECTION();
309310

@@ -351,6 +352,11 @@ ginInsertValue(GinBtree btree, GinBtreeStack *stack)
351352
GinInitBuffer(stack->buffer, GinPageGetOpaque(newlpage)->flags & ~GIN_LEAF);
352353
PageRestoreTempPage(newlpage, lpage);
353354
btree->fillRoot(btree, stack->buffer, lbuffer, rbuffer);
355+
356+
MarkBufferDirty(rbuffer);
357+
MarkBufferDirty(lbuffer);
358+
MarkBufferDirty(stack->buffer);
359+
354360
if (!btree->index->rd_istemp)
355361
{
356362
XLogRecPtr recptr;
@@ -364,11 +370,8 @@ ginInsertValue(GinBtree btree, GinBtreeStack *stack)
364370
PageSetTLI(rpage, ThisTimeLineID);
365371
}
366372

367-
MarkBufferDirty(rbuffer);
368373
UnlockReleaseBuffer(rbuffer);
369-
MarkBufferDirty(lbuffer);
370374
UnlockReleaseBuffer(lbuffer);
371-
MarkBufferDirty(stack->buffer);
372375
UnlockReleaseBuffer(stack->buffer);
373376

374377
END_CRIT_SECTION();
@@ -389,6 +392,10 @@ ginInsertValue(GinBtree btree, GinBtreeStack *stack)
389392

390393
START_CRIT_SECTION();
391394
PageRestoreTempPage(newlpage, lpage);
395+
396+
MarkBufferDirty(rbuffer);
397+
MarkBufferDirty(stack->buffer);
398+
392399
if (!btree->index->rd_istemp)
393400
{
394401
XLogRecPtr recptr;
@@ -399,9 +406,7 @@ ginInsertValue(GinBtree btree, GinBtreeStack *stack)
399406
PageSetLSN(rpage, recptr);
400407
PageSetTLI(rpage, ThisTimeLineID);
401408
}
402-
MarkBufferDirty(rbuffer);
403409
UnlockReleaseBuffer(rbuffer);
404-
MarkBufferDirty(stack->buffer);
405410
END_CRIT_SECTION();
406411
}
407412
}

src/backend/access/gin/gininsert.c

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
* Portions Copyright (c) 1994, Regents of the University of California
99
*
1010
* IDENTIFICATION
11-
* $PostgreSQL: pgsql/src/backend/access/gin/gininsert.c,v 1.8 2007/02/01 04:16:08 neilc Exp $
11+
* $PostgreSQL: pgsql/src/backend/access/gin/gininsert.c,v 1.9 2007/06/05 12:47:49 teodor Exp $
1212
*-------------------------------------------------------------------------
1313
*/
1414

@@ -48,6 +48,8 @@ createPostingTree(Relation index, ItemPointerData *items, uint32 nitems)
4848
memcpy(GinDataPageGetData(page), items, sizeof(ItemPointerData) * nitems);
4949
GinPageGetOpaque(page)->maxoff = nitems;
5050

51+
MarkBufferDirty(buffer);
52+
5153
if (!index->rd_istemp)
5254
{
5355
XLogRecPtr recptr;
@@ -76,7 +78,6 @@ createPostingTree(Relation index, ItemPointerData *items, uint32 nitems)
7678

7779
}
7880

79-
MarkBufferDirty(buffer);
8081
UnlockReleaseBuffer(buffer);
8182

8283
END_CRIT_SECTION();
@@ -281,6 +282,8 @@ ginbuild(PG_FUNCTION_ARGS)
281282
buffer = GinNewBuffer(index);
282283
START_CRIT_SECTION();
283284
GinInitBuffer(buffer, GIN_LEAF);
285+
MarkBufferDirty(buffer);
286+
284287
if (!index->rd_istemp)
285288
{
286289
XLogRecPtr recptr;
@@ -301,7 +304,6 @@ ginbuild(PG_FUNCTION_ARGS)
301304

302305
}
303306

304-
MarkBufferDirty(buffer);
305307
UnlockReleaseBuffer(buffer);
306308
END_CRIT_SECTION();
307309

src/backend/access/gin/ginvacuum.c

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
* Portions Copyright (c) 1994, Regents of the University of California
99
*
1010
* IDENTIFICATION
11-
* $PostgreSQL: pgsql/src/backend/access/gin/ginvacuum.c,v 1.14 2007/06/04 15:56:28 teodor Exp $
11+
* $PostgreSQL: pgsql/src/backend/access/gin/ginvacuum.c,v 1.15 2007/06/05 12:47:49 teodor Exp $
1212
*-------------------------------------------------------------------------
1313
*/
1414

@@ -191,9 +191,9 @@ ginVacuumPostingTreeLeaves(GinVacuumState *gvs, BlockNumber blkno, bool isRoot,
191191
pfree(cleaned);
192192
GinPageGetOpaque(page)->maxoff = newMaxOff;
193193

194+
MarkBufferDirty(buffer);
194195
xlogVacuumPage(gvs->index, buffer);
195196

196-
MarkBufferDirty(buffer);
197197
END_CRIT_SECTION();
198198

199199
/* if root is a leaf page, we don't desire further processing */
@@ -282,6 +282,11 @@ ginDeletePage(GinVacuumState *gvs, BlockNumber deleteBlkno, BlockNumber leftBlkn
282282
*/
283283
GinPageGetOpaque(page)->flags = GIN_DELETED;
284284

285+
MarkBufferDirty(pBuffer);
286+
if (leftBlkno != InvalidBlockNumber)
287+
MarkBufferDirty(lBuffer);
288+
MarkBufferDirty(dBuffer);
289+
285290
if (!gvs->index->rd_istemp)
286291
{
287292
XLogRecPtr recptr;
@@ -339,18 +344,13 @@ ginDeletePage(GinVacuumState *gvs, BlockNumber deleteBlkno, BlockNumber leftBlkn
339344
}
340345
}
341346

342-
MarkBufferDirty(pBuffer);
343347
if (!isParentRoot)
344348
LockBuffer(pBuffer, GIN_UNLOCK);
345349
ReleaseBuffer(pBuffer);
346350

347351
if (leftBlkno != InvalidBlockNumber)
348-
{
349-
MarkBufferDirty(lBuffer);
350352
UnlockReleaseBuffer(lBuffer);
351-
}
352353

353-
MarkBufferDirty(dBuffer);
354354
UnlockReleaseBuffer(dBuffer);
355355

356356
END_CRIT_SECTION();
@@ -636,8 +636,8 @@ ginbulkdelete(PG_FUNCTION_ARGS)
636636
{
637637
START_CRIT_SECTION();
638638
PageRestoreTempPage(resPage, page);
639-
xlogVacuumPage(gvs.index, buffer);
640639
MarkBufferDirty(buffer);
640+
xlogVacuumPage(gvs.index, buffer);
641641
UnlockReleaseBuffer(buffer);
642642
END_CRIT_SECTION();
643643
}

0 commit comments

Comments
 (0)