Commit b8bb8dbf authored by Robert Haas's avatar Robert Haas

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.
parent e397d2ee
...@@ -62,7 +62,7 @@ ...@@ -62,7 +62,7 @@
#include "utils/ps_status.h" #include "utils/ps_status.h"
/* User-settable parameters for sync rep */ /* 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; char *SyncRepStandbyNames;
static bool sync_standbys_defined = false; /* Is there at least one name? */ static bool sync_standbys_defined = false; /* Is there at least one name? */
......
...@@ -759,7 +759,7 @@ static struct config_bool ConfigureNamesBool[] = ...@@ -759,7 +759,7 @@ static struct config_bool ConfigureNamesBool[] =
gettext_noop("Requests synchronous replication."), gettext_noop("Requests synchronous replication."),
NULL NULL
}, },
&sync_rep_mode, &synchronous_replication,
false, NULL, NULL false, NULL, NULL
}, },
{ {
......
...@@ -19,7 +19,8 @@ ...@@ -19,7 +19,8 @@
#include "storage/spin.h" #include "storage/spin.h"
#include "utils/guc.h" #include "utils/guc.h"
#define SyncRepRequested() (sync_rep_mode) #define SyncRepRequested() \
(synchronous_replication && max_wal_senders > 0)
/* syncRepState */ /* syncRepState */
#define SYNC_REP_NOT_WAITING 0 #define SYNC_REP_NOT_WAITING 0
...@@ -28,7 +29,7 @@ ...@@ -28,7 +29,7 @@
#define SYNC_REP_MUST_DISCONNECT 3 #define SYNC_REP_MUST_DISCONNECT 3
/* user-settable parameters for synchronous replication */ /* user-settable parameters for synchronous replication */
extern bool sync_rep_mode; extern bool synchronous_replication;
extern char *SyncRepStandbyNames; extern char *SyncRepStandbyNames;
/* called by user backend */ /* called by user backend */
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment