Fix a couple of bugs with wal_log_hints.

1. Replay of the WAL record for setting a bit in the visibility map
contained an assertion that a full-page image of that record type can only
occur with checksums enabled. But it can also happen with wal_log_hints, so
remove the assertion. Unlike checksums, wal_log_hints can be changed on the
fly, so it would be complicated to figure out if it was enabled at the time
that the WAL record was generated.

2. wal_log_hints has the same effect on the locking needed to read the LSN
of a page as data checksums. BufferGetLSNAtomic() didn't get the memo.

Backpatch to 9.4, where wal_log_hints was added.
This commit is contained in:
Heikki Linnakangas 2015-06-26 12:38:24 +03:00
parent f7bb7f0625
commit 4b8e24b9ad
2 changed files with 9 additions and 8 deletions

View File

@ -7479,10 +7479,11 @@ heap_xlog_visible(XLogReaderState *record)
{
/*
* We don't bump the LSN of the heap page when setting the visibility
* map bit (unless checksums are enabled, in which case we must),
* because that would generate an unworkable volume of full-page
* writes. This exposes us to torn page hazards, but since we're not
* inspecting the existing page contents in any way, we don't care.
* map bit (unless checksums or wal_hint_bits is enabled, in which
* case we must), because that would generate an unworkable volume of
* full-page writes. This exposes us to torn page hazards, but since
* we're not inspecting the existing page contents in any way, we
* don't care.
*
* However, all operations that clear the visibility map bit *do* bump
* the LSN, and those operations will only be replayed if the XLOG LSN
@ -7497,10 +7498,10 @@ heap_xlog_visible(XLogReaderState *record)
else if (action == BLK_RESTORED)
{
/*
* If heap block was backed up, restore it. This can only happen with
* checksums enabled.
* If heap block was backed up, we already restored it and there's
* nothing more to do. (This can only happen with checksums or
* wal_log_hints enabled.)
*/
Assert(DataChecksumsEnabled());
}
if (BufferIsValid(buffer))
UnlockReleaseBuffer(buffer);

View File

@ -2496,7 +2496,7 @@ BufferGetLSNAtomic(Buffer buffer)
/*
* If we don't need locking for correctness, fastpath out.
*/
if (!DataChecksumsEnabled() || BufferIsLocal(buffer))
if (!XLogHintBitIsNeeded() || BufferIsLocal(buffer))
return PageGetLSN(page);
/* Make sure we've got a real buffer, and that we hold a pin on it. */