1 /*-------------------------------------------------------------------------
4 * Exports from replication/syncrep.c.
6 * Portions Copyright (c) 2010-2022, PostgreSQL Global Development Group
9 * src/include/replication/syncrep.h
11 *-------------------------------------------------------------------------
16 #include "access/xlogdefs.h"
17 #include "utils/guc.h"
19 #define SyncRepRequested() \
20 (max_wal_senders > 0 && synchronous_commit > SYNCHRONOUS_COMMIT_LOCAL_FLUSH)
23 #define SYNC_REP_NO_WAIT (-1)
24 #define SYNC_REP_WAIT_WRITE 0
25 #define SYNC_REP_WAIT_FLUSH 1
26 #define SYNC_REP_WAIT_APPLY 2
28 #define NUM_SYNC_REP_WAIT_MODE 3
31 #define SYNC_REP_NOT_WAITING 0
32 #define SYNC_REP_WAITING 1
33 #define SYNC_REP_WAIT_COMPLETE 2
35 /* syncrep_method of SyncRepConfigData */
36 #define SYNC_REP_PRIORITY 0
37 #define SYNC_REP_QUORUM 1
40 * SyncRepGetCandidateStandbys returns an array of these structs,
41 * one per candidate synchronous walsender.
43 typedef struct SyncRepStandbyData
45 /* Copies of relevant fields from WalSnd shared-memory struct */
50 int sync_standby_priority
;
51 /* Index of this walsender in the WalSnd shared-memory array */
53 /* This flag indicates whether this struct is about our own process */
58 * Struct for the configuration of synchronous replication.
60 * Note: this must be a flat representation that can be held in a single
61 * chunk of malloc'd memory, so that it can be stored as the "extra" data
62 * for the synchronous_standby_names GUC.
64 typedef struct SyncRepConfigData
66 int config_size
; /* total size of this struct, in bytes */
67 int num_sync
; /* number of sync standbys that we need to
69 uint8 syncrep_method
; /* method to choose sync standbys */
70 int nmembers
; /* number of members in the following list */
71 /* member_names contains nmembers consecutive nul-terminated C strings */
72 char member_names
[FLEXIBLE_ARRAY_MEMBER
];
75 extern SyncRepConfigData
*SyncRepConfig
;
77 /* communication variables for parsing synchronous_standby_names GUC */
78 extern SyncRepConfigData
*syncrep_parse_result
;
79 extern char *syncrep_parse_error_msg
;
81 /* user-settable parameters for synchronous replication */
82 extern char *SyncRepStandbyNames
;
84 /* called by user backend */
85 extern void SyncRepWaitForLSN(XLogRecPtr lsn
, bool commit
);
87 /* called at backend exit */
88 extern void SyncRepCleanupAtProcExit(void);
90 /* called by wal sender */
91 extern void SyncRepInitConfig(void);
92 extern void SyncRepReleaseWaiters(void);
94 /* called by wal sender and user backend */
95 extern int SyncRepGetCandidateStandbys(SyncRepStandbyData
**standbys
);
97 /* called by checkpointer */
98 extern void SyncRepUpdateSyncStandbysDefined(void);
100 /* GUC infrastructure */
101 extern bool check_synchronous_standby_names(char **newval
, void **extra
, GucSource source
);
102 extern void assign_synchronous_standby_names(const char *newval
, void *extra
);
103 extern void assign_synchronous_commit(int newval
, void *extra
);
106 * Internal functions for parsing synchronous_standby_names grammar,
107 * in syncrep_gram.y and syncrep_scanner.l
109 extern int syncrep_yyparse(void);
110 extern int syncrep_yylex(void);
111 extern void syncrep_yyerror(const char *str
);
112 extern void syncrep_scanner_init(const char *query_string
);
113 extern void syncrep_scanner_finish(void);
115 #endif /* _SYNCREP_H */