mirror of
https://git.postgresql.org/git/postgresql.git
synced 2024-12-21 08:29:39 +08:00
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
).
This commit is contained in:
parent
5f1ab46101
commit
83eb54001c
@ -663,6 +663,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
|
||||
@ -682,9 +687,9 @@ lazy_scan_heap(Relation onerel, LVRelStats *vacrelstats,
|
||||
log_newpage_buffer(buf);
|
||||
|
||||
PageSetAllVisible(page);
|
||||
MarkBufferDirty(buf);
|
||||
visibilitymap_set(onerel, blkno, buf, InvalidXLogRecPtr,
|
||||
vmbuffer, InvalidTransactionId);
|
||||
END_CRIT_SECTION();
|
||||
}
|
||||
|
||||
UnlockReleaseBuffer(buf);
|
||||
|
Loading…
Reference in New Issue
Block a user