postgres.git / summary / log / commit / refs

commit    4da24f12e63313b7dbb6b3e3d0317e04045df636
Author:   Heikki Linnakangas <heikki.linnakangas@iki.fi>
Date:     Wed Oct 23 11:03:54 2013 +0000
First released in: 9.4.0, 9.2.6, 9.3.2

    Fix two bugs in setting the vm bit of empty pages.
    
    Use a critical section when setting the all-visible flag on an empty page,
    and WAL-logging it. log_newpage_buffer() contains an assertion that it
    must be called inside a critical section, and it's the right thing to do
    when modifying a buffer anyway.
    
    Also, the page should be marked dirty before calling log_newpage_buffer(),
    per the comment in log_newpage_buffer() and src/backend/access/transam/README.
    
    Patch by Andres Freund, in response to my report. Backpatch to 9.2, like
    the patch that introduced these bugs (a6370fd9).


src/backend/commands/vacuumlazy.c | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/backend/commands/vacuumlazy.c b/src/backend/commands/vacuumlazy.c index 402e76e72bf..28f169e59c5 100644 --- a/src/backend/commands/vacuumlazy.c +++ b/src/backend/commands/vacuumlazy.c @@ -650,6 +650,11 @@ lazy_scan_heap(Relation onerel, LVRelStats *vacrelstats, /* empty pages are always all-visible */ if (!PageIsAllVisible(page)) { + START_CRIT_SECTION(); + + /* mark buffer dirty before writing a WAL record */ + MarkBufferDirty(buf); + /* * It's possible that another backend has extended the heap, * initialized the page, and then failed to WAL-log the page @@ -669,9 +674,9 @@ lazy_scan_heap(Relation onerel, LVRelStats *vacrelstats, log_newpage_buffer(buf); PageSetAllVisible(page); - MarkBufferDirty(buf); visibilitymap_set(onerel, blkno, InvalidXLogRecPtr, vmbuffer, InvalidTransactionId); + END_CRIT_SECTION(); } UnlockReleaseBuffer(buf); [parent: b89cedeffb9e]