PostgreSQL Source Code  git master
walsender.h File Reference
#include <signal.h>
#include "fmgr.h"
Include dependency graph for walsender.h:
This graph shows which files directly or indirectly include this file:

Go to the source code of this file.

Macros

#define WalSndWakeupRequest()   do { wake_wal_senders = true; } while (0)
 
#define WalSndWakeupProcessRequests()
 

Enumerations

enum  CRSSnapshotAction { CRS_EXPORT_SNAPSHOT, CRS_NOEXPORT_SNAPSHOT, CRS_USE_SNAPSHOT }
 

Functions

void InitWalSender (void)
 
bool exec_replication_command (const char *query_string)
 
void WalSndErrorCleanup (void)
 
void WalSndSignals (void)
 
Size WalSndShmemSize (void)
 
void WalSndShmemInit (void)
 
void WalSndWakeup (void)
 
void WalSndInitStopping (void)
 
void WalSndWaitStopping (void)
 
void HandleWalSndInitStopping (void)
 
void WalSndRqstFileReload (void)
 

Variables

bool am_walsender
 
bool am_cascading_walsender
 
bool am_db_walsender
 
bool wake_wal_senders
 
int max_wal_senders
 
int wal_sender_timeout
 
bool log_replication_commands
 

Macro Definition Documentation

◆ WalSndWakeupProcessRequests

#define WalSndWakeupProcessRequests ( )
Value:
do \
{ \
{ \
wake_wal_senders = false; \
if (max_wal_senders > 0) \
WalSndWakeup(); \
} \
} while (0)
int max_wal_senders
Definition: walsender.c:121
bool wake_wal_senders
Definition: walsender.c:130

Definition at line 64 of file walsender.h.

Referenced by XLogBackgroundFlush(), and XLogFlush().

◆ WalSndWakeupRequest

#define WalSndWakeupRequest ( )    do { wake_wal_senders = true; } while (0)

Definition at line 58 of file walsender.h.

Referenced by XLogWrite().

Enumeration Type Documentation

◆ CRSSnapshotAction

Enumerator
CRS_EXPORT_SNAPSHOT 
CRS_NOEXPORT_SNAPSHOT 
CRS_USE_SNAPSHOT 

Definition at line 22 of file walsender.h.

Function Documentation

◆ exec_replication_command()

bool exec_replication_command ( const char *  query_string)

Definition at line 1426 of file walsender.c.

References ALLOCSET_DEFAULT_SIZES, AllocSetContextCreate, CHECK_FOR_INTERRUPTS, CreateDestReceiver(), CreateReplicationSlot(), CurrentMemoryContext, DEBUG1, generate_unaccent_rules::dest, DestRemote, DestRemoteSimple, DropReplicationSlot(), elog, EndCommand(), ereport, errcode(), errmsg(), errmsg_internal(), ERROR, GetPGVariable(), got_STOPPING, IdentifySystem(), initStringInfo(), InvalidOid, IsA, IsAbortedTransactionBlockState(), IsTransactionBlock(), StartReplicationCmd::kind, LOG, log_replication_commands, MemoryContextDelete(), MemoryContextSwitchTo(), MyDatabaseId, VariableShowStmt::name, pgstat_report_activity(), PreventTransactionChain(), REPLICATION_KIND_PHYSICAL, replication_parse_result, replication_scanner_init(), replication_yyparse(), SendBaseBackup(), SendTimeLineHistory(), SnapBuildClearExportedSnapshot(), StartLogicalReplication(), StartReplication(), WalSnd::state, STATE_IDLE, STATE_RUNNING, T_BaseBackupCmd, T_CreateReplicationSlotCmd, T_DropReplicationSlotCmd, T_IdentifySystemCmd, T_SQLCmd, T_StartReplicationCmd, T_TimeLineHistoryCmd, T_VariableShowStmt, TimeLineHistoryCmd::type, Node::type, WalSndSetState(), and WALSNDSTATE_STOPPING.

Referenced by PostgresMain().

1427 {
1428  int parse_rc;
1429  Node *cmd_node;
1430  MemoryContext cmd_context;
1431  MemoryContext old_context;
1432 
1433  /*
1434  * If WAL sender has been told that shutdown is getting close, switch its
1435  * status accordingly to handle the next replication commands correctly.
1436  */
1437  if (got_STOPPING)
1439 
1440  /*
1441  * Throw error if in stopping mode. We need prevent commands that could
1442  * generate WAL while the shutdown checkpoint is being written. To be
1443  * safe, we just prohibit all new commands.
1444  */
1446  ereport(ERROR,
1447  (errmsg("cannot execute new commands while WAL sender is in stopping mode")));
1448 
1449  /*
1450  * CREATE_REPLICATION_SLOT ... LOGICAL exports a snapshot until the next
1451  * command arrives. Clean up the old stuff if there's anything.
1452  */
1454 
1456 
1458  "Replication command context",
1460  old_context = MemoryContextSwitchTo(cmd_context);
1461 
1462  replication_scanner_init(cmd_string);
1463  parse_rc = replication_yyparse();
1464  if (parse_rc != 0)
1465  ereport(ERROR,
1466  (errcode(ERRCODE_SYNTAX_ERROR),
1467  (errmsg_internal("replication command parser returned %d",
1468  parse_rc))));
1469 
1470  cmd_node = replication_parse_result;
1471 
1472  /*
1473  * Log replication command if log_replication_commands is enabled. Even
1474  * when it's disabled, log the command with DEBUG1 level for backward
1475  * compatibility. Note that SQL commands are not logged here, and will be
1476  * logged later if log_statement is enabled.
1477  */
1478  if (cmd_node->type != T_SQLCmd)
1480  (errmsg("received replication command: %s", cmd_string)));
1481 
1482  /*
1483  * CREATE_REPLICATION_SLOT ... LOGICAL exports a snapshot. If it was
1484  * called outside of transaction the snapshot should be cleared here.
1485  */
1486  if (!IsTransactionBlock())
1488 
1489  /*
1490  * For aborted transactions, don't allow anything except pure SQL, the
1491  * exec_simple_query() will handle it correctly.
1492  */
1493  if (IsAbortedTransactionBlockState() && !IsA(cmd_node, SQLCmd))
1494  ereport(ERROR,
1495  (errcode(ERRCODE_IN_FAILED_SQL_TRANSACTION),
1496  errmsg("current transaction is aborted, "
1497  "commands ignored until end of transaction block")));
1498 
1500 
1501  /*
1502  * Allocate buffers that will be used for each outgoing and incoming
1503  * message. We do this just once per command to reduce palloc overhead.
1504  */
1508 
1509  /* Report to pgstat that this process is running */
1511 
1512  switch (cmd_node->type)
1513  {
1514  case T_IdentifySystemCmd:
1515  IdentifySystem();
1516  break;
1517 
1518  case T_BaseBackupCmd:
1519  PreventTransactionChain(true, "BASE_BACKUP");
1520  SendBaseBackup((BaseBackupCmd *) cmd_node);
1521  break;
1522 
1525  break;
1526 
1529  break;
1530 
1531  case T_StartReplicationCmd:
1532  {
1533  StartReplicationCmd *cmd = (StartReplicationCmd *) cmd_node;
1534 
1535  PreventTransactionChain(true, "START_REPLICATION");
1536 
1537  if (cmd->kind == REPLICATION_KIND_PHYSICAL)
1538  StartReplication(cmd);
1539  else
1541  break;
1542  }
1543 
1544  case T_TimeLineHistoryCmd:
1545  PreventTransactionChain(true, "TIMELINE_HISTORY");
1547  break;
1548 
1549  case T_VariableShowStmt:
1550  {
1552  VariableShowStmt *n = (VariableShowStmt *) cmd_node;
1553 
1554  GetPGVariable(n->name, dest);
1555  }
1556  break;
1557 
1558  case T_SQLCmd:
1559  if (MyDatabaseId == InvalidOid)
1560  ereport(ERROR,
1561  (errmsg("cannot execute SQL commands in WAL sender for physical replication")));
1562 
1563  /* Report to pgstat that this process is now idle */
1565 
1566  /* Tell the caller that this wasn't a WalSender command. */
1567  return false;
1568 
1569  default:
1570  elog(ERROR, "unrecognized replication command node tag: %u",
1571  cmd_node->type);
1572  }
1573 
1574  /* done */
1575  MemoryContextSwitchTo(old_context);
1576  MemoryContextDelete(cmd_context);
1577 
1578  /* Send CommandComplete message */
1579  EndCommand("SELECT", DestRemote);
1580 
1581  /* Report to pgstat that this process is now idle */
1583 
1584  return true;
1585 }
#define IsA(nodeptr, _type_)
Definition: nodes.h:563
void MemoryContextDelete(MemoryContext context)
Definition: mcxt.c:198
#define DEBUG1
Definition: elog.h:25
void pgstat_report_activity(BackendState state, const char *cmd_str)
Definition: pgstat.c:2994
static void SendTimeLineHistory(TimeLineHistoryCmd *cmd)
Definition: walsender.c:428
static void DropReplicationSlot(DropReplicationSlotCmd *cmd)
Definition: walsender.c:1030
bool IsAbortedTransactionBlockState(void)
Definition: xact.c:371
static MemoryContext MemoryContextSwitchTo(MemoryContext context)
Definition: palloc.h:109
Definition: nodes.h:512
static StringInfoData output_message
Definition: walsender.c:161
static volatile sig_atomic_t got_STOPPING
Definition: walsender.c:188
int errcode(int sqlerrcode)
Definition: elog.c:575
#define LOG
Definition: elog.h:26
void GetPGVariable(const char *name, DestReceiver *dest)
Definition: guc.c:7929
Node * replication_parse_result
bool IsTransactionBlock(void)
Definition: xact.c:4448
ReplicationKind kind
Definition: replnodes.h:82
void EndCommand(const char *commandTag, CommandDest dest)
Definition: dest.c:157
#define ERROR
Definition: elog.h:43
void SendBaseBackup(BaseBackupCmd *cmd)
Definition: basebackup.c:692
#define ALLOCSET_DEFAULT_SIZES
Definition: memutils.h:197
WalSndState state
NodeTag type
Definition: nodes.h:514
DestReceiver * CreateDestReceiver(CommandDest dest)
Definition: dest.c:109
static void StartReplication(StartReplicationCmd *cmd)
Definition: walsender.c:524
MemoryContext CurrentMemoryContext
Definition: mcxt.c:37
#define ereport(elevel, rest)
Definition: elog.h:122
int replication_yyparse(void)
#define AllocSetContextCreate(parent, name, allocparams)
Definition: memutils.h:165
void initStringInfo(StringInfo str)
Definition: stringinfo.c:46
static StringInfoData reply_message
Definition: walsender.c:162
static void StartLogicalReplication(StartReplicationCmd *cmd)
Definition: walsender.c:1041
Oid MyDatabaseId
Definition: globals.c:77
WalSnd * MyWalSnd
Definition: walsender.c:112
#define InvalidOid
Definition: postgres_ext.h:36
int errmsg_internal(const char *fmt,...)
Definition: elog.c:827
void WalSndSetState(WalSndState state)
Definition: walsender.c:3113
static void CreateReplicationSlot(CreateReplicationSlotCmd *cmd)
Definition: walsender.c:836
static StringInfoData tmpbuf
Definition: walsender.c:163
bool log_replication_commands
Definition: walsender.c:125
int errmsg(const char *fmt,...)
Definition: elog.c:797
#define CHECK_FOR_INTERRUPTS()
Definition: miscadmin.h:98
#define elog
Definition: elog.h:219
static void IdentifySystem(void)
Definition: walsender.c:339
void SnapBuildClearExportedSnapshot(void)
Definition: snapbuild.c:696
void PreventTransactionChain(bool isTopLevel, const char *stmtType)
Definition: xact.c:3154
void replication_scanner_init(const char *query_string)

◆ HandleWalSndInitStopping()

void HandleWalSndInitStopping ( void  )

Definition at line 2918 of file walsender.c.

References am_walsender, Assert, got_STOPPING, kill, MyProcPid, and replication_active.

Referenced by procsignal_sigusr1_handler().

2919 {
2921 
2922  /*
2923  * If replication has not yet started, die like with SIGTERM. If
2924  * replication is active, only set a flag and wake up the main loop. It
2925  * will send any outstanding WAL, wait for it to be replicated to the
2926  * standby, and then exit gracefully.
2927  */
2928  if (!replication_active)
2929  kill(MyProcPid, SIGTERM);
2930  else
2931  got_STOPPING = true;
2932 }
int MyProcPid
Definition: globals.c:39
static volatile sig_atomic_t got_STOPPING
Definition: walsender.c:188
#define kill(pid, sig)
Definition: win32_port.h:437
bool am_walsender
Definition: walsender.c:115
static volatile sig_atomic_t replication_active
Definition: walsender.c:196
#define Assert(condition)
Definition: c.h:680

◆ InitWalSender()

void InitWalSender ( void  )

Referenced by PostgresMain().

◆ WalSndErrorCleanup()

void WalSndErrorCleanup ( void  )

Definition at line 292 of file walsender.c.

References close, ConditionVariableCancelSleep(), DestNone, DestRemote, got_SIGUSR2, got_STOPPING, LWLockReleaseAll(), MyReplicationSlot, pgstat_report_wait_end(), proc_exit(), replication_active, ReplicationSlotCleanup(), ReplicationSlotRelease(), sendFile, WalSndSetState(), WalSndShutdown(), WALSNDSTATE_STARTUP, and whereToSendOutput.

Referenced by PostgresMain().

293 {
297 
298  if (sendFile >= 0)
299  {
300  close(sendFile);
301  sendFile = -1;
302  }
303 
304  if (MyReplicationSlot != NULL)
306 
308 
309  replication_active = false;
310 
311  if (got_STOPPING || got_SIGUSR2)
312  proc_exit(0);
313 
314  /* Revert back to startup state */
316 }
static int sendFile
Definition: walsender.c:136
static volatile sig_atomic_t got_STOPPING
Definition: walsender.c:188
void proc_exit(int code)
Definition: ipc.c:99
void ConditionVariableCancelSleep(void)
void ReplicationSlotRelease(void)
Definition: slot.c:416
static void pgstat_report_wait_end(void)
Definition: pgstat.h:1259
static volatile sig_atomic_t got_SIGUSR2
Definition: walsender.c:187
static volatile sig_atomic_t replication_active
Definition: walsender.c:196
ReplicationSlot * MyReplicationSlot
Definition: slot.c:96
void WalSndSetState(WalSndState state)
Definition: walsender.c:3113
void ReplicationSlotCleanup(void)
Definition: slot.c:471
void LWLockReleaseAll(void)
Definition: lwlock.c:1823
#define close(a)
Definition: win32.h:12

◆ WalSndInitStopping()

void WalSndInitStopping ( void  )

Definition at line 3049 of file walsender.c.

References i, InvalidBackendId, max_wal_senders, WalSnd::mutex, WalSnd::pid, PROCSIG_WALSND_INIT_STOPPING, SendProcSignal(), SpinLockAcquire, SpinLockRelease, and WalSndCtlData::walsnds.

Referenced by ShutdownXLOG().

