]> git.ipfire.org Git - thirdparty/postgresql.git/commitdiff
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,