Move btbulkdelete's vacuum_delay_point() call to a place in the loop where
authorTom Lane <tgl@sss.pgh.pa.us>
Tue, 14 Feb 2006 17:20:17 +0000 (17:20 +0000)
committerTom Lane <tgl@sss.pgh.pa.us>
Tue, 14 Feb 2006 17:20:17 +0000 (17:20 +0000)
we are not holding a buffer content lock; where it was, InterruptHoldoffCount
is positive and so we'd not respond to cancel signals as intended.  Also
add missing vacuum_delay_point() call in btvacuumcleanup.  This should fix
complaint from Evgeny Gridasov about failure to respond to SIGINT/SIGTERM
in a timely fashion (bug #2257).

src/backend/access/nbtree/nbtree.c

index 988cbc2a2183a34897452d98a5294ac3215dd9a9..75a3568fe9d242af5aea311bfb40a7056df78a78 100644 (file)
@@ -12,7 +12,7 @@
  * Portions Copyright (c) 1994, Regents of the University of California
  *
  * IDENTIFICATION
- *   $PostgreSQL: pgsql/src/backend/access/nbtree/nbtree.c,v 1.124.4.1 2005/05/07 21:32:53 tgl Exp $
+ *   $PostgreSQL: pgsql/src/backend/access/nbtree/nbtree.c,v 1.124.4.2 2006/02/14 17:20:17 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -571,8 +571,6 @@ btbulkdelete(PG_FUNCTION_ARGS)
                        maxoff;
            BlockNumber nextpage;
 
-           vacuum_delay_point();
-
            ndeletable = 0;
            page = BufferGetPage(buf);
            opaque = (BTPageOpaque) PageGetSpecialPointer(page);
@@ -631,6 +629,10 @@ btbulkdelete(PG_FUNCTION_ARGS)
            }
            else
                _bt_relbuf(rel, buf);
+
+           /* call vacuum_delay_point while not holding any buffer lock */
+           vacuum_delay_point();
+
            /* And advance to next page, if any */
            if (nextpage == P_NONE)
                break;
@@ -724,6 +726,8 @@ btvacuumcleanup(PG_FUNCTION_ARGS)
        Page        page;
        BTPageOpaque opaque;
 
+       vacuum_delay_point();
+
        buf = _bt_getbuf(rel, blkno, BT_READ);
        page = BufferGetPage(buf);
        opaque = (BTPageOpaque) PageGetSpecialPointer(page);