3050 {
3051  int i;
3052 
3053  for (i = 0; i < max_wal_senders; i++)
3054  {
3055  WalSnd *walsnd = &WalSndCtl->walsnds[i];
3056  pid_t pid;
3057 
3058  SpinLockAcquire(&walsnd->mutex);
3059  pid = walsnd->pid;
3060  SpinLockRelease(&walsnd->mutex);
3061 
3062  if (pid == 0)
3063  continue;
3064 
3066  }
3067 }
WalSndCtlData * WalSndCtl
Definition: walsender.c:109
WalSnd walsnds[FLEXIBLE_ARRAY_MEMBER]
slock_t mutex
#define SpinLockAcquire(lock)
Definition: spin.h:62
int SendProcSignal(pid_t pid, ProcSignalReason reason, BackendId backendId)
Definition: procsignal.c:180
int max_wal_senders
Definition: walsender.c:121
#define SpinLockRelease(lock)
Definition: spin.h:64
#define InvalidBackendId
Definition: backendid.h:23
int i

◆ WalSndRqstFileReload()

void WalSndRqstFileReload ( void  )

Definition at line 2895 of file walsender.c.

References i, max_wal_senders, WalSnd::mutex, WalSnd::needreload, WalSnd::pid, SpinLockAcquire, SpinLockRelease, and WalSndCtlData::walsnds.

Referenced by KeepFileRestoredFromArchive().

2896 {
2897  int i;
2898 
2899  for (i = 0; i < max_wal_senders; i++)
2900  {
2901  WalSnd *walsnd = &WalSndCtl->walsnds[i];
2902 
2903  SpinLockAcquire(&walsnd->mutex);
2904  if (walsnd->pid == 0)
2905  {
2906  SpinLockRelease(&walsnd->mutex);
2907  continue;
2908  }
2909  walsnd->needreload = true;
2910  SpinLockRelease(&walsnd->mutex);
2911  }
2912 }
WalSndCtlData * WalSndCtl
Definition: walsender.c:109
WalSnd walsnds[FLEXIBLE_ARRAY_MEMBER]
slock_t mutex
#define SpinLockAcquire(lock)
Definition: spin.h:62
int max_wal_senders
Definition: walsender.c:121
#define SpinLockRelease(lock)
Definition: spin.h:64
bool needreload
int i

◆ WalSndShmemInit()

void WalSndShmemInit ( void  )

Definition at line 2988 of file walsender.c.

References i, max_wal_senders, MemSet, WalSnd::mutex, NUM_SYNC_REP_WAIT_MODE, ShmemInitStruct(), SHMQueueInit(), SpinLockInit, WalSndCtlData::SyncRepQueue, WalSndCtlData::walsnds, and WalSndShmemSize().

Referenced by CreateSharedMemoryAndSemaphores().

2989 {
2990  bool found;
2991  int i;
2992 
2993  WalSndCtl = (WalSndCtlData *)
2994  ShmemInitStruct("Wal Sender Ctl", WalSndShmemSize(), &found);
2995 
2996  if (!found)
2997  {
2998  /* First time through, so initialize */
3000 
3001  for (i = 0; i < NUM_SYNC_REP_WAIT_MODE; i++)
3003 
3004  for (i = 0; i < max_wal_senders; i++)
3005  {
3006  WalSnd *walsnd = &WalSndCtl->walsnds[i];
3007 
3008  SpinLockInit(&walsnd->mutex);
3009  }
3010  }
3011 }
Size WalSndShmemSize(void)
Definition: walsender.c:2976
#define SpinLockInit(lock)
Definition: spin.h:60
WalSndCtlData * WalSndCtl
Definition: walsender.c:109
#define MemSet(start, val, len)
Definition: c.h:877
WalSnd walsnds[FLEXIBLE_ARRAY_MEMBER]
slock_t mutex
void * ShmemInitStruct(const char *name, Size size, bool *foundPtr)
Definition: shmem.c:372
SHM_QUEUE SyncRepQueue[NUM_SYNC_REP_WAIT_MODE]
int max_wal_senders
Definition: walsender.c:121
void SHMQueueInit(SHM_QUEUE *queue)
Definition: shmqueue.c:36
int i
#define NUM_SYNC_REP_WAIT_MODE
Definition: syncrep.h:28

