diff options
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; |