Differentiate between normal shutdown and fatal.

The parent process never differentiated between a worker process
asking for a shutdown or a worker process calling fatalx() when
it came to its exit code.

I made some changes here so the parent process will exit with
an exit code 1 if anything worker related went wrong (fatalx/death policy).
This commit is contained in:
Joris Vink 2022-08-08 11:02:27 +02:00
parent 7316f372d1
commit e2fcedfaec
5 changed files with 21 additions and 11 deletions

View File

@ -79,6 +79,11 @@ typedef void KORE_PRIVATE_KEY;
#define KORE_RSAKEY_BITS 4096 #define KORE_RSAKEY_BITS 4096
/* Kore quit reasons. */
#define KORE_QUIT_NONE -1
#define KORE_QUIT_NORMAL 0
#define KORE_QUIT_FATAL 1
#define KORE_RESULT_ERROR 0 #define KORE_RESULT_ERROR 0
#define KORE_RESULT_OK 1 #define KORE_RESULT_OK 1
#define KORE_RESULT_RETRY 2 #define KORE_RESULT_RETRY 2
@ -672,6 +677,7 @@ struct kore_timer {
#define KORE_MSG_ACCEPT_AVAILABLE 10 #define KORE_MSG_ACCEPT_AVAILABLE 10
#define KORE_PYTHON_SEND_OBJ 11 #define KORE_PYTHON_SEND_OBJ 11
#define KORE_MSG_WORKER_LOG 12 #define KORE_MSG_WORKER_LOG 12
#define KORE_MSG_FATALX 13
#define KORE_MSG_ACME_BASE 100 #define KORE_MSG_ACME_BASE 100
/* messages for applications should start at 201. */ /* messages for applications should start at 201. */

View File

@ -54,7 +54,6 @@ volatile sig_atomic_t sig_recv;
struct kore_server_list kore_servers; struct kore_server_list kore_servers;
u_int8_t nlisteners; u_int8_t nlisteners;
int kore_argc = 0; int kore_argc = 0;
int kore_quit = 0;
pid_t kore_pid = -1; pid_t kore_pid = -1;
u_int16_t cpu_count = 1; u_int16_t cpu_count = 1;
int kore_debug = 0; int kore_debug = 0;
@ -66,6 +65,7 @@ char **kore_argv = NULL;
int kore_foreground = 0; int kore_foreground = 0;
char *kore_progname = NULL; char *kore_progname = NULL;
u_int32_t kore_socket_backlog = 5000; u_int32_t kore_socket_backlog = 5000;
int kore_quit = KORE_QUIT_NONE;
char *kore_pidfile = KORE_PIDFILE_DEFAULT; char *kore_pidfile = KORE_PIDFILE_DEFAULT;
struct kore_privsep worker_privsep; struct kore_privsep worker_privsep;
@ -295,7 +295,7 @@ main(int argc, char *argv[])
kore_mem_cleanup(); kore_mem_cleanup();
return (0); return (kore_quit);
} }
void void
@ -910,7 +910,7 @@ kore_server_start(int argc, char *argv[])
kore_msg_unregister(KORE_PYTHON_SEND_OBJ); kore_msg_unregister(KORE_PYTHON_SEND_OBJ);
#endif #endif
while (kore_quit != 1) { while (kore_quit == KORE_QUIT_NONE) {
last_sig = sig_recv; last_sig = sig_recv;
if (last_sig != 0) { if (last_sig != 0) {
@ -922,7 +922,7 @@ kore_server_start(int argc, char *argv[])
case SIGINT: case SIGINT:
case SIGQUIT: case SIGQUIT:
case SIGTERM: case SIGTERM:
kore_quit = 1; kore_quit = KORE_QUIT_NORMAL;
kore_worker_dispatch_signal(last_sig); kore_worker_dispatch_signal(last_sig);
continue; continue;
case SIGUSR1: case SIGUSR1:

View File

@ -64,6 +64,7 @@ kore_msg_parent_init(void)
kore_msg_parent_add(kw); kore_msg_parent_add(kw);
} }
kore_msg_register(KORE_MSG_FATALX, msg_type_shutdown);
kore_msg_register(KORE_MSG_SHUTDOWN, msg_type_shutdown); kore_msg_register(KORE_MSG_SHUTDOWN, msg_type_shutdown);
} }
@ -273,7 +274,10 @@ msg_type_shutdown(struct kore_msg *msg, const void *data)
"shutdown requested by worker %u, going down", msg->src); "shutdown requested by worker %u, going down", msg->src);
} }
kore_quit = 1; if (msg->id == KORE_MSG_FATALX)
kore_quit = KORE_QUIT_FATAL;
else
kore_quit = KORE_QUIT_NORMAL;
} }
#if !defined(KORE_NO_HTTP) #if !defined(KORE_NO_HTTP)

View File

@ -560,7 +560,7 @@ fatalx(const char *fmt, ...)
/* In case people call fatalx() from the parent context. */ /* In case people call fatalx() from the parent context. */
if (worker != NULL) if (worker != NULL)
kore_msg_send(KORE_MSG_PARENT, KORE_MSG_SHUTDOWN, NULL, 0); kore_msg_send(KORE_MSG_PARENT, KORE_MSG_FATALX, NULL, 0);
va_start(args, fmt); va_start(args, fmt);
fatal_log(fmt, args); fatal_log(fmt, args);
@ -575,7 +575,7 @@ fatal_log(const char *fmt, va_list args)
char buf[2048]; char buf[2048];
(void)vsnprintf(buf, sizeof(buf), fmt, args); (void)vsnprintf(buf, sizeof(buf), fmt, args);
kore_log(LOG_ERR, "FATAL: %s", buf); kore_log(LOG_ERR, "fatal: %s", buf);
if (worker != NULL && worker->id == KORE_WORKER_KEYMGR) if (worker != NULL && worker->id == KORE_WORKER_KEYMGR)
kore_keymgr_cleanup(1); kore_keymgr_cleanup(1);

View File

@ -897,7 +897,7 @@ worker_reaper(pid_t pid, int status)
kore_log(LOG_CRIT, kore_log(LOG_CRIT,
"keymgr or acme process gone, stopping"); "keymgr or acme process gone, stopping");
kw->pid = 0; kw->pid = 0;
kore_quit = 1; kore_quit = KORE_QUIT_FATAL;
break; break;
} }
@ -919,17 +919,17 @@ worker_reaper(pid_t pid, int status)
kw->pid = 0; kw->pid = 0;
kore_log(LOG_NOTICE, kore_log(LOG_NOTICE,
"worker policy is 'terminate', stopping"); "worker policy is 'terminate', stopping");
kore_quit = 1; kore_quit = KORE_QUIT_FATAL;
break; break;
} }
if (kore_quit == 0) { if (kore_quit == KORE_QUIT_NONE) {
kore_log(LOG_NOTICE, "restarting worker %d", kw->id); kore_log(LOG_NOTICE, "restarting worker %d", kw->id);
kw->restarted = 1; kw->restarted = 1;
kore_msg_parent_remove(kw); kore_msg_parent_remove(kw);
if (!kore_worker_spawn(idx, kw->id, kw->cpu)) { if (!kore_worker_spawn(idx, kw->id, kw->cpu)) {
kore_quit = 1; kore_quit = KORE_QUIT_FATAL;
kore_log(LOG_ERR, "failed to restart worker"); kore_log(LOG_ERR, "failed to restart worker");
} else { } else {
kore_msg_parent_add(kw); kore_msg_parent_add(kw);