PostgreSQL Source Code  git master
auxprocess.c
Go to the documentation of this file.
1 /*-------------------------------------------------------------------------
2  * auxprocess.c
3  * functions related to auxiliary processes.
4  *
5  *
6  * Portions Copyright (c) 1996-2021, PostgreSQL Global Development Group
7  * Portions Copyright (c) 1994, Regents of the University of California
8  *
9  * IDENTIFICATION
10  * src/backend/postmaster/auxprocess.c
11  *-------------------------------------------------------------------------
12  */
13 #include "postgres.h"
14 
15 #include <unistd.h>
16 #include <signal.h>
17 
18 #include "libpq/pqsignal.h"
19 #include "miscadmin.h"
20 #include "pgstat.h"
21 #include "postmaster/auxprocess.h"
22 #include "postmaster/bgwriter.h"
23 #include "postmaster/startup.h"
24 #include "postmaster/walwriter.h"
26 #include "storage/bufmgr.h"
27 #include "storage/bufpage.h"
29 #include "storage/ipc.h"
30 #include "storage/proc.h"
31 #include "tcop/tcopprot.h"
32 #include "utils/memutils.h"
33 #include "utils/ps_status.h"
34 #include "utils/rel.h"
35 
36 
37 static void ShutdownAuxiliaryProcess(int code, Datum arg);
38 
39 
40 /* ----------------
41  * global variables
42  * ----------------
43  */
44 
45 AuxProcType MyAuxProcType = NotAnAuxProcess; /* declared in miscadmin.h */
46 
47 
48 /*
49  * AuxiliaryProcessMain
50  *
51  * The main entry point for auxiliary processes, such as the bgwriter,
52  * walwriter, walreceiver, bootstrapper and the shared memory checker code.
53  *
54  * This code is here just because of historical reasons.
55  */
56 void
58 {
60 
61  MyAuxProcType = auxtype;
62 
63  switch (MyAuxProcType)
64  {
65  case StartupProcess:
67  break;
68  case ArchiverProcess:
70  break;
71  case BgWriterProcess:
73  break;
76  break;
77  case WalWriterProcess:
79  break;
80  case WalReceiverProcess:
82  break;
83  default:
84  elog(ERROR, "something has gone wrong");
86  }
87 
88  init_ps_display(NULL);
89 
91  IgnoreSystemIndexes = true;
92 
93  /*
94  * As an auxiliary process, we aren't going to do the full InitPostgres
95  * pushups, but there are a couple of things that need to get lit up even
96  * in an auxiliary process.
97  */
98 
99  /*
100  * Create a PGPROC so we can use LWLocks. In the EXEC_BACKEND case, this
101  * was already done by SubPostmasterMain().
102  */
103 #ifndef EXEC_BACKEND
105 #endif
106 
107  BaseInit();
108 
109  /*
110  * Assign the ProcSignalSlot for an auxiliary process. Since it doesn't
111  * have a BackendId, the slot is statically allocated based on the
112  * auxiliary process type (MyAuxProcType). Backends use slots indexed in
113  * the range from 1 to MaxBackends (inclusive), so we use MaxBackends +
114  * AuxProcType + 1 as the index of the slot for an auxiliary process.
115  *
116  * This will need rethinking if we ever want more than one of a particular
117  * auxiliary process type.
118  */
120 
121  /*
122  * Auxiliary processes don't run transactions, but they may need a
123  * resource owner anyway to manage buffer pins acquired outside
124  * transactions (and, perhaps, other things in future).
125  */
127 
128 
129  /* Initialize backend status information */
130  pgstat_beinit();
131  pgstat_bestart();
132 
133  /* register a before-shutdown callback for LWLock cleanup */
135 
137 
138  switch (MyAuxProcType)
139  {
140  case StartupProcess:
142  proc_exit(1);
143 
144  case ArchiverProcess:
145  PgArchiverMain();
146  proc_exit(1);
147 
148  case BgWriterProcess:
150  proc_exit(1);
151 
152  case CheckpointerProcess:
154  proc_exit(1);
155 
156  case WalWriterProcess:
157  InitXLOGAccess();
158  WalWriterMain();
159  proc_exit(1);
160 
161  case WalReceiverProcess:
162  WalReceiverMain();
163  proc_exit(1);
164 
165  default:
166  elog(PANIC, "unrecognized process type: %d", (int) MyAuxProcType);
167  proc_exit(1);
168  }
169 }
170 
171 /*
172  * Begin shutdown of an auxiliary process. This is approximately the equivalent
173  * of ShutdownPostgres() in postinit.c. We can't run transactions in an
174  * auxiliary process, so most of the work of AbortTransaction() is not needed,
175  * but we do need to make sure we've released any LWLocks we are holding.
176  * (This is only critical during an error exit.)
177  */
178 static void
180 {
184 }
AuxProcType
Definition: miscadmin.h:429
void InitAuxiliaryProcess(void)
Definition: proc.c:517
static void pgstat_report_wait_end(void)
Definition: wait_event.h:274
void WalWriterMain(void)
Definition: walwriter.c:91
BackendType MyBackendType
Definition: miscinit.c:62
void StartupProcessMain(void)
Definition: startup.c:208
void proc_exit(int code)
Definition: ipc.c:104
#define SetProcessingMode(mode)
Definition: miscadmin.h:412
void BaseInit(void)
Definition: postinit.c:511
bool IgnoreSystemIndexes
Definition: miscinit.c:79
void pgstat_bestart(void)
#define PANIC
Definition: elog.h:50
void AuxiliaryProcessMain(AuxProcType auxtype)
Definition: auxprocess.c:57
void WalReceiverMain(void)
Definition: walreceiver.c:168
void ConditionVariableCancelSleep(void)
#define ERROR
Definition: elog.h:46
void InitXLOGAccess(void)
Definition: xlog.c:8594
int MaxBackends
Definition: globals.c:139
AuxProcType MyAuxProcType
Definition: auxprocess.c:45
bool IsUnderPostmaster
Definition: globals.c:112
void pgstat_beinit(void)
void before_shmem_exit(pg_on_exit_callback function, Datum arg)
Definition: ipc.c:333
void PgArchiverMain(void)
Definition: pgarch.c:168
uintptr_t Datum
Definition: postgres.h:411
void CheckpointerMain(void)
Definition: checkpointer.c:180
#define Assert(condition)
Definition: c.h:804
void CreateAuxProcessResourceOwner(void)
Definition: resowner.c:887
void BackgroundWriterMain(void)
Definition: bgwriter.c:91
void ProcSignalInit(int pss_idx)
Definition: procsignal.c:161
#define elog(elevel,...)
Definition: elog.h:232
void * arg
void init_ps_display(const char *fixed_part)
Definition: ps_status.c:258
void LWLockReleaseAll(void)
Definition: lwlock.c:1902
static void ShutdownAuxiliaryProcess(int code, Datum arg)
Definition: auxprocess.c:179