Ensure that seqscans check for interrupts at least once per page.
authorTom Lane <tgl@sss.pgh.pa.us>
Tue, 22 May 2012 23:42:28 +0000 (19:42 -0400)
committerTom Lane <tgl@sss.pgh.pa.us>
Tue, 22 May 2012 23:42:28 +0000 (19:42 -0400)
If a seqscan encounters many consecutive pages containing only dead tuples,
it can remain in the loop in heapgettup for a long time, and there was no
CHECK_FOR_INTERRUPTS anywhere in that loop.  This meant there were
real-world situations where a query would be effectively uncancelable for
long stretches.  Add a check placed to occur once per page, which should be
enough to provide reasonable response time without adding any measurable
overhead.

Report and patch by Merlin Moncure (though I tweaked it a bit).
Back-patch to all supported branches.

src/backend/access/heap/heapam.c

index 10644c7d8f1474f1de446df6f64e60154be56160..0dc6611d8dca8420fdb2bf73d027851bcbbc9938 100644 (file)
@@ -206,6 +206,13 @@ heapgetpage(HeapScanDesc scan, BlockNumber page)
        scan->rs_cbuf = InvalidBuffer;
    }
 
+   /*
+    * Be sure to check for interrupts at least once per page.  Checks at
+    * higher code levels won't be able to stop a seqscan that encounters
+    * many pages' worth of consecutive dead tuples.
+    */
+   CHECK_FOR_INTERRUPTS();
+
    /* read page using selected strategy */
    scan->rs_cbuf = ReadBufferWithStrategy(scan->rs_rd,
                                           page,