PostgreSQL Source Code  git master
walsender.h File Reference
#include <signal.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:120
bool wake_wal_senders
Definition: walsender.c:129

Definition at line 62 of file walsender.h.

Referenced by XLogBackgroundFlush(), and XLogFlush().

◆ WalSndWakeupRequest

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

Definition at line 56 of file walsender.h.

Referenced by XLogWrite().

Enumeration Type Documentation

◆ CRSSnapshotAction

Enumerator
CRS_EXPORT_SNAPSHOT 
CRS_NOEXPORT_SNAPSHOT 
CRS_USE_SNAPSHOT 

Definition at line 20 of file walsender.h.

Function Documentation

◆ exec_replication_command()

bool exec_replication_command ( const char *  query_string)

Definition at line 1433 of file walsender.c.

References ALLOCSET_DEFAULT_SIZES, AllocSetContextCreate, CHECK_FOR_INTERRUPTS, CommitTransactionCommand(), 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(), PreventInTransactionBlock(), REPLICATION_KIND_PHYSICAL, replication_parse_result, replication_scanner_init(), replication_yyparse(), SendBaseBackup(), SendTimeLineHistory(), SnapBuildClearExportedSnapshot(), StartLogicalReplication(), StartReplication(), StartTransactionCommand(), 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().

1434 {
1435  int parse_rc;
1436  Node *cmd_node;
1437  MemoryContext cmd_context;
1438  MemoryContext old_context;
1439 
1440  /*
1441  * If WAL sender has been told that shutdown is getting close, switch its
1442  * status accordingly to handle the next replication commands correctly.
1443  */
1444  if (got_STOPPING)
1446 
1447  /*
1448  * Throw error if in stopping mode. We need prevent commands that could
1449  * generate WAL while the shutdown checkpoint is being written. To be
1450  * safe, we just prohibit all new commands.
1451  */
1453  ereport(ERROR,
1454  (errmsg("cannot execute new commands while WAL sender is in stopping mode")));
1455 
1456  /*
1457  * CREATE_REPLICATION_SLOT ... LOGICAL exports a snapshot until the next
1458  * command arrives. Clean up the old stuff if there's anything.
1459  */
1461 
1463 
1465  "Replication command context",
1467  old_context = MemoryContextSwitchTo(cmd_context);
1468 
1469  replication_scanner_init(cmd_string);
1470  parse_rc = replication_yyparse();
1471  if (parse_rc != 0)
1472  ereport(ERROR,
1473  (errcode(ERRCODE_SYNTAX_ERROR),
1474  (errmsg_internal("replication command parser returned %d",
1475  parse_rc))));
1476 
1477  cmd_node = replication_parse_result;
1478 
1479  /*
1480  * Log replication command if log_replication_commands is enabled. Even
1481  * when it's disabled, log the command with DEBUG1 level for backward
1482  * compatibility. Note that SQL commands are not logged here, and will be
1483  * logged later if log_statement is enabled.
1484  */
1485  if (cmd_node->type != T_SQLCmd)
1487  (errmsg("received replication command: %s", cmd_string)));
1488 
1489  /*
1490  * CREATE_REPLICATION_SLOT ... LOGICAL exports a snapshot. If it was
1491  * called outside of transaction the snapshot should be cleared here.
1492  */
1493  if (!IsTransactionBlock())
1495 
1496  /*
1497  * For aborted transactions, don't allow anything except pure SQL, the
1498  * exec_simple_query() will handle it correctly.
1499  */
1500  if (IsAbortedTransactionBlockState() && !IsA(cmd_node, SQLCmd))
1501  ereport(ERROR,
1502  (errcode(ERRCODE_IN_FAILED_SQL_TRANSACTION),
1503  errmsg("current transaction is aborted, "
1504  "commands ignored until end of transaction block")));
1505 
1507 
1508  /*
1509  * Allocate buffers that will be used for each outgoing and incoming
1510  * message. We do this just once per command to reduce palloc overhead.
1511  */
1515 
1516  /* Report to pgstat that this process is running */
1518 
1519  switch (cmd_node->type)
1520  {
1521  case T_IdentifySystemCmd:
1522  IdentifySystem();
1523  break;
1524 
1525  case T_BaseBackupCmd:
1526  PreventInTransactionBlock(true, "BASE_BACKUP");
1527  SendBaseBackup((BaseBackupCmd *) cmd_node);
1528  break;
1529 
1532  break;
1533 
1536  break;
1537 
1538  case T_StartReplicationCmd:
1539  {
1540  StartReplicationCmd *cmd = (StartReplicationCmd *) cmd_node;
1541 
1542  PreventInTransactionBlock(true, "START_REPLICATION");
1543 
1544  if (cmd->kind == REPLICATION_KIND_PHYSICAL)
1545  StartReplication(cmd);
1546  else
1548  break;
1549  }
1550 
1551  case T_TimeLineHistoryCmd:
1552  PreventInTransactionBlock(true, "TIMELINE_HISTORY");
1554  break;
1555 
1556  case T_VariableShowStmt:
1557  {
1559  VariableShowStmt *n = (VariableShowStmt *) cmd_node;
1560 
1561  /* syscache access needs a transaction environment */
1563  GetPGVariable(n->name, dest);
1565  }
1566  break;
1567 
1568  case T_SQLCmd:
1569  if (MyDatabaseId == InvalidOid)
1570  ereport(ERROR,
1571  (errmsg("cannot execute SQL commands in WAL sender for physical replication")));
1572 
1573  /* Report to pgstat that this process is now idle */
1575 
1576  /* Tell the caller that this wasn't a WalSender command. */
1577  return false;
1578 
1579  default:
1580  elog(ERROR, "unrecognized replication command node tag: %u",
1581  cmd_node->type);
1582  }
1583 
1584  /* done */
1585  MemoryContextSwitchTo(old_context);
1586  MemoryContextDelete(cmd_context);
1587 
1588  /* Send CommandComplete message */
1589  EndCommand("SELECT", DestRemote);
1590 
1591  /* Report to pgstat that this process is now idle */
1593 
1594  return true;
1595 }
#define IsA(nodeptr, _type_)
Definition: nodes.h:576
void MemoryContextDelete(MemoryContext context)
Definition: mcxt.c:211
#define AllocSetContextCreate
Definition: memutils.h:169
#define DEBUG1
Definition: elog.h:25
void pgstat_report_activity(BackendState state, const char *cmd_str)
Definition: pgstat.c:3121
static void SendTimeLineHistory(TimeLineHistoryCmd *cmd)
Definition: walsender.c:434
static void DropReplicationSlot(DropReplicationSlotCmd *cmd)
Definition: walsender.c:1052
void CommitTransactionCommand(void)
Definition: xact.c:2895
bool IsAbortedTransactionBlockState(void)
Definition: xact.c:376
static MemoryContext MemoryContextSwitchTo(MemoryContext context)
Definition: palloc.h:109
Definition: nodes.h:525
static StringInfoData output_message
Definition: walsender.c:160
static volatile sig_atomic_t got_STOPPING
Definition: walsender.c:190
int errcode(int sqlerrcode)
Definition: elog.c:570
#define LOG
Definition: elog.h:26
void GetPGVariable(const char *name, DestReceiver *dest)
Definition: guc.c:8738
Node * replication_parse_result
bool IsTransactionBlock(void)
Definition: xact.c:4633
ReplicationKind kind
Definition: replnodes.h:82
void EndCommand(const char *commandTag, CommandDest dest)
Definition: dest.c:166
#define ERROR
Definition: elog.h:43
void SendBaseBackup(BaseBackupCmd *cmd)
Definition: basebackup.c:760
#define ALLOCSET_DEFAULT_SIZES
Definition: memutils.h:191
WalSndState state
NodeTag type
Definition: nodes.h:527
DestReceiver * CreateDestReceiver(CommandDest dest)
Definition: dest.c:113
static void StartReplication(StartReplicationCmd *cmd)
Definition: walsender.c:540
void PreventInTransactionBlock(bool isTopLevel, const char *stmtType)
Definition: xact.c:3328
MemoryContext CurrentMemoryContext
Definition: mcxt.c:38
#define ereport(elevel, rest)
Definition: elog.h:141
int replication_yyparse(void)
void initStringInfo(StringInfo str)
Definition: stringinfo.c:46
static StringInfoData reply_message
Definition: walsender.c:161
static void StartLogicalReplication(StartReplicationCmd *cmd)
Definition: walsender.c:1063
Oid MyDatabaseId
Definition: globals.c:85
WalSnd * MyWalSnd
Definition: walsender.c:111
#define InvalidOid
Definition: postgres_ext.h:36
int errmsg_internal(const char *fmt,...)
Definition: elog.c:814
void WalSndSetState(WalSndState state)
Definition: walsender.c:3177
void StartTransactionCommand(void)
Definition: xact.c:2794
static void CreateReplicationSlot(CreateReplicationSlotCmd *cmd)
Definition: walsender.c:852
static StringInfoData tmpbuf
Definition: walsender.c:162
bool log_replication_commands
Definition: walsender.c:124
int errmsg(const char *fmt,...)
Definition: elog.c:784
#define elog(elevel,...)
Definition: elog.h:226
#define CHECK_FOR_INTERRUPTS()
Definition: miscadmin.h:99
static void IdentifySystem(void)
Definition: walsender.c:345
void SnapBuildClearExportedSnapshot(void)
Definition: snapbuild.c:697
void replication_scanner_init(const char *query_string)

◆ HandleWalSndInitStopping()

void HandleWalSndInitStopping ( void  )

Definition at line 2986 of file walsender.c.

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

Referenced by procsignal_sigusr1_handler().

2987 {
2989 
2990  /*
2991  * If replication has not yet started, die like with SIGTERM. If
2992  * replication is active, only set a flag and wake up the main loop. It
2993  * will send any outstanding WAL, wait for it to be replicated to the
2994  * standby, and then exit gracefully.
2995  */
2996  if (!replication_active)
2997  kill(MyProcPid, SIGTERM);
2998  else
2999  got_STOPPING = true;
3000 }
int MyProcPid
Definition: globals.c:40
static volatile sig_atomic_t got_STOPPING
Definition: walsender.c:190
#define kill(pid, sig)
Definition: win32_port.h:435
bool am_walsender
Definition: walsender.c:114
static volatile sig_atomic_t replication_active
Definition: walsender.c:198
#define Assert(condition)
Definition: c.h:732

◆ InitWalSender()

void InitWalSender ( void  )

Referenced by PostgresMain().

◆ WalSndErrorCleanup()

void WalSndErrorCleanup ( void  )

Definition at line 298 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().

299 {
303 
304  if (sendFile >= 0)
305  {
306  close(sendFile);
307  sendFile = -1;
308  }
309 
310  if (MyReplicationSlot != NULL)
312 
314 
315  replication_active = false;
316 
317  if (got_STOPPING || got_SIGUSR2)
318  proc_exit(0);
319 
320  /* Revert back to startup state */
322 }
static int sendFile
Definition: walsender.c:135
static volatile sig_atomic_t got_STOPPING
Definition: walsender.c:190
void proc_exit(int code)
Definition: ipc.c:104
void ConditionVariableCancelSleep(void)
void ReplicationSlotRelease(void)
Definition: slot.c:424
static void pgstat_report_wait_end(void)
Definition: pgstat.h:1342
static volatile sig_atomic_t got_SIGUSR2
Definition: walsender.c:189
static volatile sig_atomic_t replication_active
Definition: walsender.c:198
ReplicationSlot * MyReplicationSlot
Definition: slot.c:96
void WalSndSetState(WalSndState state)
Definition: walsender.c:3177
void ReplicationSlotCleanup(void)
Definition: slot.c:479
void LWLockReleaseAll(void)
Definition: lwlock.c:1825
#define close(a)
Definition: win32.h:12

◆ WalSndInitStopping()

void WalSndInitStopping ( void  )

Definition at line 3113 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().

3114 {
3115  int i;
3116 
3117  for (i = 0; i < max_wal_senders; i++)
3118  {
3119  WalSnd *walsnd = &WalSndCtl->walsnds[i];
3120  pid_t pid;
3121 
3122  SpinLockAcquire(&walsnd->mutex);
3123  pid = walsnd->pid;
3124  SpinLockRelease(&walsnd->mutex);
3125 
3126  if (pid == 0)
3127  continue;
3128 
3130  }
3131 }
WalSndCtlData * WalSndCtl
Definition: walsender.c:108
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:120
#define SpinLockRelease(lock)
Definition: spin.h:64
#define InvalidBackendId
Definition: backendid.h:23
int i

◆ WalSndRqstFileReload()

void WalSndRqstFileReload ( void  )

Definition at line 2963 of file walsender.c.

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

Referenced by KeepFileRestoredFromArchive().

2964 {
2965  int i;
2966 
2967  for (i = 0; i < max_wal_senders; i++)
2968  {
2969  WalSnd *walsnd = &WalSndCtl->walsnds[i];
2970 
2971  SpinLockAcquire(&walsnd->mutex);
2972  if (walsnd->pid == 0)
2973  {
2974  SpinLockRelease(&walsnd->mutex);
2975  continue;
2976  }
2977  walsnd->needreload = true;
2978  SpinLockRelease(&walsnd->mutex);
2979  }
2980 }
WalSndCtlData * WalSndCtl
Definition: walsender.c:108
WalSnd walsnds[FLEXIBLE_ARRAY_MEMBER]
slock_t mutex
#define SpinLockAcquire(lock)
Definition: spin.h:62
int max_wal_senders
Definition: walsender.c:120
#define SpinLockRelease(lock)
Definition: spin.h:64
bool needreload
int i

◆ WalSndShmemInit()

void WalSndShmemInit ( void  )

Definition at line 3052 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().

3053 {
3054  bool found;
3055  int i;
3056 
3057  WalSndCtl = (WalSndCtlData *)
3058  ShmemInitStruct("Wal Sender Ctl", WalSndShmemSize(), &found);
3059 
3060  if (!found)
3061  {
3062  /* First time through, so initialize */
3064 
3065  for (i = 0; i < NUM_SYNC_REP_WAIT_MODE; i++)
3067 
3068  for (i = 0; i < max_wal_senders; i++)
3069  {
3070  WalSnd *walsnd = &WalSndCtl->walsnds[i];
3071 
3072  SpinLockInit(&walsnd->mutex);
3073  }
3074  }
3075 }
Size WalSndShmemSize(void)
Definition: walsender.c:3040
#define SpinLockInit(lock)
Definition: spin.h:60
WalSndCtlData * WalSndCtl
Definition: walsender.c:108
#define MemSet(start, val, len)
Definition: c.h:955
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:120
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 3040 of file walsender.c.

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

Referenced by CreateSharedMemoryAndSemaphores(), and WalSndShmemInit().

3041 {
3042  Size size = 0;
3043 
3044  size = offsetof(WalSndCtlData, walsnds);
3045  size = add_size(size, mul_size(max_wal_senders, sizeof(WalSnd)));
3046 
3047  return size;
3048 }
int max_wal_senders
Definition: walsender.c:120
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:466
#define offsetof(type, field)
Definition: c.h:655

◆ WalSndSignals()

void WalSndSignals ( void  )

Definition at line 3020 of file walsender.c.

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

Referenced by PostgresMain().

3021 {
3022  /* Set up signal handlers */
3023  pqsignal(SIGHUP, PostgresSigHupHandler); /* set flag to read config
3024  * file */
3025  pqsignal(SIGINT, StatementCancelHandler); /* query cancel */
3026  pqsignal(SIGTERM, die); /* request shutdown */
3027  pqsignal(SIGQUIT, quickdie); /* hard crash time */
3028  InitializeTimeouts(); /* establishes SIGALRM handler */
3031  pqsignal(SIGUSR2, WalSndLastCycleHandler); /* request a last cycle and
3032  * shutdown */
3033 
3034  /* Reset some signals that are accepted by postmaster but not here */
3036 }
void InitializeTimeouts(void)
Definition: timeout.c:340
#define SIGQUIT
Definition: win32_port.h:164
#define SIGUSR1
Definition: win32_port.h:175
static void WalSndLastCycleHandler(SIGNAL_ARGS)
Definition: walsender.c:3008
#define SIGCHLD
Definition: win32_port.h:173
#define SIGPIPE
Definition: win32_port.h:168
#define SIGUSR2
Definition: win32_port.h:176
void StatementCancelHandler(SIGNAL_ARGS)
Definition: postgres.c:2792
#define SIGHUP
Definition: win32_port.h:163
void PostgresSigHupHandler(SIGNAL_ARGS)
Definition: postgres.c:2832
#define SIG_IGN
Definition: win32_port.h:160
pqsigfunc pqsignal(int signum, pqsigfunc handler)
Definition: signal.c:170
#define SIG_DFL
Definition: win32_port.h:158
void procsignal_sigusr1_handler(SIGNAL_ARGS)
Definition: procsignal.c:261
void quickdie(SIGNAL_ARGS)
Definition: postgres.c:2694
#define die(msg)
Definition: pg_test_fsync.c:97

◆ WalSndWaitStopping()

void WalSndWaitStopping ( void  )

Definition at line 3139 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().

3140 {
3141  for (;;)
3142  {
3143  int i;
3144  bool all_stopped = true;
3145 
3146  for (i = 0; i < max_wal_senders; i++)
3147  {
3148  WalSnd *walsnd = &WalSndCtl->walsnds[i];
3149 
3150  SpinLockAcquire(&walsnd->mutex);
3151 
3152  if (walsnd->pid == 0)
3153  {
3154  SpinLockRelease(&walsnd->mutex);
3155  continue;
3156  }
3157 
3158  if (walsnd->state != WALSNDSTATE_STOPPING)
3159  {
3160  all_stopped = false;
3161  SpinLockRelease(&walsnd->mutex);
3162  break;
3163  }
3164  SpinLockRelease(&walsnd->mutex);
3165  }
3166 
3167  /* safe to leave if confirmation is done for all WAL senders */
3168  if (all_stopped)
3169  return;
3170 
3171  pg_usleep(10000L); /* wait for 10 msec */
3172  }
3173 }
WalSndCtlData * WalSndCtl
Definition: walsender.c:108
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:120
#define SpinLockRelease(lock)
Definition: spin.h:64
int i

◆ WalSndWakeup()

void WalSndWakeup ( void  )

Definition at line 3084 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().

3085 {
3086  int i;
3087 
3088  for (i = 0; i < max_wal_senders; i++)
3089  {
3090  Latch *latch;
3091  WalSnd *walsnd = &WalSndCtl->walsnds[i];
3092 
3093  /*
3094  * Get latch pointer with spinlock held, for the unlikely case that
3095  * pointer reads aren't atomic (as they're 8 bytes).
3096  */
3097  SpinLockAcquire(&walsnd->mutex);
3098  latch = walsnd->latch;
3099  SpinLockRelease(&walsnd->mutex);
3100 
3101  if (latch != NULL)
3102  SetLatch(latch);
3103  }
3104 }
WalSndCtlData * WalSndCtl
Definition: walsender.c:108
WalSnd walsnds[FLEXIBLE_ARRAY_MEMBER]
void SetLatch(Latch *latch)
Definition: latch.c:436
slock_t mutex
#define SpinLockAcquire(lock)
Definition: spin.h:62
Latch * latch
Definition: latch.h:110
int max_wal_senders
Definition: walsender.c:120
#define SpinLockRelease(lock)
Definition: spin.h:64
int i

Variable Documentation

◆ am_cascading_walsender

◆ am_db_walsender

bool am_db_walsender

Definition at line 117 of file walsender.c.

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

◆ am_walsender

◆ log_replication_commands

bool log_replication_commands

Definition at line 124 of file walsender.c.

Referenced by exec_replication_command().

◆ max_wal_senders

◆ wake_wal_senders

bool wake_wal_senders

Definition at line 129 of file walsender.c.

◆ wal_sender_timeout

int wal_sender_timeout