diff options
author | Valentin Bartenev <vbart@nginx.com> | 2017-08-30 03:10:13 +0300 |
---|---|---|
committer | Valentin Bartenev <vbart@nginx.com> | 2017-08-30 03:10:13 +0300 |
commit | f528cb393a137b5e9c34adb311d9addb3c5e1d78 (patch) | |
tree | fae9c1949cd76c15d481ea560d1d068b3a42cad2 | |
parent | e21dbf89e6d5569d1c9a93f41a21bcc240c64cf3 (diff) | |
download | unit-f528cb393a137b5e9c34adb311d9addb3c5e1d78.tar.gz unit-f528cb393a137b5e9c34adb311d9addb3c5e1d78.tar.bz2 |
Controller: waiting for router before start to accept connections.
Previously, reconfiguration might fail right after the daemon start
if the router process wasn't ready yet.
-rw-r--r-- | src/nxt_controller.c | 60 | ||||
-rw-r--r-- | src/nxt_process.h | 4 | ||||
-rw-r--r-- | src/nxt_worker_process.c | 20 |
3 files changed, 53 insertions, 31 deletions
diff --git a/src/nxt_controller.c b/src/nxt_controller.c index 236d5265..7aea4c91 100644 --- a/src/nxt_controller.c +++ b/src/nxt_controller.c @@ -38,6 +38,9 @@ typedef struct { } nxt_controller_response_t; +static void nxt_controller_process_new_port_handler(nxt_task_t *task, + nxt_port_recv_msg_t *msg); + static void nxt_controller_conn_init(nxt_task_t *task, void *obj, void *data); static void nxt_controller_conn_read(nxt_task_t *task, void *obj, void *data); static nxt_msec_t nxt_controller_conn_timeout_value(nxt_conn_t *c, @@ -90,17 +93,28 @@ static const nxt_event_conn_state_t nxt_controller_conn_write_state; static const nxt_event_conn_state_t nxt_controller_conn_close_state; +nxt_port_handler_t nxt_controller_process_port_handlers[] = { + nxt_worker_process_quit_handler, + nxt_controller_process_new_port_handler, + nxt_port_change_log_file_handler, + nxt_port_mmap_handler, + nxt_port_data_handler, + nxt_port_remove_pid_handler, + NULL, /* NXT_PORT_MSG_READY */ + NULL, /* NXT_PORT_MSG_START_WORKER */ + NULL, /* NXT_PORT_MSG_SOCKET */ + NULL, /* NXT_PORT_MSG_MODULES */ + nxt_port_rpc_handler, + nxt_port_rpc_handler, +}; + + nxt_int_t nxt_controller_start(nxt_task_t *task, void *data) { - nxt_mp_t *mp; nxt_runtime_t *rt; - nxt_conf_value_t *conf; nxt_http_fields_hash_t *hash; - static const nxt_str_t json - = nxt_string("{ \"listeners\": {}, \"applications\": {} }"); - rt = task->thread->runtime; hash = nxt_http_fields_hash_create(nxt_controller_request_fields, @@ -110,29 +124,51 @@ nxt_controller_start(nxt_task_t *task, void *data) } nxt_controller_fields_hash = hash; + nxt_queue_init(&nxt_controller_waiting_requests); - if (nxt_listen_event(task, rt->controller_socket) == NULL) { - return NXT_ERROR; + return NXT_OK; +} + + +static void +nxt_controller_process_new_port_handler(nxt_task_t *task, + nxt_port_recv_msg_t *msg) +{ + nxt_mp_t *mp; + nxt_runtime_t *rt; + nxt_conf_value_t *conf; + + static const nxt_str_t json + = nxt_string("{ \"listeners\": {}, \"applications\": {} }"); + + nxt_port_new_port_handler(task, msg); + + if (nxt_controller_conf.root != NULL + || msg->new_port->type != NXT_PROCESS_ROUTER) + { + return; } mp = nxt_mp_create(1024, 128, 256, 32); if (nxt_slow_path(mp == NULL)) { - return NXT_ERROR; + nxt_abort(); } conf = nxt_conf_json_parse_str(mp, &json); - if (conf == NULL) { - return NXT_ERROR; + if (nxt_slow_path(conf == NULL)) { + nxt_abort(); } nxt_controller_conf.root = conf; nxt_controller_conf.pool = mp; - nxt_queue_init(&nxt_controller_waiting_requests); + rt = task->thread->runtime; - return NXT_OK; + if (nxt_slow_path(nxt_listen_event(task, rt->controller_socket) == NULL)) { + nxt_abort(); + } } diff --git a/src/nxt_process.h b/src/nxt_process.h index 8b949853..2d1080cc 100644 --- a/src/nxt_process.h +++ b/src/nxt_process.h @@ -98,6 +98,10 @@ nxt_port_t *nxt_process_connected_port_find(nxt_process_t *process, nxt_pid_t pid, nxt_port_id_t port_id); +void nxt_worker_process_quit_handler(nxt_task_t *task, + nxt_port_recv_msg_t *msg); + + #if (NXT_HAVE_SETPROCTITLE) #define nxt_process_title(task, fmt, ...) \ diff --git a/src/nxt_worker_process.c b/src/nxt_worker_process.c index 0d7ae796..6804f8ab 100644 --- a/src/nxt_worker_process.c +++ b/src/nxt_worker_process.c @@ -12,8 +12,6 @@ static void nxt_worker_process_quit(nxt_task_t *task); -static void nxt_worker_process_quit_handler(nxt_task_t *task, - nxt_port_recv_msg_t *msg); static void nxt_worker_process_signal_handler(nxt_task_t *task, void *obj, void *data); static void nxt_worker_process_sigterm_handler(nxt_task_t *task, void *obj, @@ -22,22 +20,6 @@ static void nxt_worker_process_sigquit_handler(nxt_task_t *task, void *obj, void *data); -nxt_port_handler_t nxt_controller_process_port_handlers[] = { - nxt_worker_process_quit_handler, - nxt_port_new_port_handler, - nxt_port_change_log_file_handler, - nxt_port_mmap_handler, - nxt_port_data_handler, - nxt_port_remove_pid_handler, - NULL, /* NXT_PORT_MSG_READY */ - NULL, /* NXT_PORT_MSG_START_WORKER */ - NULL, /* NXT_PORT_MSG_SOCKET */ - NULL, /* NXT_PORT_MSG_MODULES */ - nxt_port_rpc_handler, - nxt_port_rpc_handler, -}; - - nxt_port_handler_t nxt_worker_process_port_handlers[] = { nxt_worker_process_quit_handler, nxt_port_new_port_handler, @@ -169,7 +151,7 @@ nxt_worker_process_signal_handler(nxt_task_t *task, void *obj, void *data) } -static void +void nxt_worker_process_quit_handler(nxt_task_t *task, nxt_port_recv_msg_t *msg) { nxt_worker_process_quit(task); |