mirror of
https://github.com/postgres/postgres.git
synced 2025-07-30 11:03:19 +03:00
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.
This commit is contained in:
@ -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[] =
|
|||||||
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 @@
|
|||||||
#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 @@
|
|||||||
#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 */
|
||||||
|
Reference in New Issue
Block a user