pgstattuple does not contain CHECK_FOR_INTERRUPTS()
От | Tatsuhito Kasahara |
---|---|
Тема | pgstattuple does not contain CHECK_FOR_INTERRUPTS() |
Дата | |
Msg-id | 4BB5C3D1.3060104@oss.ntt.co.jp обсуждение исходный текст |
Ответы |
Re: pgstattuple does not contain CHECK_FOR_INTERRUPTS()
|
Список | pgsql-hackers |
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);
В списке pgsql-hackers по дате отправления: