Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020 #include "postgres.h"
00021
00022 #include <signal.h>
00023 #include <unistd.h>
00024
00025 #include "access/xlog.h"
00026 #include "libpq/pqsignal.h"
00027 #include "miscadmin.h"
00028 #include "postmaster/startup.h"
00029 #include "storage/ipc.h"
00030 #include "storage/latch.h"
00031 #include "storage/pmsignal.h"
00032 #include "storage/standby.h"
00033 #include "utils/guc.h"
00034 #include "utils/timeout.h"
00035
00036
00037
00038
00039
00040 static volatile sig_atomic_t got_SIGHUP = false;
00041 static volatile sig_atomic_t shutdown_requested = false;
00042 static volatile sig_atomic_t promote_triggered = false;
00043
00044
00045
00046
00047
00048 static volatile sig_atomic_t in_restore_command = false;
00049
00050
00051 static void startupproc_quickdie(SIGNAL_ARGS);
00052 static void StartupProcSigUsr1Handler(SIGNAL_ARGS);
00053 static void StartupProcTriggerHandler(SIGNAL_ARGS);
00054 static void StartupProcSigHupHandler(SIGNAL_ARGS);
00055
00056
00057
00058
00059
00060
00061
00062
00063
00064
00065
00066
00067
00068 static void
00069 startupproc_quickdie(SIGNAL_ARGS)
00070 {
00071 PG_SETMASK(&BlockSig);
00072
00073
00074
00075
00076
00077
00078
00079
00080
00081 on_exit_reset();
00082
00083
00084
00085
00086
00087
00088
00089
00090
00091 exit(2);
00092 }
00093
00094
00095
00096 static void
00097 StartupProcSigUsr1Handler(SIGNAL_ARGS)
00098 {
00099 int save_errno = errno;
00100
00101 latch_sigusr1_handler();
00102
00103 errno = save_errno;
00104 }
00105
00106
00107 static void
00108 StartupProcTriggerHandler(SIGNAL_ARGS)
00109 {
00110 int save_errno = errno;
00111
00112 promote_triggered = true;
00113 WakeupRecovery();
00114
00115 errno = save_errno;
00116 }
00117
00118
00119 static void
00120 StartupProcSigHupHandler(SIGNAL_ARGS)
00121 {
00122 int save_errno = errno;
00123
00124 got_SIGHUP = true;
00125 WakeupRecovery();
00126
00127 errno = save_errno;
00128 }
00129
00130
00131 static void
00132 StartupProcShutdownHandler(SIGNAL_ARGS)
00133 {
00134 int save_errno = errno;
00135
00136 if (in_restore_command)
00137 proc_exit(1);
00138 else
00139 shutdown_requested = true;
00140 WakeupRecovery();
00141
00142 errno = save_errno;
00143 }
00144
00145
00146 void
00147 HandleStartupProcInterrupts(void)
00148 {
00149
00150
00151
00152 if (got_SIGHUP)
00153 {
00154 got_SIGHUP = false;
00155 ProcessConfigFile(PGC_SIGHUP);
00156 }
00157
00158
00159
00160
00161 if (shutdown_requested)
00162 proc_exit(1);
00163
00164
00165
00166
00167
00168 if (IsUnderPostmaster && !PostmasterIsAlive())
00169 exit(1);
00170 }
00171
00172
00173
00174
00175
00176
00177 void
00178 StartupProcessMain(void)
00179 {
00180
00181
00182
00183
00184 #ifdef HAVE_SETSID
00185 if (setsid() < 0)
00186 elog(FATAL, "setsid() failed: %m");
00187 #endif
00188
00189
00190
00191
00192 pqsignal(SIGHUP, StartupProcSigHupHandler);
00193 pqsignal(SIGINT, SIG_IGN);
00194 pqsignal(SIGTERM, StartupProcShutdownHandler);
00195 pqsignal(SIGQUIT, startupproc_quickdie);
00196 InitializeTimeouts();
00197 pqsignal(SIGPIPE, SIG_IGN);
00198 pqsignal(SIGUSR1, StartupProcSigUsr1Handler);
00199 pqsignal(SIGUSR2, StartupProcTriggerHandler);
00200
00201
00202
00203
00204 pqsignal(SIGCHLD, SIG_DFL);
00205 pqsignal(SIGTTIN, SIG_DFL);
00206 pqsignal(SIGTTOU, SIG_DFL);
00207 pqsignal(SIGCONT, SIG_DFL);
00208 pqsignal(SIGWINCH, SIG_DFL);
00209
00210
00211
00212
00213 RegisterTimeout(STANDBY_DEADLOCK_TIMEOUT, StandbyDeadLockHandler);
00214 RegisterTimeout(STANDBY_TIMEOUT, StandbyTimeoutHandler);
00215
00216
00217
00218
00219 PG_SETMASK(&UnBlockSig);
00220
00221
00222
00223
00224 StartupXLOG();
00225
00226
00227
00228
00229
00230 proc_exit(0);
00231 }
00232
00233 void
00234 PreRestoreCommand(void)
00235 {
00236
00237
00238
00239
00240
00241
00242 in_restore_command = true;
00243 if (shutdown_requested)
00244 proc_exit(1);
00245 }
00246
00247 void
00248 PostRestoreCommand(void)
00249 {
00250 in_restore_command = false;
00251 }
00252
00253 bool
00254 IsPromoteTriggered(void)
00255 {
00256 return promote_triggered;
00257 }
00258
00259 void
00260 ResetPromoteTriggered(void)
00261 {
00262 promote_triggered = false;
00263 }