diff options
author | Robert Haas <rhaas@postgresql.org> | 2011-02-07 22:04:29 -0500 |
---|---|---|
committer | Robert Haas <rhaas@postgresql.org> | 2011-02-07 22:04:29 -0500 |
commit | 32896c40ca766146312b28a5a0eb3f66ca0300ed (patch) | |
tree | 88596b8de0a3d0f57beaf994ff8ace6eda6fd9ba /src/backend/commands/analyze.c | |
parent | 47082fa875179ae629edb26807ab3f38a775280b (diff) |
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.
Diffstat (limited to 'src/backend/commands/analyze.c')
-rw-r--r-- | src/backend/commands/analyze.c | 15 |
1 files changed, 14 insertions, 1 deletions
diff --git a/src/backend/commands/analyze.c b/src/backend/commands/analyze.c index 7bc5f111f4d..4c106dd8c57 100644 --- a/src/backend/commands/analyze.c +++ b/src/backend/commands/analyze.c @@ -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; |