mirror of
https://github.com/postgres/postgres.git
synced 2025-07-03 20:02:46 +03:00
Avoid having autovacuum workers wait for relation locks.
Waiting for relation locks can lead to starvation - it pins down an autovacuum worker for as long as the lock is held. But if we're doing an anti-wraparound vacuum, then we still wait; maintenance can no longer be put off. To assist with troubleshooting, if log_autovacuum_min_duration >= 0, we log whenever an autovacuum or autoanalyze is skipped for this reason. Per a gripe by Josh Berkus, and ensuing discussion.
This commit is contained in:
@ -36,6 +36,7 @@
|
||||
#include "pgstat.h"
|
||||
#include "postmaster/autovacuum.h"
|
||||
#include "storage/bufmgr.h"
|
||||
#include "storage/lmgr.h"
|
||||
#include "storage/proc.h"
|
||||
#include "storage/procarray.h"
|
||||
#include "utils/acl.h"
|
||||
@ -148,7 +149,19 @@ analyze_rel(Oid relid, VacuumStmt *vacstmt,
|
||||
* matter if we ever try to accumulate stats on dead tuples.) If the rel
|
||||
* has been dropped since we last saw it, we don't need to process it.
|
||||
*/
|
||||
onerel = try_relation_open(relid, ShareUpdateExclusiveLock);
|
||||
if (!(vacstmt->options & VACOPT_NOWAIT))
|
||||
onerel = try_relation_open(relid, ShareUpdateExclusiveLock);
|
||||
else if (ConditionalLockRelationOid(relid, ShareUpdateExclusiveLock))
|
||||
onerel = try_relation_open(relid, NoLock);
|
||||
else
|
||||
{
|
||||
onerel = NULL;
|
||||
if (IsAutoVacuumWorkerProcess() && Log_autovacuum_min_duration >= 0)
|
||||
ereport(LOG,
|
||||
(errcode(ERRCODE_LOCK_NOT_AVAILABLE),
|
||||
errmsg("skipping analyze of \"%s\" --- lock not available",
|
||||
vacstmt->relation->relname)));
|
||||
}
|
||||
if (!onerel)
|
||||
return;
|
||||
|
||||
|
Reference in New Issue
Block a user