aboutsummaryrefslogtreecommitdiff
path: root/src/backend/access/transam/xact.c
diff options
context:
space:
mode:
authorSimon Riggs <simon@2ndQuadrant.com>2010-01-09 16:49:27 +0000
committerSimon Riggs <simon@2ndQuadrant.com>2010-01-09 16:49:27 +0000
commit42edbd16fbfa95883b6c8449c9e567500514381c (patch)
tree5ad03385bc395a4cd7cb8797f4bfc40b1a122e64 /src/backend/access/transam/xact.c
parent510f3502ebb43afd3e05fa5b67352fe5a6db20bc (diff)
downloadpostgresql-42edbd16fbfa95883b6c8449c9e567500514381c.tar.gz
postgresql-42edbd16fbfa95883b6c8449c9e567500514381c.zip
During Hot Standby, set DatabasePath correctly during relcache init file
deletion, so that we attempt to unlink the correct filepath. unlink() errors are ignorable there, so lack of a DatabasePath initialization step did not cause visible problems until a related bug showed up on Solaris. Code refactored from xact_redo_commit() to ProcessCommittedInvalidationMessages() in inval.c. Recovery may replay shared invalidation messages for many databases, so we cannot SetDatabasePath() once as we do in normal backends. Read the databaseid from the shared invalidation messages, then set DatabasePath temporarily before calling RelationCacheInitFileInvalidate(). Problem report by Robert Treat, analysis and fix by me.
Diffstat (limited to 'src/backend/access/transam/xact.c')
-rw-r--r--src/backend/access/transam/xact.c18
1 files changed, 3 insertions, 15 deletions
diff --git a/src/backend/access/transam/xact.c b/src/backend/access/transam/xact.c
index 47f998f6ef1..5ecd3c5725b 100644
--- a/src/backend/access/transam/xact.c
+++ b/src/backend/access/transam/xact.c
@@ -10,7 +10,7 @@
*
*
* IDENTIFICATION
- * $PostgreSQL: pgsql/src/backend/access/transam/xact.c,v 1.279 2010/01/02 16:57:35 momjian Exp $
+ * $PostgreSQL: pgsql/src/backend/access/transam/xact.c,v 1.280 2010/01/09 16:49:27 sriggs Exp $
*
*-------------------------------------------------------------------------
*/
@@ -4404,20 +4404,8 @@ xact_redo_commit(xl_xact_commit *xlrec, TransactionId xid, XLogRecPtr lsn)
* maintain the same order of invalidation then release locks
* as occurs in .
*/
- if (xlrec->nmsgs > 0)
- {
- /*
- * Relcache init file invalidation requires processing both
- * before and after we send the SI messages. See AtEOXact_Inval()
- */
- if (XactCompletionRelcacheInitFileInval(xlrec))
- RelationCacheInitFileInvalidate(true);
-
- SendSharedInvalidMessages(inval_msgs, xlrec->nmsgs);
-
- if (XactCompletionRelcacheInitFileInval(xlrec))
- RelationCacheInitFileInvalidate(false);
- }
+ ProcessCommittedInvalidationMessages(inval_msgs, xlrec->nmsgs,
+ XactCompletionRelcacheInitFileInval(xlrec));
/*
* Release locks, if any. We do this for both two phase and normal