Skip to content

Commit d6a3dbe

Browse files
committed
Fix theoretical torn page hazard.
The original report was concerned with a possible inconsistency between the heap and the visibility map, which I was unable to confirm. The concern has been retracted. However, there did seem to be a torn page hazard when using checksums. By not setting the heap page LSN during redo, the protections of minRecoveryPoint were bypassed. Fixed, along with a misleading comment. It may have been impossible to hit this problem in practice, because it would require a page tear between the checksum and the flags, so I am marking this as a theoretical risk. But, as discussed, it did violate expectations about the page LSN, so it may have other consequences. Backpatch to all supported versions. Reported-by: Konstantin Knizhnik Reviewed-by: Konstantin Knizhnik Discussion: https://postgr.es/m/fed17dac-8cb8-4f5b-d462-1bb4908c029e@garret.ru Backpatch-through: 11
1 parent 3eb8eec commit d6a3dbe

File tree

1 file changed

+4
-2
lines changed

1 file changed

+4
-2
lines changed

src/backend/access/heap/heapam.c

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8823,15 +8823,17 @@ heap_xlog_visible(XLogReaderState *record)
88238823
/*
88248824
* We don't bump the LSN of the heap page when setting the visibility
88258825
* map bit (unless checksums or wal_hint_bits is enabled, in which
8826-
* case we must), because that would generate an unworkable volume of
8827-
* full-page writes. This exposes us to torn page hazards, but since
8826+
* case we must). This exposes us to torn page hazards, but since
88288827
* we're not inspecting the existing page contents in any way, we
88298828
* don't care.
88308829
*/
88318830
page = BufferGetPage(buffer);
88328831

88338832
PageSetAllVisible(page);
88348833

8834+
if (XLogHintBitIsNeeded())
8835+
PageSetLSN(page, lsn);
8836+
88358837
MarkBufferDirty(buffer);
88368838
}
88378839
else if (action == BLK_RESTORED)

0 commit comments

Comments
 (0)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy