PostgreSQL Source Code git master
Loading...
Searching...
No Matches
pmsignal.c File Reference
#include "postgres.h"
#include <signal.h>
#include <unistd.h>
#include "miscadmin.h"
#include "postmaster/postmaster.h"
#include "replication/walsender.h"
#include "storage/ipc.h"
#include "storage/pmsignal.h"
#include "storage/shmem.h"
#include "storage/subsystems.h"
#include "utils/memutils.h"
Include dependency graph for pmsignal.c:

Go to the source code of this file.

Data Structures

struct  PMSignalData
 

Macros

#define PM_CHILD_UNUSED   0 /* these values must fit in sig_atomic_t */
 
#define PM_CHILD_ASSIGNED   1
 
#define PM_CHILD_ACTIVE   2
 
#define PM_CHILD_WALSENDER   3
 

Functions

static void PMSignalShmemRequest (void *)
 
static void PMSignalShmemInit (void *)
 
static void MarkPostmasterChildInactive (int code, Datum arg)
 
void SendPostmasterSignal (PMSignalReason reason)
 
bool CheckPostmasterSignal (PMSignalReason reason)
 
void SetQuitSignalReason (QuitSignalReason reason)
 
QuitSignalReason GetQuitSignalReason (void)
 
void MarkPostmasterChildSlotAssigned (int slot)
 
bool MarkPostmasterChildSlotUnassigned (int slot)
 
bool IsPostmasterChildWalSender (int slot)
 
void RegisterPostmasterChildActive (void)
 
void MarkPostmasterChildWalSender (void)
 
bool PostmasterIsAliveInternal (void)
 
void PostmasterDeathSignalInit (void)
 

Variables

NON_EXEC_STATIC volatile PMSignalDataPMSignalState = NULL
 
const ShmemCallbacks PMSignalShmemCallbacks
 
static int num_child_flags
 

Macro Definition Documentation

◆ PM_CHILD_ACTIVE

#define PM_CHILD_ACTIVE   2

Definition at line 69 of file pmsignal.c.

◆ PM_CHILD_ASSIGNED

#define PM_CHILD_ASSIGNED   1

Definition at line 68 of file pmsignal.c.

◆ PM_CHILD_UNUSED

#define PM_CHILD_UNUSED   0 /* these values must fit in sig_atomic_t */

Definition at line 67 of file pmsignal.c.

◆ PM_CHILD_WALSENDER

#define PM_CHILD_WALSENDER   3

Definition at line 70 of file pmsignal.c.

Function Documentation

◆ CheckPostmasterSignal()

bool CheckPostmasterSignal ( PMSignalReason  reason)

Definition at line 181 of file pmsignal.c.

182{
183 /* Careful here --- don't clear flag if we haven't seen it set */
184 if (PMSignalState->PMSignalFlags[reason])
185 {
186 PMSignalState->PMSignalFlags[reason] = false;
187 return true;
188 }
189 return false;
190}
NON_EXEC_STATIC volatile PMSignalData * PMSignalState
Definition pmsignal.c:85
sig_atomic_t PMSignalFlags[NUM_PMSIGNALS]
Definition pmsignal.c:76

References PMSignalData::PMSignalFlags, and PMSignalState.

Referenced by process_pm_pmsignal().

◆ GetQuitSignalReason()

QuitSignalReason GetQuitSignalReason ( void  )

Definition at line 212 of file pmsignal.c.

213{
214 /* This is called in signal handlers, so be extra paranoid. */
216 return PMQUIT_NOT_SENT;
218}
bool IsUnderPostmaster
Definition globals.c:122
@ PMQUIT_NOT_SENT
Definition pmsignal.h:55
static int fb(int x)
QuitSignalReason sigquit_reason
Definition pmsignal.c:78

References fb(), IsUnderPostmaster, PMQUIT_NOT_SENT, PMSignalState, and PMSignalData::sigquit_reason.

Referenced by quickdie().

◆ IsPostmasterChildWalSender()

bool IsPostmasterChildWalSender ( int  slot)

Definition at line 270 of file pmsignal.c.

271{
272 Assert(slot > 0 && slot <= num_child_flags);
273 slot--;
274
276 return true;
277 else
278 return false;
279}
#define Assert(condition)
Definition c.h:943
#define PM_CHILD_WALSENDER
Definition pmsignal.c:70
static int num_child_flags
Definition pmsignal.c:100
sig_atomic_t PMChildFlags[FLEXIBLE_ARRAY_MEMBER]
Definition pmsignal.c:81

References Assert, num_child_flags, PM_CHILD_WALSENDER, PMSignalData::PMChildFlags, and PMSignalState.

Referenced by CountChildren(), and SignalChildren().

◆ MarkPostmasterChildInactive()

static void MarkPostmasterChildInactive ( int  code,
Datum  arg 
)
static

Definition at line 325 of file pmsignal.c.

326{
327 int slot = MyPMChildSlot;
328
330 slot--;
334}
int MyPMChildSlot
Definition globals.c:56
#define PM_CHILD_ACTIVE
Definition pmsignal.c:69
#define PM_CHILD_ASSIGNED
Definition pmsignal.c:68

References Assert, fb(), MyPMChildSlot, num_child_flags, PM_CHILD_ACTIVE, PM_CHILD_ASSIGNED, PM_CHILD_WALSENDER, PMSignalData::PMChildFlags, and PMSignalState.

Referenced by RegisterPostmasterChildActive().

◆ MarkPostmasterChildSlotAssigned()

void MarkPostmasterChildSlotAssigned ( int  slot)

Definition at line 229 of file pmsignal.c.

230{
231 Assert(slot > 0 && slot <= num_child_flags);
232 slot--;
233
235 elog(FATAL, "postmaster child slot is already in use");
236
238}
#define FATAL
Definition elog.h:42
#define elog(elevel,...)
Definition elog.h:228
#define PM_CHILD_UNUSED
Definition pmsignal.c:67

References Assert, elog, FATAL, num_child_flags, PM_CHILD_ASSIGNED, PM_CHILD_UNUSED, PMSignalData::PMChildFlags, and PMSignalState.

Referenced by AssignPostmasterChildSlot().

◆ MarkPostmasterChildSlotUnassigned()

bool MarkPostmasterChildSlotUnassigned ( int  slot)

Definition at line 248 of file pmsignal.c.

249{
250 bool result;
251
252 Assert(slot > 0 && slot <= num_child_flags);
253 slot--;
254
255 /*
256 * Note: the slot state might already be unused, because the logic in
257 * postmaster.c is such that this might get called twice when a child
258 * crashes. So we don't try to Assert anything about the state.
259 */
262 return result;
263}
uint32 result

References Assert, num_child_flags, PM_CHILD_ASSIGNED, PM_CHILD_UNUSED, PMSignalData::PMChildFlags, PMSignalState, and result.

Referenced by ReleasePostmasterChildSlot().

◆ MarkPostmasterChildWalSender()

void MarkPostmasterChildWalSender ( void  )

◆ PMSignalShmemInit()

static void PMSignalShmemInit ( void arg)
static

◆ PMSignalShmemRequest()

static void PMSignalShmemRequest ( void arg)
static

Definition at line 138 of file pmsignal.c.

139{
140 size_t size;
141
143
144 size = add_size(offsetof(PMSignalData, PMChildFlags),
146 ShmemRequestStruct(.name = "PMSignalState",
147 .size = size,
148 .ptr = (void **) &PMSignalState,
149 );
150}
int MaxLivePostmasterChildren(void)
Definition pmchild.c:81
Size add_size(Size s1, Size s2)
Definition shmem.c:1048
Size mul_size(Size s1, Size s2)
Definition shmem.c:1063
#define ShmemRequestStruct(...)
Definition shmem.h:176
const char * name

References add_size(), fb(), MaxLivePostmasterChildren(), mul_size(), name, num_child_flags, PMSignalState, and ShmemRequestStruct.

◆ PostmasterDeathSignalInit()

void PostmasterDeathSignalInit ( void  )

Definition at line 406 of file pmsignal.c.

407{
408#ifdef USE_POSTMASTER_DEATH_SIGNAL
410
411 /* Register our signal handler. */
413
414 /* Request a signal on parent exit. */
415#if defined(PR_SET_PDEATHSIG)
416 if (prctl(PR_SET_PDEATHSIG, signum) < 0)
417 elog(ERROR, "could not request parent death signal: %m");
418#elif defined(PROC_PDEATHSIG_CTL)
419 if (procctl(P_PID, 0, PROC_PDEATHSIG_CTL, &signum) < 0)
420 elog(ERROR, "could not request parent death signal: %m");
421#else
422#error "USE_POSTMASTER_DEATH_SIGNAL set, but there is no mechanism to request the signal"
423#endif
424
425 /*
426 * Just in case the parent was gone already and we missed it, we'd better
427 * check the slow way on the first call.
428 */
430#endif /* USE_POSTMASTER_DEATH_SIGNAL */
431}
#define ERROR
Definition elog.h:40
#define pqsignal
Definition port.h:547

References elog, ERROR, fb(), and pqsignal.

Referenced by InitPostmasterChild().

◆ PostmasterIsAliveInternal()

bool PostmasterIsAliveInternal ( void  )

Definition at line 345 of file pmsignal.c.

346{
347#ifdef USE_POSTMASTER_DEATH_SIGNAL
348 /*
349 * Reset the flag before checking, so that we don't miss a signal if
350 * postmaster dies right after the check. If postmaster was indeed dead,
351 * we'll re-arm it before returning to caller.
352 */
354#endif
355
356#ifndef WIN32
357 {
358 char c;
359 ssize_t rc;
360
362
363 /*
364 * In the usual case, the postmaster is still alive, and there is no
365 * data in the pipe.
366 */
367 if (rc < 0 && (errno == EAGAIN || errno == EWOULDBLOCK))
368 return true;
369 else
370 {
371 /*
372 * Postmaster is dead, or something went wrong with the read()
373 * call.
374 */
375
376#ifdef USE_POSTMASTER_DEATH_SIGNAL
378#endif
379
380 if (rc < 0)
381 elog(FATAL, "read on postmaster death monitoring pipe failed: %m");
382 else if (rc > 0)
383 elog(FATAL, "unexpected data in postmaster death monitoring pipe");
384
385 return false;
386 }
387 }
388
389#else /* WIN32 */
391 return true;
392 else
393 {
394#ifdef USE_POSTMASTER_DEATH_SIGNAL
396#endif
397 return false;
398 }
399#endif /* WIN32 */
400}
#define read(a, b, c)
Definition win32.h:13
int postmaster_alive_fds[2]
Definition postmaster.c:486
#define POSTMASTER_FD_WATCH
Definition postmaster.h:83
char * c
#define EWOULDBLOCK
Definition win32_port.h:367
#define EAGAIN
Definition win32_port.h:359

References EAGAIN, elog, EWOULDBLOCK, FATAL, fb(), postmaster_alive_fds, POSTMASTER_FD_WATCH, and read.

Referenced by WaitEventSetWaitBlock().

◆ RegisterPostmasterChildActive()

void RegisterPostmasterChildActive ( void  )

Definition at line 289 of file pmsignal.c.

290{
291 int slot = MyPMChildSlot;
292
294 slot--;
297
298 /* Arrange to clean up at exit. */
300}
void on_shmem_exit(pg_on_exit_callback function, Datum arg)
Definition ipc.c:372
static void MarkPostmasterChildInactive(int code, Datum arg)
Definition pmsignal.c:325

References Assert, fb(), MarkPostmasterChildInactive(), MyPMChildSlot, num_child_flags, on_shmem_exit(), PM_CHILD_ACTIVE, PM_CHILD_ASSIGNED, PMSignalData::PMChildFlags, and PMSignalState.

Referenced by InitAuxiliaryProcess(), and InitProcess().

◆ SendPostmasterSignal()

void SendPostmasterSignal ( PMSignalReason  reason)

Definition at line 164 of file pmsignal.c.

165{
166 /* If called in a standalone backend, do nothing */
168 return;
169 /* Atomically set the proper flag */
170 PMSignalState->PMSignalFlags[reason] = true;
171 /* Send signal to postmaster */
173}
pid_t PostmasterPid
Definition globals.c:108
#define kill(pid, sig)
Definition win32_port.h:490
#define SIGUSR1
Definition win32_port.h:170

References IsUnderPostmaster, kill, PMSignalData::PMSignalFlags, PMSignalState, PostmasterPid, and SIGUSR1.

Referenced by AutoVacLauncherMain(), CheckpointerMain(), CheckRecoveryConsistency(), do_start_worker(), GetNewMultiXactId(), GetNewTransactionId(), InitWalSender(), PerformWalRecovery(), pg_rotate_logfile(), pgaio_worker_request_grow(), RegisterDynamicBackgroundWorker(), RequestXLogStreaming(), SetMultiXactIdLimit(), SetTransactionIdLimit(), TerminateBackgroundWorker(), and TerminateBackgroundWorkersForDatabase().

◆ SetQuitSignalReason()

void SetQuitSignalReason ( QuitSignalReason  reason)

Definition at line 201 of file pmsignal.c.

202{
204}

References PMSignalState, and PMSignalData::sigquit_reason.

Referenced by HandleFatalError(), and process_pm_shutdown_request().

Variable Documentation

◆ num_child_flags

◆ PMSignalShmemCallbacks

const ShmemCallbacks PMSignalShmemCallbacks
Initial value:
= {
.request_fn = PMSignalShmemRequest,
.init_fn = PMSignalShmemInit,
}
static void PMSignalShmemRequest(void *)
Definition pmsignal.c:138
static void PMSignalShmemInit(void *)
Definition pmsignal.c:153

Definition at line 90 of file pmsignal.c.

90 {
91 .request_fn = PMSignalShmemRequest,
92 .init_fn = PMSignalShmemInit,
93};

◆ PMSignalState