Using shared memory to pass configuration to main process.
This patch is required to remove fragmented messages functionality.
This commit is contained in:
@@ -1686,7 +1686,10 @@ nxt_controller_conf_handler(nxt_task_t *task, nxt_port_recv_msg_t *msg,
|
|||||||
static void
|
static void
|
||||||
nxt_controller_conf_store(nxt_task_t *task, nxt_conf_value_t *conf)
|
nxt_controller_conf_store(nxt_task_t *task, nxt_conf_value_t *conf)
|
||||||
{
|
{
|
||||||
|
void *mem;
|
||||||
|
u_char *end;
|
||||||
size_t size;
|
size_t size;
|
||||||
|
nxt_fd_t fd;
|
||||||
nxt_buf_t *b;
|
nxt_buf_t *b;
|
||||||
nxt_port_t *main_port;
|
nxt_port_t *main_port;
|
||||||
nxt_runtime_t *rt;
|
nxt_runtime_t *rt;
|
||||||
@@ -1697,14 +1700,38 @@ nxt_controller_conf_store(nxt_task_t *task, nxt_conf_value_t *conf)
|
|||||||
|
|
||||||
size = nxt_conf_json_length(conf, NULL);
|
size = nxt_conf_json_length(conf, NULL);
|
||||||
|
|
||||||
b = nxt_buf_mem_ts_alloc(task, task->thread->engine->mem_pool, size);
|
fd = nxt_shm_open(task, size);
|
||||||
|
if (nxt_slow_path(fd == -1)) {
|
||||||
if (nxt_fast_path(b != NULL)) {
|
return;
|
||||||
b->mem.free = nxt_conf_json_print(b->mem.free, conf, NULL);
|
|
||||||
|
|
||||||
(void) nxt_port_socket_write(task, main_port, NXT_PORT_MSG_CONF_STORE,
|
|
||||||
-1, 0, -1, b);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
mem = nxt_mem_mmap(NULL, size, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
|
||||||
|
if (nxt_slow_path(mem == MAP_FAILED)) {
|
||||||
|
goto fail;
|
||||||
|
}
|
||||||
|
|
||||||
|
end = nxt_conf_json_print(mem, conf, NULL);
|
||||||
|
|
||||||
|
nxt_mem_munmap(mem, size);
|
||||||
|
|
||||||
|
size = end - (u_char *) mem;
|
||||||
|
|
||||||
|
b = nxt_buf_mem_alloc(task->thread->engine->mem_pool, sizeof(size_t), 0);
|
||||||
|
if (nxt_slow_path(b == NULL)) {
|
||||||
|
goto fail;
|
||||||
|
}
|
||||||
|
|
||||||
|
b->mem.free = nxt_cpymem(b->mem.pos, &size, sizeof(size_t));
|
||||||
|
|
||||||
|
(void) nxt_port_socket_write(task, main_port,
|
||||||
|
NXT_PORT_MSG_CONF_STORE | NXT_PORT_MSG_CLOSE_FD,
|
||||||
|
fd, 0, -1, b);
|
||||||
|
|
||||||
|
return;
|
||||||
|
|
||||||
|
fail:
|
||||||
|
|
||||||
|
nxt_fd_close(fd);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -1408,12 +1408,45 @@ nxt_app_lang_compare(const void *v1, const void *v2)
|
|||||||
static void
|
static void
|
||||||
nxt_main_port_conf_store_handler(nxt_task_t *task, nxt_port_recv_msg_t *msg)
|
nxt_main_port_conf_store_handler(nxt_task_t *task, nxt_port_recv_msg_t *msg)
|
||||||
{
|
{
|
||||||
ssize_t n, size, offset;
|
void *p;
|
||||||
nxt_buf_t *b;
|
size_t size;
|
||||||
|
ssize_t n;
|
||||||
nxt_int_t ret;
|
nxt_int_t ret;
|
||||||
nxt_file_t file;
|
nxt_file_t file;
|
||||||
nxt_runtime_t *rt;
|
nxt_runtime_t *rt;
|
||||||
|
|
||||||
|
p = MAP_FAILED;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Ancient compilers like gcc 4.8.5 on CentOS 7 wants 'size' to be
|
||||||
|
* initialized in 'cleanup' section.
|
||||||
|
*/
|
||||||
|
size = 0;
|
||||||
|
|
||||||
|
if (nxt_slow_path(msg->fd[0] == -1)) {
|
||||||
|
nxt_alert(task, "conf_store_handler: invalid shm fd");
|
||||||
|
goto error;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (nxt_buf_mem_used_size(&msg->buf->mem) != sizeof(size_t)) {
|
||||||
|
nxt_alert(task, "conf_store_handler: unexpected buffer size (%d)",
|
||||||
|
(int) nxt_buf_mem_used_size(&msg->buf->mem));
|
||||||
|
goto error;
|
||||||
|
}
|
||||||
|
|
||||||
|
nxt_memcpy(&size, msg->buf->mem.pos, sizeof(size_t));
|
||||||
|
|
||||||
|
p = nxt_mem_mmap(NULL, size, PROT_READ, MAP_SHARED, msg->fd[0], 0);
|
||||||
|
|
||||||
|
nxt_fd_close(msg->fd[0]);
|
||||||
|
msg->fd[0] = -1;
|
||||||
|
|
||||||
|
if (nxt_slow_path(p == MAP_FAILED)) {
|
||||||
|
goto error;
|
||||||
|
}
|
||||||
|
|
||||||
|
nxt_debug(task, "conf_store_handler(%uz): %*s", size, size, p);
|
||||||
|
|
||||||
nxt_memzero(&file, sizeof(nxt_file_t));
|
nxt_memzero(&file, sizeof(nxt_file_t));
|
||||||
|
|
||||||
rt = task->thread->runtime;
|
rt = task->thread->runtime;
|
||||||
@@ -1427,33 +1460,35 @@ nxt_main_port_conf_store_handler(nxt_task_t *task, nxt_port_recv_msg_t *msg)
|
|||||||
goto error;
|
goto error;
|
||||||
}
|
}
|
||||||
|
|
||||||
offset = 0;
|
n = nxt_file_write(&file, p, size, 0);
|
||||||
|
|
||||||
for (b = msg->buf; b != NULL; b = b->next) {
|
|
||||||
size = nxt_buf_mem_used_size(&b->mem);
|
|
||||||
|
|
||||||
n = nxt_file_write(&file, b->mem.pos, size, offset);
|
|
||||||
|
|
||||||
if (nxt_slow_path(n != size)) {
|
|
||||||
nxt_file_close(task, &file);
|
|
||||||
(void) nxt_file_delete(file.name);
|
|
||||||
goto error;
|
|
||||||
}
|
|
||||||
|
|
||||||
offset += n;
|
|
||||||
}
|
|
||||||
|
|
||||||
nxt_file_close(task, &file);
|
nxt_file_close(task, &file);
|
||||||
|
|
||||||
|
if (nxt_slow_path(n != (ssize_t) size)) {
|
||||||
|
(void) nxt_file_delete(file.name);
|
||||||
|
goto error;
|
||||||
|
}
|
||||||
|
|
||||||
ret = nxt_file_rename(file.name, (nxt_file_name_t *) rt->conf);
|
ret = nxt_file_rename(file.name, (nxt_file_name_t *) rt->conf);
|
||||||
|
|
||||||
if (nxt_fast_path(ret == NXT_OK)) {
|
if (nxt_fast_path(ret == NXT_OK)) {
|
||||||
return;
|
goto cleanup;
|
||||||
}
|
}
|
||||||
|
|
||||||
error:
|
error:
|
||||||
|
|
||||||
nxt_alert(task, "failed to store current configuration");
|
nxt_alert(task, "failed to store current configuration");
|
||||||
|
|
||||||
|
cleanup:
|
||||||
|
|
||||||
|
if (p != MAP_FAILED) {
|
||||||
|
nxt_mem_munmap(p, size);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (msg->fd[0] != -1) {
|
||||||
|
nxt_fd_close(msg->fd[0]);
|
||||||
|
msg->fd[0] = -1;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user