diff options
author | Simon Riggs <simon@2ndQuadrant.com> | 2010-02-13 16:15:48 +0000 |
---|---|---|
committer | Simon Riggs <simon@2ndQuadrant.com> | 2010-02-13 16:15:48 +0000 |
commit | dd428c79a4d89867758443b7b5aac45137685f11 (patch) | |
tree | cf6c4d95ef6105a9edd1a3b80b22c238358da1e3 /src/backend/utils/cache | |
parent | a5acb7dfb94391c7b19691786186033993d82b34 (diff) | |
download | postgresql-dd428c79a4d89867758443b7b5aac45137685f11.tar.gz postgresql-dd428c79a4d89867758443b7b5aac45137685f11.zip |
Fix relcache init file invalidation during Hot Standby for the case
where a database has a non-default tablespaceid. Pass thru MyDatabaseId
and MyDatabaseTableSpace to allow file path to be re-created in
standby and correct invalidation to take place in all cases.
Update and rework xact_commit_desc() debug messages.
Bug report from Tom by code inspection. Fix by me.
Diffstat (limited to 'src/backend/utils/cache')
-rw-r--r-- | src/backend/utils/cache/inval.c | 82 |
1 files changed, 8 insertions, 74 deletions
diff --git a/src/backend/utils/cache/inval.c b/src/backend/utils/cache/inval.c index 86b88ba0571..54a7af80534 100644 --- a/src/backend/utils/cache/inval.c +++ b/src/backend/utils/cache/inval.c @@ -80,7 +80,7 @@ * Portions Copyright (c) 1994, Regents of the University of California * * IDENTIFICATION - * $PostgreSQL: pgsql/src/backend/utils/cache/inval.c,v 1.95 2010/02/08 04:33:54 tgl Exp $ + * $PostgreSQL: pgsql/src/backend/utils/cache/inval.c,v 1.96 2010/02/13 16:15:47 sriggs Exp $ * *------------------------------------------------------------------------- */ @@ -861,15 +861,6 @@ xactGetCommittedInvalidationMessages(SharedInvalidationMessage **msgs, * ProcessCommittedInvalidationMessages is executed by xact_redo_commit() * to process invalidation messages added to commit records. * - * If we have to invalidate the relcache init file we need to extract - * the database id from each message so we can correctly locate the database - * path and so remove that database's init file. We note that the relcache - * only contains entries for catalog tables from a single database, or - * shared relations. There are smgr invalidations that reference other - * databases but they never cause relcache file invalidations. - * So we only need to access either global or default tablespaces and - * never have need to scan pg_database to discover tablespace oids. - * * Relcache init file invalidation requires processing both * before and after we send the SI messages. See AtEOXact_Inval() * @@ -879,79 +870,22 @@ xactGetCommittedInvalidationMessages(SharedInvalidationMessage **msgs, */ void ProcessCommittedInvalidationMessages(SharedInvalidationMessage *msgs, - int nmsgs, bool RelcacheInitFileInval) + int nmsgs, bool RelcacheInitFileInval, + Oid dbid, Oid tsid) { - Oid dboid = 0; - bool invalidate_global = false; + if (nmsgs <= 0) + return; - if (nmsgs > 0) - elog(trace_recovery(DEBUG4), "replaying commit with %d messages%s", nmsgs, + elog(trace_recovery(DEBUG4), "replaying commit with %d messages%s", nmsgs, (RelcacheInitFileInval ? " and relcache file invalidation" : "")); - else - return; if (RelcacheInitFileInval) - { - int i; - - /* - * Check messages to record dboid - */ - for (i = 0; i < nmsgs; i++) - { - SharedInvalidationMessage *inval_msg = &(msgs[i]); - Oid loop_dboid = 0; - - /* - * Extract the database Oid from the message - */ - if (inval_msg->id >= 0) - loop_dboid = inval_msg->cc.dbId; - else if (inval_msg->id == SHAREDINVALRELCACHE_ID) - loop_dboid = inval_msg->rc.dbId; - else - { - /* - * Invalidation message is a catalog or nontransactional inval, - * which never cause relcache file invalidation, - * so we ignore them, no matter which db they're for. - */ - continue; - } - - if (loop_dboid == 0) - invalidate_global = true; - else - { - Assert(dboid == 0 || dboid == loop_dboid); - dboid = loop_dboid; - } - } - - /* - * If shared, dboid will be the global tablespace, otherwise it will - * be a local catalog relation in the default tablespace. - */ - if (invalidate_global) - RecoveryRelationCacheInitFileInvalidate(0, GLOBALTABLESPACE_OID, true); - - if (dboid != 0) - RecoveryRelationCacheInitFileInvalidate(dboid, DEFAULTTABLESPACE_OID, true); - } + RecoveryRelationCacheInitFileInvalidate(dbid, tsid, true); SendSharedInvalidMessages(msgs, nmsgs); if (RelcacheInitFileInval) - { - /* - * Second invalidation, very similar to above. See RelationCacheInitFileInvalidate() - */ - if (invalidate_global) - RecoveryRelationCacheInitFileInvalidate(0, GLOBALTABLESPACE_OID, false); - - if (dboid != 0) - RecoveryRelationCacheInitFileInvalidate(dboid, DEFAULTTABLESPACE_OID, false); - } + RecoveryRelationCacheInitFileInvalidate(dbid, tsid, false); } /* |