aboutsummaryrefslogtreecommitdiff
path: root/src/backend/utils/init
diff options
context:
space:
mode:
authorTom Lane <tgl@sss.pgh.pa.us>2012-08-24 13:09:12 -0400
committerTom Lane <tgl@sss.pgh.pa.us>2012-08-24 13:09:12 -0400
commitc3ca786df656d447ca02d51ed3a888468ed6e88d (patch)
tree9bc0b44afa980ef2a5578c7b70b63039c793ee51 /src/backend/utils/init
parent5171a400cb15a94b6a2aa8ea2ad7a0128d080830 (diff)
downloadpostgresql-c3ca786df656d447ca02d51ed3a888468ed6e88d.tar.gz
postgresql-c3ca786df656d447ca02d51ed3a888468ed6e88d.zip
Fix issues with checks for unsupported transaction states in Hot Standby.
The GUC check hooks for transaction_read_only and transaction_isolation tried to check RecoveryInProgress(), so as to disallow setting read/write mode or serializable isolation level (respectively) in hot standby sessions. However, GUC check hooks can be called in many situations where we're not connected to shared memory at all, resulting in a crash in RecoveryInProgress(). Among other cases, this results in EXEC_BACKEND builds crashing during child process start if default_transaction_isolation is serializable, as reported by Heikki Linnakangas. Protect those calls by silently allowing any setting when not inside a transaction; which is okay anyway since these GUCs are always reset at start of transaction. Also, add a check to GetSerializableTransactionSnapshot() to complain if we are in hot standby. We need that check despite the one in check_XactIsoLevel() because default_transaction_isolation could be serializable. We don't want to complain any sooner than this in such cases, since that would prevent running transactions at all in such a state; but a transaction can be run, if SET TRANSACTION ISOLATION is done before setting a snapshot. Per report some months ago from Robert Haas. Back-patch to 9.1, since these problems were introduced by the SSI patch. Kevin Grittner and Tom Lane, with ideas from Heikki Linnakangas
Diffstat (limited to 'src/backend/utils/init')
-rw-r--r--src/backend/utils/init/postinit.c9
1 files changed, 9 insertions, 0 deletions
diff --git a/src/backend/utils/init/postinit.c b/src/backend/utils/init/postinit.c
index 1baa67da9ff..ba0eba55689 100644
--- a/src/backend/utils/init/postinit.c
+++ b/src/backend/utils/init/postinit.c
@@ -574,6 +574,15 @@ InitPostgres(const char *in_dbname, Oid dboid, const char *username,
/* statement_timestamp must be set for timeouts to work correctly */
SetCurrentStatementStartTimestamp();
StartTransactionCommand();
+
+ /*
+ * transaction_isolation will have been set to the default by the
+ * above. If the default is "serializable", and we are in hot
+ * standby, we will fail if we don't change it to something lower.
+ * Fortunately, "read committed" is plenty good enough.
+ */
+ XactIsoLevel = XACT_READ_COMMITTED;
+
(void) GetTransactionSnapshot();
}