diff options
author | Tom Lane <tgl@sss.pgh.pa.us> | 2007-07-08 22:23:32 +0000 |
---|---|---|
committer | Tom Lane <tgl@sss.pgh.pa.us> | 2007-07-08 22:23:32 +0000 |
commit | 4ceaf35ff3ce7ab91aed0639882690e777a569d4 (patch) | |
tree | 95d44eab6a38f4c539b652e27fee791ac29a9442 /src/backend | |
parent | 5d798ba82fb92fac7c75947df3f5059bebd67a1f (diff) | |
download | postgresql-4ceaf35ff3ce7ab91aed0639882690e777a569d4.tar.gz postgresql-4ceaf35ff3ce7ab91aed0639882690e777a569d4.zip |
Remove the pgstat_drop_relation() call from smgr_internal_unlink(), because
we don't know at that point which relation OID to tell pgstat to forget.
The code was passing the relfilenode, which is incorrect, and could possibly
cause some other relation's stats to be zeroed out. While we could try to
clean this up, it seems much simpler and more reliable to let the next
invocation of pgstat_vacuum_tabstat() fix things; which indeed is how it
worked before I introduced the buggy code into 8.1.3 and later :-(.
Problem noticed by Itagaki Takahiro, fix is per subsequent discussion.
Diffstat (limited to 'src/backend')
-rw-r--r-- | src/backend/postmaster/pgstat.c | 7 | ||||
-rw-r--r-- | src/backend/storage/smgr/smgr.c | 13 |
2 files changed, 11 insertions, 9 deletions
diff --git a/src/backend/postmaster/pgstat.c b/src/backend/postmaster/pgstat.c index 23dd081ae99..db309c7e14d 100644 --- a/src/backend/postmaster/pgstat.c +++ b/src/backend/postmaster/pgstat.c @@ -13,7 +13,7 @@ * * Copyright (c) 2001-2005, PostgreSQL Global Development Group * - * $PostgreSQL: pgsql/src/backend/postmaster/pgstat.c,v 1.111.2.8 2007/06/07 19:07:11 alvherre Exp $ + * $PostgreSQL: pgsql/src/backend/postmaster/pgstat.c,v 1.111.2.9 2007/07/08 22:23:32 tgl Exp $ * ---------- */ #include "postgres.h" @@ -1070,8 +1070,12 @@ pgstat_drop_database(Oid databaseid) * Tell the collector that we just dropped a relation. * (If the message gets lost, we will still clean the dead entry eventually * via future invocations of pgstat_vacuum_tabstat().) + * + * Currently not used for lack of any good place to call it; we rely + * entirely on pgstat_vacuum_tabstat() to clean out stats for dead rels. * ---------- */ +#ifdef NOT_USED void pgstat_drop_relation(Oid relid) { @@ -1090,6 +1094,7 @@ pgstat_drop_relation(Oid relid) msg.m_databaseid = MyDatabaseId; pgstat_send(&msg, len); } +#endif /* NOT_USED */ /* ---------- diff --git a/src/backend/storage/smgr/smgr.c b/src/backend/storage/smgr/smgr.c index ea5075e12df..a21c3089e68 100644 --- a/src/backend/storage/smgr/smgr.c +++ b/src/backend/storage/smgr/smgr.c @@ -11,7 +11,7 @@ * * * IDENTIFICATION - * $PostgreSQL: pgsql/src/backend/storage/smgr/smgr.c,v 1.93.2.3 2006/03/30 22:11:59 tgl Exp $ + * $PostgreSQL: pgsql/src/backend/storage/smgr/smgr.c,v 1.93.2.4 2007/07/08 22:23:32 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -19,7 +19,6 @@ #include "access/xact.h" #include "commands/tablespace.h" -#include "pgstat.h" #include "storage/bufmgr.h" #include "storage/freespace.h" #include "storage/ipc.h" @@ -471,13 +470,11 @@ smgr_internal_unlink(RelFileNode rnode, int which, bool isTemp, bool isRedo) FreeSpaceMapForgetRel(&rnode); /* - * Tell the stats collector to forget it immediately, too. Skip this - * in recovery mode, since the stats collector likely isn't running - * (and if it is, pgstats.c will get confused because we aren't a real - * backend process). + * It'd be nice to tell the stats collector to forget it immediately, too. + * But we can't because we don't know the OID (and in cases involving + * relfilenode swaps, it's not always clear which table OID to forget, + * anyway). */ - if (!InRecovery) - pgstat_drop_relation(rnode.relNode); /* * And delete the physical files. |