diff options
Diffstat (limited to 'src/backend/access/heap/heapam.c')
-rw-r--r-- | src/backend/access/heap/heapam.c | 60 |
1 files changed, 30 insertions, 30 deletions
diff --git a/src/backend/access/heap/heapam.c b/src/backend/access/heap/heapam.c index 2e45c041a6b..0f04f845cf6 100644 --- a/src/backend/access/heap/heapam.c +++ b/src/backend/access/heap/heapam.c @@ -8,7 +8,7 @@ * * * IDENTIFICATION - * $PostgreSQL: pgsql/src/backend/access/heap/heapam.c,v 1.277 2009/06/11 14:48:53 momjian Exp $ + * $PostgreSQL: pgsql/src/backend/access/heap/heapam.c,v 1.277.2.1 2009/08/24 02:18:40 tgl Exp $ * * * INTERFACE ROUTINES @@ -78,7 +78,8 @@ static HeapScanDesc heap_beginscan_internal(Relation relation, bool allow_strat, bool allow_sync, bool is_bitmapscan); static XLogRecPtr log_heap_update(Relation reln, Buffer oldbuf, - ItemPointerData from, Buffer newbuf, HeapTuple newtup, bool move); + ItemPointerData from, Buffer newbuf, HeapTuple newtup, bool move, + bool all_visible_cleared, bool new_all_visible_cleared); static bool HeapSatisfiesHOTUpdate(Relation relation, Bitmapset *hot_attrs, HeapTuple oldtup, HeapTuple newtup); @@ -2760,21 +2761,29 @@ l2: /* record address of new tuple in t_ctid of old one */ oldtup.t_data->t_ctid = heaptup->t_self; + /* clear PD_ALL_VISIBLE flags */ + if (PageIsAllVisible(BufferGetPage(buffer))) + { + all_visible_cleared = true; + PageClearAllVisible(BufferGetPage(buffer)); + } + if (newbuf != buffer && PageIsAllVisible(BufferGetPage(newbuf))) + { + all_visible_cleared_new = true; + PageClearAllVisible(BufferGetPage(newbuf)); + } + if (newbuf != buffer) MarkBufferDirty(newbuf); MarkBufferDirty(buffer); - /* - * Note: we mustn't clear PD_ALL_VISIBLE flags before writing the WAL - * record, because log_heap_update looks at those flags to set the - * corresponding flags in the WAL record. - */ - /* XLOG stuff */ if (!relation->rd_istemp) { XLogRecPtr recptr = log_heap_update(relation, buffer, oldtup.t_self, - newbuf, heaptup, false); + newbuf, heaptup, false, + all_visible_cleared, + all_visible_cleared_new); if (newbuf != buffer) { @@ -2785,18 +2794,6 @@ l2: PageSetTLI(BufferGetPage(buffer), ThisTimeLineID); } - /* Clear PD_ALL_VISIBLE flags */ - if (PageIsAllVisible(BufferGetPage(buffer))) - { - all_visible_cleared = true; - PageClearAllVisible(BufferGetPage(buffer)); - } - if (newbuf != buffer && PageIsAllVisible(BufferGetPage(newbuf))) - { - all_visible_cleared_new = true; - PageClearAllVisible(BufferGetPage(newbuf)); - } - END_CRIT_SECTION(); if (newbuf != buffer) @@ -3910,7 +3907,8 @@ log_heap_freeze(Relation reln, Buffer buffer, */ static XLogRecPtr log_heap_update(Relation reln, Buffer oldbuf, ItemPointerData from, - Buffer newbuf, HeapTuple newtup, bool move) + Buffer newbuf, HeapTuple newtup, bool move, + bool all_visible_cleared, bool new_all_visible_cleared) { /* * Note: xlhdr is declared to have adequate size and correct alignment for @@ -3946,9 +3944,9 @@ log_heap_update(Relation reln, Buffer oldbuf, ItemPointerData from, xlrec.target.node = reln->rd_node; xlrec.target.tid = from; - xlrec.all_visible_cleared = PageIsAllVisible(BufferGetPage(oldbuf)); + xlrec.all_visible_cleared = all_visible_cleared; xlrec.newtid = newtup->t_self; - xlrec.new_all_visible_cleared = PageIsAllVisible(BufferGetPage(newbuf)); + xlrec.new_all_visible_cleared = new_all_visible_cleared; rdata[0].data = (char *) &xlrec; rdata[0].len = SizeOfHeapUpdate; @@ -4015,9 +4013,11 @@ log_heap_update(Relation reln, Buffer oldbuf, ItemPointerData from, */ XLogRecPtr log_heap_move(Relation reln, Buffer oldbuf, ItemPointerData from, - Buffer newbuf, HeapTuple newtup) + Buffer newbuf, HeapTuple newtup, + bool all_visible_cleared, bool new_all_visible_cleared) { - return log_heap_update(reln, oldbuf, from, newbuf, newtup, true); + return log_heap_update(reln, oldbuf, from, newbuf, newtup, true, + all_visible_cleared, new_all_visible_cleared); } /* @@ -4222,7 +4222,7 @@ heap_xlog_delete(XLogRecPtr lsn, XLogRecord *record) blkno = ItemPointerGetBlockNumber(&(xlrec->target.tid)); /* - * The visibility map always needs to be updated, even if the heap page is + * The visibility map may need to be fixed even if the heap page is * already up-to-date. */ if (xlrec->all_visible_cleared) @@ -4300,7 +4300,7 @@ heap_xlog_insert(XLogRecPtr lsn, XLogRecord *record) blkno = ItemPointerGetBlockNumber(&(xlrec->target.tid)); /* - * The visibility map always needs to be updated, even if the heap page is + * The visibility map may need to be fixed even if the heap page is * already up-to-date. */ if (xlrec->all_visible_cleared) @@ -4412,7 +4412,7 @@ heap_xlog_update(XLogRecPtr lsn, XLogRecord *record, bool move, bool hot_update) Size freespace; /* - * The visibility map always needs to be updated, even if the heap page is + * The visibility map may need to be fixed even if the heap page is * already up-to-date. */ if (xlrec->all_visible_cleared) @@ -4507,7 +4507,7 @@ heap_xlog_update(XLogRecPtr lsn, XLogRecord *record, bool move, bool hot_update) newt:; /* - * The visibility map always needs to be updated, even if the heap page is + * The visibility map may need to be fixed even if the heap page is * already up-to-date. */ if (xlrec->new_all_visible_cleared) |