mirror of
https://git.postgresql.org/git/postgresql.git
synced 2026-02-06 18:47:31 +08:00
In this mode, the master waits for the transaction to be applied on the remote side, not just written to disk. That means that you can count on a transaction started on the standby to see all commits previously acknowledged by the master. To make this work, the standby sends a reply after replaying each commit record generated with synchronous_commit >= 'remote_apply'. This introduces a small inefficiency: the extra replies will be sent even by standbys that aren't the current synchronous standby. But previously-existing synchronous_commit levels make no attempt at all to optimize which replies are sent based on what the primary cares about, so this is no worse, and at least avoids any extra replies for people not using the feature at all. Thomas Munro, reviewed by Michael Paquier and by me. Some additional tweaks by me.
59 lines
1.6 KiB
C
59 lines
1.6 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
|
|
|
|
/* 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 checkpointer */
|
|
extern void SyncRepUpdateSyncStandbysDefined(void);
|
|
|
|
/* forward declaration to avoid pulling in walsender_private.h */
|
|
struct WalSnd;
|
|
extern struct WalSnd *SyncRepGetSynchronousStandby(void);
|
|
|
|
extern bool check_synchronous_standby_names(char **newval, void **extra, GucSource source);
|
|
extern void assign_synchronous_commit(int newval, void *extra);
|
|
|
|
#endif /* _SYNCREP_H */
|