mirror of
https://git.postgresql.org/git/postgresql.git
synced 2025-01-12 18:34:36 +08:00
Dept of second thoughts: the !scan_all exit mustn't increase scanned_pages.
In the extreme edge case where contended pages are the only ones that escape being scanned, the previous commit would have allowed us to think that relfrozenxid could be advanced, which is exactly wrong.
This commit is contained in:
parent
e842908233
commit
e5d06f2b12
@ -666,7 +666,7 @@ lazy_scan_heap(Relation onerel, LVRelStats *vacrelstats,
|
||||
* to use lazy_check_needs_freeze() for both situations, though.
|
||||
*/
|
||||
LockBuffer(buf, BUFFER_LOCK_SHARE);
|
||||
if (!lazy_check_needs_freeze(buf, &hastup) || !scan_all)
|
||||
if (!lazy_check_needs_freeze(buf, &hastup))
|
||||
{
|
||||
UnlockReleaseBuffer(buf);
|
||||
vacrelstats->scanned_pages++;
|
||||
@ -675,6 +675,18 @@ lazy_scan_heap(Relation onerel, LVRelStats *vacrelstats,
|
||||
vacrelstats->nonempty_pages = blkno + 1;
|
||||
continue;
|
||||
}
|
||||
if (!scan_all)
|
||||
{
|
||||
/*
|
||||
* Here, we must not advance scanned_pages; that would amount
|
||||
* to claiming that the page contains no freezable tuples.
|
||||
*/
|
||||
UnlockReleaseBuffer(buf);
|
||||
vacrelstats->pinskipped_pages++;
|
||||
if (hastup)
|
||||
vacrelstats->nonempty_pages = blkno + 1;
|
||||
continue;
|
||||
}
|
||||
LockBuffer(buf, BUFFER_LOCK_UNLOCK);
|
||||
LockBufferForCleanup(buf);
|
||||
/* drop through to normal processing */
|
||||
|
Loading…
Reference in New Issue
Block a user