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:10 +0000 (17:20 +0000)
committerTom Lane <tgl@sss.pgh.pa.us>
Tue, 14 Feb 2006 17:20:10 +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 28b977508831efe0f9246e236ff4dbdb29d0e98b..9d44f156f47ade88eddff7080c1e0e3814625d71 100644 (file)
@@ -619,8 +619,6 @@ btbulkdelete(PG_FUNCTION_ARGS)
                                                maxoff;
                        BlockNumber nextpage;
 
-                       vacuum_delay_point();
-
                        ndeletable = 0;
                        page = BufferGetPage(buf);
                        opaque = (BTPageOpaque) PageGetSpecialPointer(page);
@@ -679,6 +677,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;
@@ -772,6 +774,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);