Add missing CHECK_FOR_INTERRUPTS in autovacuum catalog scan loops
Hi hackers,
I noticed CFI is missing while scanning pg_class for RELKIND_RELATION and
RELKIND_TOASTVALUE. On a database with several thousands of tables, these
scans can take a noticeable amount of time. Attached a patch to address
this.
Regards,
Lakshmi
Attachments:
0001-autovacuum-cfi.patchapplication/octet-stream; name=0001-autovacuum-cfi.patchDownload+4-0
Lakshmi N <lakshmin.jhs@gmail.com> 于2026年4月10日周五 16:39写道:
Hi hackers,
I noticed CFI is missing while scanning pg_class for RELKIND_RELATION and
RELKIND_TOASTVALUE. On a database with several thousands of tables, these
scans can take a noticeable amount of time. Attached a patch to address
this.Regards,
Lakshmi
Hi Lakshmi,
The patch applies cleanly to HEAD and compiles without warnings.
make check passes (one unrelated ICU collation diff).
The two CHECK_FOR_INTERRUPTS() additions in do_autovacuum() look
correct and are well-placed at the top of each loop iteration,
before any resources are acquired.
I noticed there are other similar catalog scan loops in
autovacuum.c that also lack CHECK_FOR_INTERRUPTS():
- The pg_database scan loop around line 1854
- The pg_class scan loop around line 3664
Should those be covered as well?
Regards,
Dapeng Wang
Hi,
On Fri, Apr 10, 2026 at 4:57 AM Dapeng Wang <wangdp20191008@gmail.com>
wrote:
Lakshmi N <lakshmin.jhs@gmail.com> 于2026年4月10日周五 16:39写道:
Hi hackers,
I noticed CFI is missing while scanning pg_class for RELKIND_RELATION and
RELKIND_TOASTVALUE. On a database with several thousands of tables, these
scans can take a noticeable amount of time. Attached a patch to address
this.Regards,
LakshmiHi Lakshmi,
The patch applies cleanly to HEAD and compiles without warnings.
make check passes (one unrelated ICU collation diff).The two CHECK_FOR_INTERRUPTS() additions in do_autovacuum() look
correct and are well-placed at the top of each loop iteration,
before any resources are acquired.I noticed there are other similar catalog scan loops in
autovacuum.c that also lack CHECK_FOR_INTERRUPTS():- The pg_database scan loop around line 1854
- The pg_class scan loop around line 3664Should those be covered as well?
Updated the patch covering those two as well.
Regards,
Lakshmi
Show quoted text
Attachments:
v2-0001-Add-CHECK_FOR_INTERRUPTS-in-autovacuum-table-scannin.patchapplication/octet-stream; name=v2-0001-Add-CHECK_FOR_INTERRUPTS-in-autovacuum-table-scannin.patchDownload+8-1
Lakshmi N <lakshmin.jhs@gmail.com> 于2026年4月11日周六 13:02写道:
Hi,
On Fri, Apr 10, 2026 at 4:57 AM Dapeng Wang <wangdp20191008@gmail.com>
wrote:Lakshmi N <lakshmin.jhs@gmail.com> 于2026年4月10日周五 16:39写道:
Hi hackers,
I noticed CFI is missing while scanning pg_class for RELKIND_RELATION
and RELKIND_TOASTVALUE. On a database with several thousands of tables,
these scans can take a noticeable amount of time. Attached a patch to
address this.Regards,
LakshmiHi Lakshmi,
The patch applies cleanly to HEAD and compiles without warnings.
make check passes (one unrelated ICU collation diff).The two CHECK_FOR_INTERRUPTS() additions in do_autovacuum() look
correct and are well-placed at the top of each loop iteration,
before any resources are acquired.I noticed there are other similar catalog scan loops in
autovacuum.c that also lack CHECK_FOR_INTERRUPTS():- The pg_database scan loop around line 1854
- The pg_class scan loop around line 3664Should those be covered as well?
Updated the patch covering those two as well.
Regards,
Lakshmi
Hi Lakshmi,
The updated patch now covers all four catalog scan loops.
Applies cleanly, compiles without warnings, and all 247
regression tests pass.
Regards,
Dapeng Wang
Hi,
It was discussed [1][/messages/by-id/acwTxpz3Toxt0ty8@nathan%5D here if C_F_I is needed in these
do_autovacuum/autovacuum_scores code paths, and it
was decided not to add them.
Also, at least on my tests with 100k evern with 1 million tables, I did
not see a reason to do so. These are catalog scans that should
happen quick enough, even in extreme cases, to not make
this worthwhile.
Others may have another opinion.
--
Sami