1 /*------------------------------------------------------------------------- 2 * 3 * walsender_private.h 4 * Private definitions from replication/walsender.c. 5 * 6 * Portions Copyright (c) 2010-2016, PostgreSQL Global Development Group 7 * 8 * src/include/replication/walsender_private.h 9 * 10 *------------------------------------------------------------------------- 11 */ 12 #ifndef _WALSENDER_PRIVATE_H 13 #define _WALSENDER_PRIVATE_H 14 15 #include "access/xlog.h" 16 #include "nodes/nodes.h" 17 #include "replication/syncrep.h" 18 #include "storage/latch.h" 19 #include "storage/shmem.h" 20 #include "storage/spin.h" 21 22 typedef enum WalSndState 23 { 24 WALSNDSTATE_STARTUP = 0, 25 WALSNDSTATE_BACKUP, 26 WALSNDSTATE_CATCHUP, 27 WALSNDSTATE_STREAMING, 28 WALSNDSTATE_STOPPING 29 } WalSndState; 30 31 /* 32 * Each walsender has a WalSnd struct in shared memory. 33 */ 34 typedef struct WalSnd 35 { 36 pid_t pid; /* this walsender's process id, or 0 */ 37 WalSndState state; /* this walsender's state */ 38 XLogRecPtr sentPtr; /* WAL has been sent up to this point */ 39 bool needreload; /* does currently-open file need to be 40 * reloaded? */ 41 42 /* 43 * The xlog locations that have been written, flushed, and applied by 44 * standby-side. These may be invalid if the standby-side has not offered 45 * values yet. 46 */ 47 XLogRecPtr write; 48 XLogRecPtr flush; 49 XLogRecPtr apply; 50 51 /* Protects shared variables shown above. */ 52 slock_t mutex; 53 54 /* 55 * Pointer to the walsender's latch. Used by backends to wake up this 56 * walsender when it has work to do. NULL if the walsender isn't active. 57 */ 58 Latch *latch; 59 60 /* 61 * The priority order of the standby managed by this WALSender, as listed 62 * in synchronous_standby_names, or 0 if not-listed. Protected by 63 * SyncRepLock. 64 */ 65 int sync_standby_priority; 66 } WalSnd; 67 68 extern WalSnd *MyWalSnd; 69 70 /* There is one WalSndCtl struct for the whole database cluster */ 71 typedef struct 72 { 73 /* 74 * Synchronous replication queue with one queue per request type. 75 * Protected by SyncRepLock. 76 */ 77 SHM_QUEUE SyncRepQueue[NUM_SYNC_REP_WAIT_MODE]; 78 79 /* 80 * Current location of the head of the queue. All waiters should have a 81 * waitLSN that follows this value. Protected by SyncRepLock. 82 */ 83 XLogRecPtr lsn[NUM_SYNC_REP_WAIT_MODE]; 84 85 /* 86 * Are any sync standbys defined? Waiting backends can't reload the 87 * config file safely, so checkpointer updates this value as needed. 88 * Protected by SyncRepLock. 89 */ 90 bool sync_standbys_defined; 91 92 WalSnd walsnds[FLEXIBLE_ARRAY_MEMBER]; 93 } WalSndCtlData; 94 95 extern WalSndCtlData *WalSndCtl; 96 97 98 extern void WalSndSetState(WalSndState state); 99 100 /* 101 * Internal functions for parsing the replication grammar, in repl_gram.y and 102 * repl_scanner.l 103 */ 104 extern int replication_yyparse(void); 105 extern int replication_yylex(void); 106 extern void replication_yyerror(const char *str) pg_attribute_noreturn(); 107 extern void replication_scanner_init(const char *query_string); 108 extern void replication_scanner_finish(void); 109 110 extern Node *replication_parse_result; 111 112 #endif /* _WALSENDER_PRIVATE_H */ 113