Avoid spurious Hot Standby conflicts from btree delete records.
authorSimon Riggs
Mon, 15 Nov 2010 09:30:13 +0000 (09:30 +0000)
committerSimon Riggs
Mon, 15 Nov 2010 09:30:13 +0000 (09:30 +0000)
Similar conflicts were already avoided for related record types.
Massive over-caution resulted in a usability bug. Clear theoretical
basis for doing this is now confirmed by me.
Request to remove from Heikki (twice), over-caution by me.

src/backend/storage/ipc/standby.c

index 4d00fb651e4cf0a8bb1d9318a85a89d23abc3aee..82da9261566e8d362df294de655c29fe6db479d3 100644 (file)
@@ -266,21 +266,13 @@ ResolveRecoveryConflictWithSnapshot(TransactionId latestRemovedXid, RelFileNode
 
    /*
     * If we get passed InvalidTransactionId then we are a little surprised,
-    * but it is theoretically possible, so spit out a DEBUG1 message, but not
-    * one that needs translating.
-    *
-    * We grab latestCompletedXid instead because this is the very latest
-    * value it could ever be.
+    * but it is theoretically possible in normal running. It also happens
+    * when replaying already applied WAL records after a standby crash or
+    * restart. If latestRemovedXid is invalid then there is no conflict. That
+    * rule applies across all record types that suffer from this conflict.
     */
    if (!TransactionIdIsValid(latestRemovedXid))
-   {
-       elog(DEBUG1, "invalid latestremovexXid reported, using latestcompletedxid instead");
-
-       LWLockAcquire(ProcArrayLock, LW_SHARED);
-       latestRemovedXid = ShmemVariableCache->latestCompletedXid;
-       LWLockRelease(ProcArrayLock);
-   }
-   Assert(TransactionIdIsValid(latestRemovedXid));
+       return;
 
    backends = GetConflictingVirtualXIDs(latestRemovedXid,
                                         node.dbNode);