]> granicus.if.org Git - postgresql/commitdiff
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:39:22 +0000 (12:39 +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 2209db1d96b702c5b47144d769a49859f3c1aa5b..2e3b9d2c2b78a6f354f529408c1ebaeebdab88f5 100644 (file)
@@ -7413,12 +7413,11 @@ heap_xlog_visible(XLogRecPtr lsn, XLogRecord *record)
                ResolveRecoveryConflictWithSnapshot(xlrec->cutoff_xid, xlrec->node);
 
        /*
-        * If heap block was backed up, restore it. This can only happen with
-        * checksums enabled.
+        * If heap block was backed up, restore it. (This can only happen with
+        * checksums or wal_log_hints enabled).
         */
        if (record->xl_info & XLR_BKP_BLOCK(1))
        {
-               Assert(DataChecksumsEnabled());
                (void) RestoreBackupBlock(lsn, record, 1, false, false);
        }
        else
@@ -7441,11 +7440,11 @@ heap_xlog_visible(XLogRecPtr lsn, XLogRecord *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.
+                        * visibility map bit (unless checksums or wal_log_hints 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
index 19ec7eb231e328ab588cb568f9d7353ebd783cf7..18013d59ebfe7ff7d37df750faa4d964fb61f263 100644 (file)
@@ -2125,7 +2125,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. */