Router: allowed empty configurations.

Now it's possible to delete "listeners" and "applications" objects.

This closes #187 issue on GitHub.
This commit is contained in:
Valentin Bartenev
2019-08-06 17:13:13 +03:00
parent 7fd9444728
commit 274260bd28

View File

@@ -1432,177 +1432,177 @@ nxt_router_conf_create(nxt_task_t *task, nxt_router_temp_conf_t *tmcf,
tmcf->router_conf->threads = nxt_ncpu; tmcf->router_conf->threads = nxt_ncpu;
} }
applications = nxt_conf_get_path(conf, &applications_path);
if (applications == NULL) {
nxt_alert(task, "no \"applications\" block");
return NXT_ERROR;
}
router = tmcf->router_conf->router; router = tmcf->router_conf->router;
next = 0; applications = nxt_conf_get_path(conf, &applications_path);
for ( ;; ) { if (applications != NULL) {
application = nxt_conf_next_object_member(applications, &name, &next); next = 0;
if (application == NULL) {
break;
}
nxt_debug(task, "application \"%V\"", &name); for ( ;; ) {
application = nxt_conf_next_object_member(applications, &name, &next);
if (application == NULL) {
break;
}
size = nxt_conf_json_length(application, NULL); nxt_debug(task, "application \"%V\"", &name);
app = nxt_malloc(sizeof(nxt_app_t) + name.length + size); size = nxt_conf_json_length(application, NULL);
if (app == NULL) {
goto fail;
}
nxt_memzero(app, sizeof(nxt_app_t)); app = nxt_malloc(sizeof(nxt_app_t) + name.length + size);
if (app == NULL) {
goto fail;
}
app->name.start = nxt_pointer_to(app, sizeof(nxt_app_t)); nxt_memzero(app, sizeof(nxt_app_t));
app->conf.start = nxt_pointer_to(app, sizeof(nxt_app_t) + name.length);
p = nxt_conf_json_print(app->conf.start, application, NULL); app->name.start = nxt_pointer_to(app, sizeof(nxt_app_t));
app->conf.length = p - app->conf.start; app->conf.start = nxt_pointer_to(app, sizeof(nxt_app_t)
+ name.length);
nxt_assert(app->conf.length <= size); p = nxt_conf_json_print(app->conf.start, application, NULL);
app->conf.length = p - app->conf.start;
nxt_debug(task, "application conf \"%V\"", &app->conf); nxt_assert(app->conf.length <= size);
prev = nxt_router_app_find(&router->apps, &name); nxt_debug(task, "application conf \"%V\"", &app->conf);
if (prev != NULL && nxt_strstr_eq(&app->conf, &prev->conf)) { prev = nxt_router_app_find(&router->apps, &name);
nxt_free(app);
nxt_queue_remove(&prev->link); if (prev != NULL && nxt_strstr_eq(&app->conf, &prev->conf)) {
nxt_queue_insert_tail(&tmcf->previous, &prev->link); nxt_free(app);
continue;
}
apcf.processes = 1; nxt_queue_remove(&prev->link);
apcf.max_processes = 1; nxt_queue_insert_tail(&tmcf->previous, &prev->link);
apcf.spare_processes = 0; continue;
apcf.timeout = 0; }
apcf.res_timeout = 1000;
apcf.idle_timeout = 15000;
apcf.requests = 0;
apcf.limits_value = NULL;
apcf.processes_value = NULL;
app_joint = nxt_malloc(sizeof(nxt_app_joint_t)); apcf.processes = 1;
if (nxt_slow_path(app_joint == NULL)) { apcf.max_processes = 1;
goto app_fail; apcf.spare_processes = 0;
} apcf.timeout = 0;
apcf.res_timeout = 1000;
apcf.idle_timeout = 15000;
apcf.requests = 0;
apcf.limits_value = NULL;
apcf.processes_value = NULL;
nxt_memzero(app_joint, sizeof(nxt_app_joint_t)); app_joint = nxt_malloc(sizeof(nxt_app_joint_t));
if (nxt_slow_path(app_joint == NULL)) {
ret = nxt_conf_map_object(mp, application, nxt_router_app_conf,
nxt_nitems(nxt_router_app_conf), &apcf);
if (ret != NXT_OK) {
nxt_alert(task, "application map error");
goto app_fail;
}
if (apcf.limits_value != NULL) {
if (nxt_conf_type(apcf.limits_value) != NXT_CONF_OBJECT) {
nxt_alert(task, "application limits is not object");
goto app_fail; goto app_fail;
} }
ret = nxt_conf_map_object(mp, apcf.limits_value, nxt_memzero(app_joint, sizeof(nxt_app_joint_t));
nxt_router_app_limits_conf,
nxt_nitems(nxt_router_app_limits_conf), ret = nxt_conf_map_object(mp, application, nxt_router_app_conf,
&apcf); nxt_nitems(nxt_router_app_conf), &apcf);
if (ret != NXT_OK) { if (ret != NXT_OK) {
nxt_alert(task, "application limits map error"); nxt_alert(task, "application map error");
goto app_fail; goto app_fail;
} }
}
if (apcf.processes_value != NULL if (apcf.limits_value != NULL) {
&& nxt_conf_type(apcf.processes_value) == NXT_CONF_OBJECT)
{ if (nxt_conf_type(apcf.limits_value) != NXT_CONF_OBJECT) {
ret = nxt_conf_map_object(mp, apcf.processes_value, nxt_alert(task, "application limits is not object");
nxt_router_app_processes_conf, goto app_fail;
nxt_nitems(nxt_router_app_processes_conf), }
&apcf);
ret = nxt_conf_map_object(mp, apcf.limits_value,
nxt_router_app_limits_conf,
nxt_nitems(nxt_router_app_limits_conf),
&apcf);
if (ret != NXT_OK) {
nxt_alert(task, "application limits map error");
goto app_fail;
}
}
if (apcf.processes_value != NULL
&& nxt_conf_type(apcf.processes_value) == NXT_CONF_OBJECT)
{
ret = nxt_conf_map_object(mp, apcf.processes_value,
nxt_router_app_processes_conf,
nxt_nitems(nxt_router_app_processes_conf),
&apcf);
if (ret != NXT_OK) {
nxt_alert(task, "application processes map error");
goto app_fail;
}
} else {
apcf.max_processes = apcf.processes;
apcf.spare_processes = apcf.processes;
}
nxt_debug(task, "application type: %V", &apcf.type);
nxt_debug(task, "application processes: %D", apcf.processes);
nxt_debug(task, "application request timeout: %M", apcf.timeout);
nxt_debug(task, "application reschedule timeout: %M",
apcf.res_timeout);
nxt_debug(task, "application requests: %D", apcf.requests);
lang = nxt_app_lang_module(task->thread->runtime, &apcf.type);
if (lang == NULL) {
nxt_alert(task, "unknown application type: \"%V\"", &apcf.type);
goto app_fail;
}
nxt_debug(task, "application language module: \"%s\"", lang->file);
ret = nxt_thread_mutex_create(&app->mutex);
if (ret != NXT_OK) { if (ret != NXT_OK) {
nxt_alert(task, "application processes map error");
goto app_fail; goto app_fail;
} }
} else { nxt_queue_init(&app->ports);
apcf.max_processes = apcf.processes; nxt_queue_init(&app->spare_ports);
apcf.spare_processes = apcf.processes; nxt_queue_init(&app->idle_ports);
nxt_queue_init(&app->requests);
nxt_queue_init(&app->pending);
app->name.length = name.length;
nxt_memcpy(app->name.start, name.start, name.length);
app->type = lang->type;
app->max_processes = apcf.max_processes;
app->spare_processes = apcf.spare_processes;
app->max_pending_processes = apcf.spare_processes
? apcf.spare_processes : 1;
app->timeout = apcf.timeout;
app->res_timeout = apcf.res_timeout * 1000000;
app->idle_timeout = apcf.idle_timeout;
app->max_pending_responses = 2;
app->max_requests = apcf.requests;
engine = task->thread->engine;
app->engine = engine;
app->adjust_idle_work.handler = nxt_router_adjust_idle_timer;
app->adjust_idle_work.task = &engine->task;
app->adjust_idle_work.obj = app;
nxt_queue_insert_tail(&tmcf->apps, &app->link);
nxt_router_app_use(task, app, 1);
app->joint = app_joint;
app_joint->use_count = 1;
app_joint->app = app;
app_joint->idle_timer.bias = NXT_TIMER_DEFAULT_BIAS;
app_joint->idle_timer.work_queue = &engine->fast_work_queue;
app_joint->idle_timer.handler = nxt_router_app_idle_timeout;
app_joint->idle_timer.task = &engine->task;
app_joint->idle_timer.log = app_joint->idle_timer.task->log;
app_joint->free_app_work.handler = nxt_router_free_app;
app_joint->free_app_work.task = &engine->task;
app_joint->free_app_work.obj = app_joint;
} }
nxt_debug(task, "application type: %V", &apcf.type);
nxt_debug(task, "application processes: %D", apcf.processes);
nxt_debug(task, "application request timeout: %M", apcf.timeout);
nxt_debug(task, "application reschedule timeout: %M", apcf.res_timeout);
nxt_debug(task, "application requests: %D", apcf.requests);
lang = nxt_app_lang_module(task->thread->runtime, &apcf.type);
if (lang == NULL) {
nxt_alert(task, "unknown application type: \"%V\"", &apcf.type);
goto app_fail;
}
nxt_debug(task, "application language module: \"%s\"", lang->file);
ret = nxt_thread_mutex_create(&app->mutex);
if (ret != NXT_OK) {
goto app_fail;
}
nxt_queue_init(&app->ports);
nxt_queue_init(&app->spare_ports);
nxt_queue_init(&app->idle_ports);
nxt_queue_init(&app->requests);
nxt_queue_init(&app->pending);
app->name.length = name.length;
nxt_memcpy(app->name.start, name.start, name.length);
app->type = lang->type;
app->max_processes = apcf.max_processes;
app->spare_processes = apcf.spare_processes;
app->max_pending_processes = apcf.spare_processes
? apcf.spare_processes : 1;
app->timeout = apcf.timeout;
app->res_timeout = apcf.res_timeout * 1000000;
app->idle_timeout = apcf.idle_timeout;
app->max_pending_responses = 2;
app->max_requests = apcf.requests;
engine = task->thread->engine;
app->engine = engine;
app->adjust_idle_work.handler = nxt_router_adjust_idle_timer;
app->adjust_idle_work.task = &engine->task;
app->adjust_idle_work.obj = app;
nxt_queue_insert_tail(&tmcf->apps, &app->link);
nxt_router_app_use(task, app, 1);
app->joint = app_joint;
app_joint->use_count = 1;
app_joint->app = app;
app_joint->idle_timer.bias = NXT_TIMER_DEFAULT_BIAS;
app_joint->idle_timer.work_queue = &engine->fast_work_queue;
app_joint->idle_timer.handler = nxt_router_app_idle_timeout;
app_joint->idle_timer.task = &engine->task;
app_joint->idle_timer.log = app_joint->idle_timer.task->log;
app_joint->free_app_work.handler = nxt_router_free_app;
app_joint->free_app_work.task = &engine->task;
app_joint->free_app_work.obj = app_joint;
} }
routes_conf = nxt_conf_get_path(conf, &routes_path); routes_conf = nxt_conf_get_path(conf, &routes_path);
@@ -1623,86 +1623,84 @@ nxt_router_conf_create(nxt_task_t *task, nxt_router_temp_conf_t *tmcf,
#endif #endif
listeners = nxt_conf_get_path(conf, &listeners_path); listeners = nxt_conf_get_path(conf, &listeners_path);
if (listeners == NULL) {
nxt_alert(task, "no \"listeners\" block");
return NXT_ERROR;
}
next = 0; if (listeners != NULL) {
next = 0;
for ( ;; ) { for ( ;; ) {
listener = nxt_conf_next_object_member(listeners, &name, &next); listener = nxt_conf_next_object_member(listeners, &name, &next);
if (listener == NULL) { if (listener == NULL) {
break; break;
} }
skcf = nxt_router_socket_conf(task, tmcf, &name); skcf = nxt_router_socket_conf(task, tmcf, &name);
if (skcf == NULL) { if (skcf == NULL) {
goto fail;
}
nxt_memzero(&lscf, sizeof(lscf));
ret = nxt_conf_map_object(mp, listener, nxt_router_listener_conf,
nxt_nitems(nxt_router_listener_conf), &lscf);
if (ret != NXT_OK) {
nxt_alert(task, "listener map error");
goto fail;
}
nxt_debug(task, "application: %V", &lscf.application);
// STUB, default values if http block is not defined.
skcf->header_buffer_size = 2048;
skcf->large_header_buffer_size = 8192;
skcf->large_header_buffers = 4;
skcf->body_buffer_size = 16 * 1024;
skcf->max_body_size = 8 * 1024 * 1024;
skcf->idle_timeout = 180 * 1000;
skcf->header_read_timeout = 30 * 1000;
skcf->body_read_timeout = 30 * 1000;
skcf->send_timeout = 30 * 1000;
if (http != NULL) {
ret = nxt_conf_map_object(mp, http, nxt_router_http_conf,
nxt_nitems(nxt_router_http_conf), skcf);
if (ret != NXT_OK) {
nxt_alert(task, "http map error");
goto fail; goto fail;
} }
}
nxt_memzero(&lscf, sizeof(lscf));
ret = nxt_conf_map_object(mp, listener, nxt_router_listener_conf,
nxt_nitems(nxt_router_listener_conf),
&lscf);
if (ret != NXT_OK) {
nxt_alert(task, "listener map error");
goto fail;
}
nxt_debug(task, "application: %V", &lscf.application);
// STUB, default values if http block is not defined.
skcf->header_buffer_size = 2048;
skcf->large_header_buffer_size = 8192;
skcf->large_header_buffers = 4;
skcf->body_buffer_size = 16 * 1024;
skcf->max_body_size = 8 * 1024 * 1024;
skcf->idle_timeout = 180 * 1000;
skcf->header_read_timeout = 30 * 1000;
skcf->body_read_timeout = 30 * 1000;
skcf->send_timeout = 30 * 1000;
if (http != NULL) {
ret = nxt_conf_map_object(mp, http, nxt_router_http_conf,
nxt_nitems(nxt_router_http_conf),
skcf);
if (ret != NXT_OK) {
nxt_alert(task, "http map error");
goto fail;
}
}
#if (NXT_TLS) #if (NXT_TLS)
value = nxt_conf_get_path(listener, &certificate_path);
value = nxt_conf_get_path(listener, &certificate_path); if (value != NULL) {
nxt_conf_get_string(value, &name);
if (value != NULL) { tls = nxt_mp_get(mp, sizeof(nxt_router_tlssock_t));
nxt_conf_get_string(value, &name); if (nxt_slow_path(tls == NULL)) {
goto fail;
}
tls = nxt_mp_get(mp, sizeof(nxt_router_tlssock_t)); tls->name = name;
if (nxt_slow_path(tls == NULL)) { tls->conf = skcf;
goto fail;
nxt_queue_insert_tail(&tmcf->tls, &tls->link);
} }
tls->name = name;
tls->conf = skcf;
nxt_queue_insert_tail(&tmcf->tls, &tls->link);
}
#endif #endif
skcf->listen->handler = nxt_http_conn_init; skcf->listen->handler = nxt_http_conn_init;
skcf->router_conf = tmcf->router_conf; skcf->router_conf = tmcf->router_conf;
skcf->router_conf->count++; skcf->router_conf->count++;
if (lscf.pass.length != 0) { if (lscf.pass.length != 0) {
skcf->pass = nxt_http_pass_create(task, tmcf, &lscf.pass); skcf->pass = nxt_http_pass_create(task, tmcf, &lscf.pass);
/* COMPATIBILITY: listener application. */ /* COMPATIBILITY: listener application. */
} else if (lscf.application.length > 0) { } else if (lscf.application.length > 0) {
skcf->pass = nxt_http_pass_application(task, tmcf, skcf->pass = nxt_http_pass_application(task, tmcf,
&lscf.application); &lscf.application);
}
} }
} }