]> granicus.if.org Git - postgresql/commitdiff
In the new dispensation where REINDEX doesn't take exclusive lock on
authorTom Lane <tgl@sss.pgh.pa.us>
Mon, 25 Oct 2004 15:42:02 +0000 (15:42 +0000)
committerTom Lane <tgl@sss.pgh.pa.us>
Mon, 25 Oct 2004 15:42:02 +0000 (15:42 +0000)
the parent table, it's essential that all index accesses take some kind
of lock on the index.  I had missed vacuumlazy.c :-( ...

src/backend/commands/vacuumlazy.c

index 62ba05f9698dc15c437238df675e6553ef6d8852..ff78ea00d1cd9635bf72a47e7d63c0b35b87a8d1 100644 (file)
@@ -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)