Re: patch for pg_autovacuum 8.0.x prevent segv for dropped
От | Andrew Dunstan |
---|---|
Тема | Re: patch for pg_autovacuum 8.0.x prevent segv for dropped |
Дата | |
Msg-id | 4357AF2A.4040300@dunslane.net обсуждение исходный текст |
Ответ на | patch for pg_autovacuum 8.0.x prevent segv for dropped tables (daveg <daveg@sonic.net>) |
Список | pgsql-patches |
Small nit: please observe postgres community conventions regarding a) indentation (BSD style, tabsize 4) and b) diff type (context, not unidiff) The patch itself looks ok to me. cheers andrew daveg wrote: >Apologies if this is old news, but pg_autovacuum in 8.0.x has the bad habit >of SEGVing and exiting when a table gets dropped out from under it. This >creates problems if you rely on pg_autovacuum for the bulk of your vacuuming >as it forgets it's statistics when it is restarted and so will skip some >desireable vacuums. > >I looked at the new autovacuum in 8.1 and it appears from casual inspection >not to have the same problem. > >Below is a patch for this that should apply against any 8.0.x. The change >verifies that the catalog query returned some rows before accessing the row >data. > >-dg > >diff -Naur source/postgresql-8.0.2/contrib/pg_autovacuum/pg_autovacuum.c build/postgresql-8.0.2/contrib/pg_autovacuum/pg_autovacuum.c >--- source/postgresql-8.0.2/contrib/pg_autovacuum/pg_autovacuum.c 2005-04-02 16:02:03.000000000 -0800 >+++ build/postgresql-8.0.2/contrib/pg_autovacuum/pg_autovacuum.c 2005-09-28 22:15:25.428710172 -0700 >@@ -1013,6 +1013,7 @@ > static void > perform_maintenance_command(db_info * dbi, tbl_info * tbl, int operation) > { >+ PGresult *res; > char buf[256]; > > /* >@@ -1069,10 +1070,16 @@ > fflush(LOGOUTPUT); > } > >- send_query(buf, dbi); >- >- update_table_thresholds(dbi, tbl, operation); >- >+ res = send_query(buf, dbi); >+ if (PQntuples(res)) { >+ update_table_thresholds(dbi, tbl, operation); >+ } else { >+ if (args->debug >= 1) { >+ sprintf(logbuffer, "Cannot refind table %s", tbl->table_name); >+ log_entry(logbuffer, LVL_DEBUG); >+ fflush(LOGOUTPUT); >+ } >+ } > if (args->debug >= 2) > print_table_info(tbl); > } > >
В списке pgsql-patches по дате отправления: