summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTom Lane2004-10-25 15:42:02 +0000
committerTom Lane2004-10-25 15:42:02 +0000
commit2c66dcf684137fdcc4371fd0aeb736a2f6458c36 (patch)
treef89b8c51da326ed07186257dabb92f0780804ff2
parent1d6b0969411e00b096d3e829df3a05debbc4821d (diff)
In the new dispensation where REINDEX doesn't take exclusive lock on
the parent table, it's essential that all index accesses take some kind of lock on the index. I had missed vacuumlazy.c :-( ...
-rw-r--r--src/backend/commands/vacuumlazy.c24
1 files changed, 17 insertions, 7 deletions
diff --git a/src/backend/commands/vacuumlazy.c b/src/backend/commands/vacuumlazy.c
index 62ba05f9698..ff78ea00d1c 100644
--- a/src/backend/commands/vacuumlazy.c
+++ b/src/backend/commands/vacuumlazy.c
@@ -31,7 +31,7 @@
*
*
* IDENTIFICATION
- * $PostgreSQL: pgsql/src/backend/commands/vacuumlazy.c,v 1.47 2004/10/15 22:39:56 tgl Exp $
+ * $PostgreSQL: pgsql/src/backend/commands/vacuumlazy.c,v 1.48 2004/10/25 15:42:02 tgl Exp $
*
*-------------------------------------------------------------------------
*/
@@ -554,9 +554,12 @@ lazy_scan_index(Relation indrel, LVRelStats *vacrelstats)
vac_init_rusage(&ru0);
/*
- * If index is unsafe for concurrent access, must lock it.
+ * Acquire appropriate type of lock on index: must be exclusive if
+ * index AM isn't concurrent-safe.
*/
- if (!indrel->rd_am->amconcurrent)
+ if (indrel->rd_am->amconcurrent)
+ LockRelation(indrel, RowExclusiveLock);
+ else
LockRelation(indrel, AccessExclusiveLock);
/*
@@ -576,7 +579,9 @@ lazy_scan_index(Relation indrel, LVRelStats *vacrelstats)
/*
* Release lock acquired above.
*/
- if (!indrel->rd_am->amconcurrent)
+ if (indrel->rd_am->amconcurrent)
+ UnlockRelation(indrel, RowExclusiveLock);
+ else
UnlockRelation(indrel, AccessExclusiveLock);
if (!stats)
@@ -619,9 +624,12 @@ lazy_vacuum_index(Relation indrel, LVRelStats *vacrelstats)
vac_init_rusage(&ru0);
/*
- * If index is unsafe for concurrent access, must lock it.
+ * Acquire appropriate type of lock on index: must be exclusive if
+ * index AM isn't concurrent-safe.
*/
- if (!indrel->rd_am->amconcurrent)
+ if (indrel->rd_am->amconcurrent)
+ LockRelation(indrel, RowExclusiveLock);
+ else
LockRelation(indrel, AccessExclusiveLock);
/* Do bulk deletion */
@@ -636,7 +644,9 @@ lazy_vacuum_index(Relation indrel, LVRelStats *vacrelstats)
/*
* Release lock acquired above.
*/
- if (!indrel->rd_am->amconcurrent)
+ if (indrel->rd_am->amconcurrent)
+ UnlockRelation(indrel, RowExclusiveLock);
+ else
UnlockRelation(indrel, AccessExclusiveLock);
if (!stats)