On Wed, Aug 24, 2011 at 03:38:09PM -0400, Tom Lane wrote:
> Merlin Moncure <mmonc...@gmail.com> writes:
> > On Wed, Aug 24, 2011 at 1:24 PM, Daniel Farina <dan...@heroku.com> wrote:
> >> At Heroku we use CREATE INDEX CONCURRENTLY with great success, but
> >> recently when frobbing around some indexes I realized that there is no
> >> equivalent for DROP INDEX, and this is a similar but lesser problem
> >> (as CREATE INDEX takes much longer), as DROP INDEX takes an ACCESS
> >> EXCLUSIVE lock on the parent table while doing the work to unlink
> >> files, which nominally one would think to be trivial, but I assure you
> >> it is not at times for even indexes that are a handful of gigabytes
> >> (let's say ~=< a dozen).
> 
> > Are you sure that you are really waiting on the time to unlink the
> > file?  there's other stuff going on in there like waiting for lock,
> > plan invalidation, etc.  Point being, maybe the time consuming stuff
> > can't really be deferred which would make the proposal moot.
> 
> Assuming the issue really is the physical unlinks (which I agree I'd
> like to see some evidence for), I wonder whether the problem could be

I'd believe it.  With a cold cache (sudo sysctl -w vm.drop_caches=3), my
desktop takes 2.6s to "rm" a 985 MiB file.

> addressed by moving smgrDoPendingDeletes() to after locks are released,
> instead of before, in CommitTransaction/AbortTransaction.  There does
> not seem to be any strong reason why we have to do that before lock
> release, since incoming potential users of a table should not be trying
> to access the old physical storage after that anyway.

Agreed.  We now have $OLD_SUBJECT, but this is a win independently.  I have
reviewed the code that runs between the old and new call sites, and I did not
identify a hazard of moving it as you describe.

nm
diff --git a/src/backend/access/transam/xact.c 
b/src/backend/access/transam/xact.c
index 8f00186..8e4a455 100644
*** a/src/backend/access/transam/xact.c
--- b/src/backend/access/transam/xact.c
***************
*** 1944,1957 **** CommitTransaction(void)
         */
        AtEOXact_Inval(true);
  
-       /*
-        * Likewise, dropping of files deleted during the transaction is best 
done
-        * after releasing relcache and buffer pins.  (This is not strictly
-        * necessary during commit, since such pins should have been released
-        * already, but this ordering is definitely critical during abort.)
-        */
-       smgrDoPendingDeletes(true);
- 
        AtEOXact_MultiXact();
  
        ResourceOwnerRelease(TopTransactionResourceOwner,
--- 1944,1949 ----
***************
*** 1961,1966 **** CommitTransaction(void)
--- 1953,1969 ----
                                                 RESOURCE_RELEASE_AFTER_LOCKS,
                                                 true, true);
  
+       /*
+        * Likewise, dropping of files deleted during the transaction is best 
done
+        * after releasing relcache and buffer pins.  (This is not strictly
+        * necessary during commit, since such pins should have been released
+        * already, but this ordering is definitely critical during abort.)  
Since
+        * this may take many seconds, also delay until after releasing locks.
+        * Other backends will observe the attendant catalog changes and not
+        * attempt to access affected files.
+        */
+       smgrDoPendingDeletes(true);
+ 
        /* Check we've released all catcache entries */
        AtEOXact_CatCache(true);
  
***************
*** 2354,2360 **** AbortTransaction(void)
                AtEOXact_Buffers(false);
                AtEOXact_RelationCache(false);
                AtEOXact_Inval(false);
-               smgrDoPendingDeletes(false);
                AtEOXact_MultiXact();
                ResourceOwnerRelease(TopTransactionResourceOwner,
                                                         RESOURCE_RELEASE_LOCKS,
--- 2357,2362 ----
***************
*** 2362,2367 **** AbortTransaction(void)
--- 2364,2370 ----
                ResourceOwnerRelease(TopTransactionResourceOwner,
                                                         
RESOURCE_RELEASE_AFTER_LOCKS,
                                                         false, true);
+               smgrDoPendingDeletes(false);
                AtEOXact_CatCache(false);
  
                AtEOXact_GUC(false, 1);
***************
*** 4238,4250 **** AbortSubTransaction(void)
                AtEOSubXact_RelationCache(false, s->subTransactionId,
                                                                  
s->parent->subTransactionId);
                AtEOSubXact_Inval(false);
-               AtSubAbort_smgr();
                ResourceOwnerRelease(s->curTransactionOwner,
                                                         RESOURCE_RELEASE_LOCKS,
                                                         false, false);
                ResourceOwnerRelease(s->curTransactionOwner,
                                                         
RESOURCE_RELEASE_AFTER_LOCKS,
                                                         false, false);
  
                AtEOXact_GUC(false, s->gucNestLevel);
                AtEOSubXact_SPI(false, s->subTransactionId);
--- 4241,4253 ----
                AtEOSubXact_RelationCache(false, s->subTransactionId,
                                                                  
s->parent->subTransactionId);
                AtEOSubXact_Inval(false);
                ResourceOwnerRelease(s->curTransactionOwner,
                                                         RESOURCE_RELEASE_LOCKS,
                                                         false, false);
                ResourceOwnerRelease(s->curTransactionOwner,
                                                         
RESOURCE_RELEASE_AFTER_LOCKS,
                                                         false, false);
+               AtSubAbort_smgr();
  
                AtEOXact_GUC(false, s->gucNestLevel);
                AtEOSubXact_SPI(false, s->subTransactionId);
-- 
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

Reply via email to