From b8bb8dbf20e13087f8e57ff4c42e81776ae5e545 Mon Sep 17 00:00:00 2001 From: Robert Haas Date: Thu, 10 Mar 2011 15:38:39 -0500 Subject: [PATCH] More synchronous replication tweaks. SyncRepRequested() must check not only the value of the synchronous_replication GUC but also whether max_wal_senders > 0. Otherwise, we might end up waiting for sync rep even when there's no possibility of a standby ever managing to connect. There are some existing cross-checks to prevent this, but they're not quite sufficient: the user can start the server with max_wal_senders=0, synchronous_standby_names='', and synchronous_replication=off and then subsequent make synchronous_standby_names not empty using pg_ctl reload, and then SET synchronous_standby=on, leading to an indefinite hang. Along the way, rename the global variable for the synchronous_replication GUC to match the name of the GUC itself, for clarity. Report by Fujii Masao, though I didn't use his patch. --- src/backend/replication/syncrep.c | 2 +- src/backend/utils/misc/guc.c | 2 +- src/include/replication/syncrep.h | 5 +++-- 3 files changed, 5 insertions(+), 4 deletions(-) diff --git a/src/backend/replication/syncrep.c b/src/backend/replication/syncrep.c index 0033b5559f..ff6b328b38 100644 --- a/src/backend/replication/syncrep.c +++ b/src/backend/replication/syncrep.c @@ -62,7 +62,7 @@ #include "utils/ps_status.h" /* User-settable parameters for sync rep */ -bool sync_rep_mode = false; /* Only set in user backends */ +bool synchronous_replication = false; /* Only set in user backends */ char *SyncRepStandbyNames; static bool sync_standbys_defined = false; /* Is there at least one name? */ diff --git a/src/backend/utils/misc/guc.c b/src/backend/utils/misc/guc.c index 0bf1845599..d1b1c17427 100644 --- a/src/backend/utils/misc/guc.c +++ b/src/backend/utils/misc/guc.c @@ -759,7 +759,7 @@ static struct config_bool ConfigureNamesBool[] = gettext_noop("Requests synchronous replication."), NULL }, - &sync_rep_mode, + &synchronous_replication, false, NULL, NULL }, { diff --git a/src/include/replication/syncrep.h b/src/include/replication/syncrep.h index 1c6d39238c..9171eb6176 100644 --- a/src/include/replication/syncrep.h +++ b/src/include/replication/syncrep.h @@ -19,7 +19,8 @@ #include "storage/spin.h" #include "utils/guc.h" -#define SyncRepRequested() (sync_rep_mode) +#define SyncRepRequested() \ + (synchronous_replication && max_wal_senders > 0) /* syncRepState */ #define SYNC_REP_NOT_WAITING 0 @@ -28,7 +29,7 @@ #define SYNC_REP_MUST_DISCONNECT 3 /* user-settable parameters for synchronous replication */ -extern bool sync_rep_mode; +extern bool synchronous_replication; extern char *SyncRepStandbyNames; /* called by user backend */ -- 2.40.0