Hi, pgstattuple (and pgstatindex) does not contain CHECK_FOR_INTERRUPTS(). Therefore, we can not stop pgstattuple() by using the signal while a large table is processed.
Here is the patch to solve it. Best regards, -- NTT OSS Center Tatsuhito Kasahara
diff -cr pgsql/contrib/pgstattuple/pgstattuple.c pgsql_work/contrib/pgstattuple/pgstattuple.c *** pgsql/contrib/pgstattuple/pgstattuple.c 2009-06-11 23:48:52.000000000 +0900 --- pgsql_work/contrib/pgstattuple/pgstattuple.c 2010-04-02 18:52:05.000000000 +0900 *************** *** 276,281 **** --- 276,283 ---- /* scan the relation */ while ((tuple = heap_getnext(scan, ForwardScanDirection)) != NULL) { + CHECK_FOR_INTERRUPTS(); + /* must hold a buffer lock to call HeapTupleSatisfiesVisibility */ LockBuffer(scan->rs_cbuf, BUFFER_LOCK_SHARE); *************** *** 302,307 **** --- 304,311 ---- while (block <= tupblock) { + CHECK_FOR_INTERRUPTS(); + buffer = ReadBuffer(rel, block); LockBuffer(buffer, BUFFER_LOCK_SHARE); stat.free_space += PageGetHeapFreeSpace((Page) BufferGetPage(buffer)); *************** *** 313,318 **** --- 317,324 ---- while (block < nblocks) { + CHECK_FOR_INTERRUPTS(); + buffer = ReadBuffer(rel, block); LockBuffer(buffer, BUFFER_LOCK_SHARE); stat.free_space += PageGetHeapFreeSpace((Page) BufferGetPage(buffer)); *************** *** 454,459 **** --- 460,467 ---- blkno = start; for (;;) { + CHECK_FOR_INTERRUPTS(); + /* Get the current relation length */ LockRelationForExtension(rel, ExclusiveLock); nblocks = RelationGetNumberOfBlocks(rel);
-- Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org) To make changes to your subscription: http://www.postgresql.org/mailpref/pgsql-hackers