Skip to content
Snippets Groups Projects
Commit a49633d8 authored by Heikki Linnakangas's avatar Heikki Linnakangas
Browse files

Fix WAL-logging of setting the visibility map bit.

The operation that removes the remaining dead tuples from the page must
be WAL-logged before the setting of the VM bit. Otherwise, if you replay
the WAL to between those two records, you end up with the VM bit set, but
the dead tuples are still there.

Backpatch to 9.3, where this bug was introduced.
parent 46328916
No related branches found
No related tags found
No related merge requests found
......@@ -1182,12 +1182,21 @@ lazy_vacuum_page(Relation onerel, BlockNumber blkno, Buffer buffer,
/*
* Mark buffer dirty before we write WAL.
*
* If checksums are enabled, visibilitymap_set() may log the heap page, so
* we must mark heap buffer dirty before calling visibilitymap_set().
*/
MarkBufferDirty(buffer);
/* XLOG stuff */
if (RelationNeedsWAL(onerel))
{
XLogRecPtr recptr;
recptr = log_heap_clean(onerel, buffer,
NULL, 0, NULL, 0,
unused, uncnt,
vacrelstats->latestRemovedXid);
PageSetLSN(page, recptr);
}
/*
* Now that we have removed the dead tuples from the page, once again
* check if the page has become all-visible.
......@@ -1201,18 +1210,6 @@ lazy_vacuum_page(Relation onerel, BlockNumber blkno, Buffer buffer,
visibility_cutoff_xid);
}
/* XLOG stuff */
if (RelationNeedsWAL(onerel))
{
XLogRecPtr recptr;
recptr = log_heap_clean(onerel, buffer,
NULL, 0, NULL, 0,
unused, uncnt,
vacrelstats->latestRemovedXid);
PageSetLSN(page, recptr);
}
END_CRIT_SECTION();
return tupindex;
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment