diff --git a/src/backend/access/transam/multixact.c b/src/backend/access/transam/multixact.c index 05f00c3c96ed36b33ab460603a456c6b3733e70c..83b4d432728bc96c2d48b904fcfbd4161f2935ad 100644 --- a/src/backend/access/transam/multixact.c +++ b/src/backend/access/transam/multixact.c @@ -382,6 +382,21 @@ MultiXactIdIsRunning(MultiXactId multi) debug_elog3(DEBUG2, "IsRunning %u?", multi); + /* + * During recovery, all multixacts can be considered not running: in + * effect, tuple locks are not held in standby servers, which is fine + * because the standby cannot acquire further tuple locks nor update/delete + * tuples. + * + * We need to do this first, because GetMultiXactIdMembers complains if + * called on recovery. + */ + if (RecoveryInProgress()) + { + debug_elog2(DEBUG2, "IsRunning: in recovery"); + return false; + } + nmembers = GetMultiXactIdMembers(multi, &members); if (nmembers < 0)