Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                
Fix a couple of bugs with wal_log_hints.
authorHeikki Linnakangas <heikki.linnakangas@iki.fi>
Fri, 26 Jun 2015 09:38:24 +0000 (12:38 +0300)
committerHeikki Linnakangas <heikki.linnakangas@iki.fi>
Fri, 26 Jun 2015 09:38:24 +0000 (12:38 +0300)
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.

src/backend/access/heap/heapam.c
src/backend/storage/buffer/bufmgr.c

index caacc105d25c92118a3d6143f2b98914a3644e7e..208457584d975fe5d0697316ed4ec8397c19e85e 100644 (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);
index cc973b53a91b7ac34b40c9a5ba5313ec7ddd1da3..e4b25587e98ab0620a15abab0de49957e8743624 100644 (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. */