summaryrefslogtreecommitdiffhomepage
path: root/src
diff options
context:
space:
mode:
authorValentin Bartenev <vbart@nginx.com>2017-08-30 03:10:13 +0300
committerValentin Bartenev <vbart@nginx.com>2017-08-30 03:10:13 +0300
commitf528cb393a137b5e9c34adb311d9addb3c5e1d78 (patch)
treefae9c1949cd76c15d481ea560d1d068b3a42cad2 /src
parente21dbf89e6d5569d1c9a93f41a21bcc240c64cf3 (diff)
downloadunit-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.
Diffstat (limited to 'src')
-rw-r--r--src/nxt_controller.c60
-rw-r--r--src/nxt_process.h4
-rw-r--r--src/nxt_worker_process.c20
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);