summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorTom Lane <tgl@sss.pgh.pa.us>2004-10-25 15:42:02 +0000
committerTom Lane <tgl@sss.pgh.pa.us>2004-10-25 15:42:02 +0000
commit2c66dcf684137fdcc4371fd0aeb736a2f6458c36 (patch)
treef89b8c51da326ed07186257dabb92f0780804ff2 /src
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 :-( ...
Diffstat (limited to 'src')
-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)