◆ WalSndShmemSize()

Size WalSndShmemSize ( void  )

Definition at line 2976 of file walsender.c.

References add_size(), max_wal_senders, mul_size(), and offsetof.

Referenced by CreateSharedMemoryAndSemaphores(), and WalSndShmemInit().

2977 {
2978  Size size = 0;
2979 
2980  size = offsetof(WalSndCtlData, walsnds);
2981  size = add_size(size, mul_size(max_wal_senders, sizeof(WalSnd)));
2982 
2983  return size;
2984 }
int max_wal_senders
Definition: walsender.c:121
Size mul_size(Size s1, Size s2)
Definition: shmem.c:492
Size add_size(Size s1, Size s2)
Definition: shmem.c:475
size_t Size
Definition: c.h:414
#define offsetof(type, field)
Definition: c.h:603

◆ WalSndSignals()

void WalSndSignals ( void  )

Definition at line 2952 of file walsender.c.

References die(), InitializeTimeouts(), PostgresSigHupHandler(), pqsignal(), procsignal_sigusr1_handler(), quickdie(), SIG_DFL, SIG_IGN, SIGCHLD, SIGCONT, SIGHUP, SIGPIPE, SIGQUIT, SIGTTIN, SIGTTOU, SIGUSR1, SIGUSR2, SIGWINCH, StatementCancelHandler(), and WalSndLastCycleHandler().

Referenced by PostgresMain().

2953 {
2954  /* Set up signal handlers */
2955  pqsignal(SIGHUP, PostgresSigHupHandler); /* set flag to read config
2956  * file */
2957  pqsignal(SIGINT, StatementCancelHandler); /* query cancel */
2958  pqsignal(SIGTERM, die); /* request shutdown */
2959  pqsignal(SIGQUIT, quickdie); /* hard crash time */
2960  InitializeTimeouts(); /* establishes SIGALRM handler */
2963  pqsignal(SIGUSR2, WalSndLastCycleHandler); /* request a last cycle and
2964  * shutdown */
2965 
2966  /* Reset some signals that are accepted by postmaster but not here */
2972 }
void InitializeTimeouts(void)
Definition: timeout.c:340
#define SIGQUIT
Definition: win32_port.h:164
#define SIGTTOU
Definition: win32_port.h:175
#define SIGTTIN
Definition: win32_port.h:174
#define SIGUSR1
Definition: win32_port.h:177
static void WalSndLastCycleHandler(SIGNAL_ARGS)
Definition: walsender.c:2940
#define SIGCHLD
Definition: win32_port.h:173
#define SIGWINCH
Definition: win32_port.h:176
#define SIGCONT
Definition: win32_port.h:172
#define SIGPIPE
Definition: win32_port.h:168
#define SIGUSR2
Definition: win32_port.h:178
void StatementCancelHandler(SIGNAL_ARGS)
Definition: postgres.c:2687
#define SIGHUP
Definition: win32_port.h:163
void PostgresSigHupHandler(SIGNAL_ARGS)
Definition: postgres.c:2727
#define SIG_IGN
Definition: win32_port.h:160
pqsigfunc pqsignal(int signum, pqsigfunc handler)
Definition: signal.c:168
#define SIG_DFL
Definition: win32_port.h:158
void die(SIGNAL_ARGS)
Definition: postgres.c:2656
void procsignal_sigusr1_handler(SIGNAL_ARGS)
Definition: procsignal.c:261
void quickdie(SIGNAL_ARGS)
Definition: postgres.c:2595

◆ WalSndWaitStopping()

void WalSndWaitStopping ( void  )

