mirror of
https://github.com/postgres/postgres.git
synced 2025-05-02 11:44:50 +03:00
This feature is also known as "quorum commit" especially in discussion on pgsql-hackers. This commit adds the following new syntaxes into synchronous_standby_names GUC. By using FIRST and ANY keywords, users can specify the method to choose synchronous standbys from the listed servers. FIRST num_sync (standby_name [, ...]) ANY num_sync (standby_name [, ...]) The keyword FIRST specifies a priority-based synchronous replication which was available also in 9.6 or before. This method makes transaction commits wait until their WAL records are replicated to num_sync synchronous standbys chosen based on their priorities. The keyword ANY specifies a quorum-based synchronous replication and makes transaction commits wait until their WAL records are replicated to *at least* num_sync listed standbys. In this method, the values of sync_state.pg_stat_replication for the listed standbys are reported as "quorum". The priority is still assigned to each standby, but not used in this method. The existing syntaxes having neither FIRST nor ANY keyword are still supported. They are the same as new syntax with FIRST keyword, i.e., a priorirty-based synchronous replication. Author: Masahiko Sawada Reviewed-By: Michael Paquier, Amit Kapila and me Discussion: <CAD21AoAACi9NeC_ecm+Vahm+MMA6nYh=Kqs3KB3np+MBOS_gZg@mail.gmail.com> Many thanks to the various individuals who were involved in discussing and developing this feature.
98 lines
2.9 KiB
C
98 lines
2.9 KiB
C
/*-------------------------------------------------------------------------
|
|
*
|
|
* syncrep.h
|
|
* Exports from replication/syncrep.c.
|
|
*
|
|
* Portions Copyright (c) 2010-2016, PostgreSQL Global Development Group
|
|
*
|
|
* IDENTIFICATION
|
|
* src/include/replication/syncrep.h
|
|
*
|
|
*-------------------------------------------------------------------------
|
|
*/
|
|
#ifndef _SYNCREP_H
|
|
#define _SYNCREP_H
|
|
|
|
#include "access/xlogdefs.h"
|
|
#include "utils/guc.h"
|
|
|
|
#define SyncRepRequested() \
|
|
(max_wal_senders > 0 && synchronous_commit > SYNCHRONOUS_COMMIT_LOCAL_FLUSH)
|
|
|
|
/* SyncRepWaitMode */
|
|
#define SYNC_REP_NO_WAIT (-1)
|
|
#define SYNC_REP_WAIT_WRITE 0
|
|
#define SYNC_REP_WAIT_FLUSH 1
|
|
#define SYNC_REP_WAIT_APPLY 2
|
|
|
|
#define NUM_SYNC_REP_WAIT_MODE 3
|
|
|
|
/* syncRepState */
|
|
#define SYNC_REP_NOT_WAITING 0
|
|
#define SYNC_REP_WAITING 1
|
|
#define SYNC_REP_WAIT_COMPLETE 2
|
|
|
|
/* syncrep_method of SyncRepConfigData */
|
|
#define SYNC_REP_PRIORITY 0
|
|
#define SYNC_REP_QUORUM 1
|
|
|
|
/*
|
|
* Struct for the configuration of synchronous replication.
|
|
*
|
|
* Note: this must be a flat representation that can be held in a single
|
|
* chunk of malloc'd memory, so that it can be stored as the "extra" data
|
|
* for the synchronous_standby_names GUC.
|
|
*/
|
|
typedef struct SyncRepConfigData
|
|
{
|
|
int config_size; /* total size of this struct, in bytes */
|
|
int num_sync; /* number of sync standbys that we need to
|
|
* wait for */
|
|
uint8 syncrep_method; /* method to choose sync standbys */
|
|
int nmembers; /* number of members in the following list */
|
|
/* member_names contains nmembers consecutive nul-terminated C strings */
|
|
char member_names[FLEXIBLE_ARRAY_MEMBER];
|
|
} SyncRepConfigData;
|
|
|
|
extern SyncRepConfigData *SyncRepConfig;
|
|
|
|
/* communication variables for parsing synchronous_standby_names GUC */
|
|
extern SyncRepConfigData *syncrep_parse_result;
|
|
extern char *syncrep_parse_error_msg;
|
|
|
|
/* user-settable parameters for synchronous replication */
|
|
extern char *SyncRepStandbyNames;
|
|
|
|
/* called by user backend */
|
|
extern void SyncRepWaitForLSN(XLogRecPtr lsn, bool commit);
|
|
|
|
/* called at backend exit */
|
|
extern void SyncRepCleanupAtProcExit(void);
|
|
|
|
/* called by wal sender */
|
|
extern void SyncRepInitConfig(void);
|
|
extern void SyncRepReleaseWaiters(void);
|
|
|
|
/* called by wal sender and user backend */
|
|
extern List *SyncRepGetSyncStandbys(bool *am_sync);
|
|
|
|
/* called by checkpointer */
|
|
extern void SyncRepUpdateSyncStandbysDefined(void);
|
|
|
|
/* GUC infrastructure */
|
|
extern bool check_synchronous_standby_names(char **newval, void **extra, GucSource source);
|
|
extern void assign_synchronous_standby_names(const char *newval, void *extra);
|
|
extern void assign_synchronous_commit(int newval, void *extra);
|
|
|
|
/*
|
|
* Internal functions for parsing synchronous_standby_names grammar,
|
|
* in syncrep_gram.y and syncrep_scanner.l
|
|
*/
|
|
extern int syncrep_yyparse(void);
|
|
extern int syncrep_yylex(void);
|
|
extern void syncrep_yyerror(const char *str);
|
|
extern void syncrep_scanner_init(const char *query_string);
|
|
extern void syncrep_scanner_finish(void);
|
|
|
|
#endif /* _SYNCREP_H */
|