Router: fixed segmentation fault.

The router process exited abnormally on reconfiguration if number
of worker threads had been decreased on the previous reconfiguration.
Besides the list of router engines should be updated only after a new
configuration joints have been prepared for all engines.
This commit is contained in:
Igor Sysoev
2017-09-14 22:30:38 +03:00
parent 4953e5b5cb
commit 309ba5abf2
2 changed files with 38 additions and 10 deletions

View File

@@ -101,8 +101,10 @@ static nxt_int_t nxt_router_thread_create(nxt_task_t *task, nxt_runtime_t *rt,
static void nxt_router_apps_sort(nxt_router_t *router, static void nxt_router_apps_sort(nxt_router_t *router,
nxt_router_temp_conf_t *tmcf); nxt_router_temp_conf_t *tmcf);
static void nxt_router_engines_post(nxt_router_temp_conf_t *tmcf); static void nxt_router_engines_post(nxt_router_t *router,
static void nxt_router_engine_post(nxt_router_engine_conf_t *recf); nxt_router_temp_conf_t *tmcf);
static void nxt_router_engine_post(nxt_event_engine_t *engine,
nxt_work_t *jobs);
static void nxt_router_app_data_handler(nxt_task_t *task, static void nxt_router_app_data_handler(nxt_task_t *task,
nxt_port_recv_msg_t *msg); nxt_port_recv_msg_t *msg);
@@ -500,7 +502,7 @@ nxt_router_conf_apply(nxt_task_t *task, void *obj, void *data)
nxt_router_apps_sort(router, tmcf); nxt_router_apps_sort(router, tmcf);
nxt_router_engines_post(tmcf); nxt_router_engines_post(router, tmcf);
nxt_queue_add(&router->sockets, &tmcf->updating); nxt_queue_add(&router->sockets, &tmcf->updating);
nxt_queue_add(&router->sockets, &tmcf->creating); nxt_queue_add(&router->sockets, &tmcf->creating);
@@ -1181,9 +1183,11 @@ nxt_router_engines_create(nxt_task_t *task, nxt_router_t *router,
recf->engine = nxt_queue_link_data(qlk, nxt_event_engine_t, link0); recf->engine = nxt_queue_link_data(qlk, nxt_event_engine_t, link0);
if (n < threads) { if (n < threads) {
recf->action = NXT_ROUTER_ENGINE_KEEP;
ret = nxt_router_engine_conf_update(tmcf, recf); ret = nxt_router_engine_conf_update(tmcf, recf);
} else { } else {
recf->action = NXT_ROUTER_ENGINE_DELETE;
ret = nxt_router_engine_conf_delete(tmcf, recf); ret = nxt_router_engine_conf_delete(tmcf, recf);
} }
@@ -1202,6 +1206,8 @@ nxt_router_engines_create(nxt_task_t *task, nxt_router_t *router,
return NXT_ERROR; return NXT_ERROR;
} }
recf->action = NXT_ROUTER_ENGINE_ADD;
recf->engine = nxt_event_engine_create(task, interface, NULL, 0, 0); recf->engine = nxt_event_engine_create(task, interface, NULL, 0, 0);
if (nxt_slow_path(recf->engine == NULL)) { if (nxt_slow_path(recf->engine == NULL)) {
return NXT_ERROR; return NXT_ERROR;
@@ -1212,8 +1218,6 @@ nxt_router_engines_create(nxt_task_t *task, nxt_router_t *router,
return ret; return ret;
} }
nxt_queue_insert_tail(&router->engines, &recf->engine->link0);
n++; n++;
} }
@@ -1533,30 +1537,48 @@ nxt_router_apps_sort(nxt_router_t *router, nxt_router_temp_conf_t *tmcf)
static void static void
nxt_router_engines_post(nxt_router_temp_conf_t *tmcf) nxt_router_engines_post(nxt_router_t *router, nxt_router_temp_conf_t *tmcf)
{ {
nxt_uint_t n; nxt_uint_t n;
nxt_event_engine_t *engine;
nxt_router_engine_conf_t *recf; nxt_router_engine_conf_t *recf;
recf = tmcf->engines->elts; recf = tmcf->engines->elts;
for (n = tmcf->engines->nelts; n != 0; n--) { for (n = tmcf->engines->nelts; n != 0; n--) {
nxt_router_engine_post(recf); engine = recf->engine;
nxt_router_engine_post(engine, recf->jobs);
switch (recf->action) {
case NXT_ROUTER_ENGINE_KEEP:
break;
case NXT_ROUTER_ENGINE_ADD:
nxt_queue_insert_tail(&router->engines, &engine->link0);
break;
case NXT_ROUTER_ENGINE_DELETE:
nxt_queue_remove(&engine->link0);
break;
}
recf++; recf++;
} }
} }
static void static void
nxt_router_engine_post(nxt_router_engine_conf_t *recf) nxt_router_engine_post(nxt_event_engine_t *engine, nxt_work_t *jobs)
{ {
nxt_work_t *work, *next; nxt_work_t *work, *next;
for (work = recf->jobs; work != NULL; work = next) { for (work = jobs; work != NULL; work = next) {
next = work->next; next = work->next;
work->next = NULL; work->next = NULL;
nxt_event_engine_post(recf->engine, work); nxt_event_engine_post(engine, work);
} }
} }

View File

@@ -34,6 +34,12 @@ typedef struct {
typedef struct { typedef struct {
nxt_event_engine_t *engine; nxt_event_engine_t *engine;
nxt_work_t *jobs; nxt_work_t *jobs;
enum {
NXT_ROUTER_ENGINE_KEEP = 0,
NXT_ROUTER_ENGINE_ADD,
NXT_ROUTER_ENGINE_DELETE,
} action;
} nxt_router_engine_conf_t; } nxt_router_engine_conf_t;