mirror of
https://git.postgresql.org/git/postgresql.git
synced 2025-02-05 19:09:58 +08:00
Avoid spurious Hot Standby conflicts from btree delete records.
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.
This commit is contained in:
parent
357edc9a99
commit
52010027ef
@ -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);
|
||||
|
Loading…
Reference in New Issue
Block a user