Definition at line 3075 of file walsender.c.

References i, max_wal_senders, WalSnd::mutex, pg_usleep(), WalSnd::pid, SpinLockAcquire, SpinLockRelease, WalSnd::state, WalSndCtlData::walsnds, and WALSNDSTATE_STOPPING.

Referenced by ShutdownXLOG().

3076 {
3077  for (;;)
3078  {
3079  int i;
3080  bool all_stopped = true;
3081 
3082  for (i = 0; i < max_wal_senders; i++)
3083  {
3084  WalSnd *walsnd = &WalSndCtl->walsnds[i];
3085 
3086  SpinLockAcquire(&walsnd->mutex);
3087 
3088  if (walsnd->pid == 0)
3089  {
3090  SpinLockRelease(&walsnd->mutex);
3091  continue;
3092  }
3093 
3094  if (walsnd->state != WALSNDSTATE_STOPPING)
3095  {
3096  all_stopped = false;
3097  SpinLockRelease(&walsnd->mutex);
3098  break;
3099  }
3100  SpinLockRelease(&walsnd->mutex);
3101  }
3102 
3103  /* safe to leave if confirmation is done for all WAL senders */
3104  if (all_stopped)
3105  return;
3106 
3107  pg_usleep(10000L); /* wait for 10 msec */
3108  }
3109 }
WalSndCtlData * WalSndCtl
Definition: walsender.c:109
WalSnd walsnds[FLEXIBLE_ARRAY_MEMBER]
slock_t mutex
#define SpinLockAcquire(lock)
Definition: spin.h:62
void pg_usleep(long microsec)
Definition: signal.c:53
WalSndState state
int max_wal_senders
Definition: walsender.c:121
#define SpinLockRelease(lock)
Definition: spin.h:64
int i

◆ WalSndWakeup()

void WalSndWakeup ( void  )

Definition at line 3020 of file walsender.c.

References i, WalSnd::latch, max_wal_senders, WalSnd::mutex, SetLatch(), SpinLockAcquire, SpinLockRelease, and WalSndCtlData::walsnds.

Referenced by KeepFileRestoredFromArchive(), StartupXLOG(), and XLogWalRcvFlush().

3021 {
3022  int i;
3023 
3024  for (i = 0; i < max_wal_senders; i++)
3025  {
3026  Latch *latch;
3027  WalSnd *walsnd = &WalSndCtl->walsnds[i];
3028 
3029  /*
3030  * Get latch pointer with spinlock held, for the unlikely case that
3031  * pointer reads aren't atomic (as they're 8 bytes).
3032  */
3033  SpinLockAcquire(&walsnd->mutex);
3034  latch = walsnd->latch;
3035  SpinLockRelease(&walsnd->mutex);
3036 
3037  if (latch != NULL)
3038  SetLatch(latch);
3039  }
3040 }
WalSndCtlData * WalSndCtl
Definition: walsender.c:109
WalSnd walsnds[FLEXIBLE_ARRAY_MEMBER]
slock_t mutex
#define SpinLockAcquire(lock)
Definition: spin.h:62
Latch * latch
Definition: latch.h:110
int max_wal_senders
Definition: walsender.c:121
#define SpinLockRelease(lock)
Definition: spin.h:64
void SetLatch(volatile Latch *latch)
Definition: latch.c:414
int i

Variable Documentation

◆ am_cascading_walsender

◆ am_db_walsender

bool am_db_walsender

Definition at line 118 of file walsender.c.

Referenced by check_db(), InitPostgres(), and ProcessStartupPacket().

◆ am_walsender

◆ log_replication_commands

bool log_replication_commands

Definition at line 125 of file walsender.c.

Referenced by exec_replication_command().

◆ max_wal_senders

◆ wake_wal_senders

bool wake_wal_senders

Definition at line 130 of file walsender.c.

◆ wal_sender_timeout

int wal_sender_timeout