aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTom Lane <tgl@sss.pgh.pa.us>2006-02-14 17:20:10 +0000
committerTom Lane <tgl@sss.pgh.pa.us>2006-02-14 17:20:10 +0000
commit4fc6585cb92cb0e783296f0ca7a5d67ab277c343 (patch)
tree9b09f5d1ea894950fe881c66a80cbdadd035818f
parentefaac136bfe8dda4cca9b8e9ffeb3ed194dad1a5 (diff)
downloadpostgresql-4fc6585cb92cb0e783296f0ca7a5d67ab277c343.tar.gz
postgresql-4fc6585cb92cb0e783296f0ca7a5d67ab277c343.zip
Move btbulkdelete's vacuum_delay_point() call to a place in the loop where
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).
-rw-r--r--src/backend/access/nbtree/nbtree.c10
1 files changed, 7 insertions, 3 deletions
diff --git a/src/backend/access/nbtree/nbtree.c b/src/backend/access/nbtree/nbtree.c
index 8612554ca57..7dd29502672 100644
--- a/src/backend/access/nbtree/nbtree.c
+++ b/src/backend/access/nbtree/nbtree.c
@@ -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.132.2.1 2005/11/22 18:23:04 momjian Exp $
+ * $PostgreSQL: pgsql/src/backend/access/nbtree/nbtree.c,v 1.132.2.2 2006/02/14 17:20:10 tgl Exp $
*
*-------------------------------------------------------------------------
*/
@@ -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);