summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndres Freund2023-07-13 20:03:37 +0000
committerAndres Freund2023-07-13 20:03:37 +0000
commit1386f09871a14a8658d924df18a31ddf595e8345 (patch)
treec386a9f14debb74b60659c7dc079b8a927bed99d
parent9f70f6d4c5bca533c89d19d57dffb47adba8f312 (diff)
Release lock after encountering bogs row in vac_truncate_clog()
When vac_truncate_clog() encounters bogus datfrozenxid / datminmxid values, it returns early. Unfortunately, until now, it did not release WrapLimitsVacuumLock. If the backend later tries to acquire WrapLimitsVacuumLock, the session / autovacuum worker hangs in an uncancellable way. Similarly, other sessions will hang waiting for the lock. However, if the backend holding the lock exited or errored out for some reason, the lock was released. The bug was introduced as a side effect of 566372b3d643. It is interesting that there are no production reports of this problem. That is likely due to a mix of bugs leading to bogus values having gotten less common, process exit releasing locks and instances of hangs being hard to debug for "normal" users. Discussion: https://postgr.es/m/20230621221208.vhsqgduwfpzwxnpg@awork3.anarazel.de
-rw-r--r--src/backend/commands/vacuum.c4
1 files changed, 4 insertions, 0 deletions
diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c
index b45661672e3..b47ba0822c0 100644
--- a/src/backend/commands/vacuum.c
+++ b/src/backend/commands/vacuum.c
@@ -1270,12 +1270,16 @@ vac_truncate_clog(TransactionId frozenXID,
ereport(WARNING,
(errmsg("some databases have not been vacuumed in over 2 billion transactions"),
errdetail("You might have already suffered transaction-wraparound data loss.")));
+ LWLockRelease(WrapLimitsVacuumLock);
return;
}
/* chicken out if data is bogus in any other way */
if (bogus)
+ {
+ LWLockRelease(WrapLimitsVacuumLock);
return;
+ }
/*
* Advance the oldest value for commit timestamps before truncating, so