Commit 2d7f6947 authored by Tom Lane's avatar Tom Lane

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).
parent 49758f47
...@@ -12,7 +12,7 @@ ...@@ -12,7 +12,7 @@
* Portions Copyright (c) 1994, Regents of the University of California * Portions Copyright (c) 1994, Regents of the University of California
* *
* IDENTIFICATION * IDENTIFICATION
* $PostgreSQL: pgsql/src/backend/access/nbtree/nbtree.c,v 1.140 2006/02/12 00:18:17 tgl Exp $ * $PostgreSQL: pgsql/src/backend/access/nbtree/nbtree.c,v 1.141 2006/02/14 17:20:01 tgl Exp $
* *
*------------------------------------------------------------------------- *-------------------------------------------------------------------------
*/ */
...@@ -580,8 +580,6 @@ btbulkdelete(PG_FUNCTION_ARGS) ...@@ -580,8 +580,6 @@ btbulkdelete(PG_FUNCTION_ARGS)
maxoff; maxoff;
BlockNumber nextpage; BlockNumber nextpage;
vacuum_delay_point();
ndeletable = 0; ndeletable = 0;
page = BufferGetPage(buf); page = BufferGetPage(buf);
opaque = (BTPageOpaque) PageGetSpecialPointer(page); opaque = (BTPageOpaque) PageGetSpecialPointer(page);
...@@ -638,6 +636,10 @@ btbulkdelete(PG_FUNCTION_ARGS) ...@@ -638,6 +636,10 @@ btbulkdelete(PG_FUNCTION_ARGS)
} }
else else
_bt_relbuf(rel, buf); _bt_relbuf(rel, buf);
/* call vacuum_delay_point while not holding any buffer lock */
vacuum_delay_point();
/* And advance to next page, if any */ /* And advance to next page, if any */
if (nextpage == P_NONE) if (nextpage == P_NONE)
break; break;
...@@ -732,6 +734,8 @@ btvacuumcleanup(PG_FUNCTION_ARGS) ...@@ -732,6 +734,8 @@ btvacuumcleanup(PG_FUNCTION_ARGS)
Page page; Page page;
BTPageOpaque opaque; BTPageOpaque opaque;
vacuum_delay_point();
/* /*
* We can't use _bt_getbuf() here because it always applies * We can't use _bt_getbuf() here because it always applies
* _bt_checkpage(), which will barf on an all-zero page. We want to * _bt_checkpage(), which will barf on an all-zero page. We want to
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment