Skip to content

Commit ea4b9f1

Browse files
committed
I've run across a pretty serious problem with pg_autovacuum.
pg_autovacuum looses track of any table that's ever been truncated (possibly other situations too). When i truncate a table it gets a new relfilenode in pg_class. This is a problem because pg_autovacuum assumes pg_class.relfilenode will join to pg_stats_all_tables.relid. pg_stats_all_tables.relid is actallly the oid from pg_class, not the relfilenode. These two values start out equal so pg_autovacuum works initially, but it fails later on because of this incorrect assumption. This patch fixes that problem. Applied to HEAD and 7.4.X. Brian Hirt
1 parent 2712ca7 commit ea4b9f1

File tree

2 files changed

+9
-9
lines changed

2 files changed

+9
-9
lines changed

contrib/pg_autovacuum/pg_autovacuum.c

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -116,7 +116,7 @@ init_table_info(PGresult *res, int row, db_info * dbi)
116116
atol(PQgetvalue(res, row, PQfnumber(res, "n_tup_upd"))));
117117
new_tbl->curr_vacuum_count = new_tbl->CountAtLastVacuum;
118118

119-
new_tbl->relfilenode = atoi(PQgetvalue(res, row, PQfnumber(res, "relfilenode")));
119+
new_tbl->relid = atoi(PQgetvalue(res, row, PQfnumber(res, "oid")));
120120
new_tbl->reltuples = atoi(PQgetvalue(res, row, PQfnumber(res, "reltuples")));
121121
new_tbl->relpages = atoi(PQgetvalue(res, row, PQfnumber(res, "relpages")));
122122

@@ -154,7 +154,7 @@ update_table_thresholds(db_info * dbi, tbl_info * tbl, int vacuum_type)
154154

155155
if (dbi->conn != NULL)
156156
{
157-
snprintf(query, sizeof(query), PAGES_QUERY, tbl->relfilenode);
157+
snprintf(query, sizeof(query), PAGES_QUERY, tbl->relid);
158158
res = send_query(query, dbi);
159159
if (res != NULL)
160160
{
@@ -237,7 +237,7 @@ update_table_list(db_info * dbi)
237237
for (i = 0; i < t; i++)
238238
{ /* loop through result set looking for a
239239
* match */
240-
if (tbl->relfilenode == atoi(PQgetvalue(res, i, PQfnumber(res, "relfilenode"))))
240+
if (tbl->relid == atoi(PQgetvalue(res, i, PQfnumber(res, "oid"))))
241241
{
242242
found_match = 1;
243243
break;
@@ -267,7 +267,7 @@ update_table_list(db_info * dbi)
267267
while (tbl_elem != NULL)
268268
{
269269
tbl = ((tbl_info *) DLE_VAL(tbl_elem));
270-
if (tbl->relfilenode == atoi(PQgetvalue(res, i, PQfnumber(res, "relfilenode"))))
270+
if (tbl->relid == atoi(PQgetvalue(res, i, PQfnumber(res, "oid"))))
271271
{
272272
found_match = 1;
273273
break;
@@ -361,7 +361,7 @@ print_table_info(tbl_info * tbl)
361361
{
362362
sprintf(logbuffer, " table name: %s.%s", tbl->dbi->dbname, tbl->table_name);
363363
log_entry(logbuffer);
364-
sprintf(logbuffer, " relfilenode: %i; relisshared: %i", tbl->relfilenode, tbl->relisshared);
364+
sprintf(logbuffer, " relid: %i; relisshared: %i", tbl->relid, tbl->relisshared);
365365
log_entry(logbuffer);
366366
sprintf(logbuffer, " reltuples: %i; relpages: %i", tbl->reltuples, tbl->relpages);
367367
log_entry(logbuffer);
@@ -1072,7 +1072,7 @@ main(int argc, char *argv[])
10721072
{ /* Loop through tables in list */
10731073
tbl = ((tbl_info *) DLE_VAL(tbl_elem)); /* set tbl_info =
10741074
* current_table */
1075-
if (tbl->relfilenode == atoi(PQgetvalue(res, j, PQfnumber(res, "relfilenode"))))
1075+
if (tbl->relid == atoi(PQgetvalue(res, j, PQfnumber(res, "oid"))))
10761076
{
10771077
tbl->curr_analyze_count =
10781078
(atol(PQgetvalue(res, j, PQfnumber(res, "n_tup_ins"))) +

contrib/pg_autovacuum/pg_autovacuum.h

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -34,10 +34,10 @@
3434
#define VACUUM_ANALYZE 0
3535
#define ANALYZE_ONLY 1
3636

37-
#define TABLE_STATS_QUERY "select a.relfilenode,a.relname,a.relnamespace,a.relpages,a.relisshared,a.reltuples,b.schemaname,b.n_tup_ins,b.n_tup_upd,b.n_tup_del from pg_class a, pg_stat_all_tables b where a.relfilenode=b.relid and a.relkind = 'r'"
37+
#define TABLE_STATS_QUERY "select a.oid,a.relname,a.relnamespace,a.relpages,a.relisshared,a.reltuples,b.schemaname,b.n_tup_ins,b.n_tup_upd,b.n_tup_del from pg_class a, pg_stat_all_tables b where a.oid=b.relid and a.relkind = 'r'"
3838

3939
#define FRONTEND
40-
#define PAGES_QUERY "select relfilenode,reltuples,relpages from pg_class where relfilenode=%i"
40+
#define PAGES_QUERY "select oid,reltuples,relpages from pg_class where oid=%i"
4141
#define FROZENOID_QUERY "select oid,age(datfrozenxid) from pg_database where datname = 'template1'"
4242
#define FROZENOID_QUERY2 "select oid,datname,age(datfrozenxid) from pg_database where datname!='template0'"
4343

@@ -84,7 +84,7 @@ struct tableinfo
8484
{
8585
char *schema_name,
8686
*table_name;
87-
int relfilenode,
87+
int relid,
8888
reltuples,
8989
relisshared,
9090
relpages;

0 commit comments

Comments
 (0)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy