summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorMax Romanov <max.romanov@nginx.com>2021-11-25 16:58:43 +0300
committerMax Romanov <max.romanov@nginx.com>2021-11-25 16:58:43 +0300
commit1c0436d644c3a313096cd7d43c4148151c2193ee (patch)
treea8b48c74bad210b5e54c20f3eb334af9c8880b0b
parentaaa34e0a644912e49d7c5619749b67f585da9c85 (diff)
downloadunit-1c0436d644c3a313096cd7d43c4148151c2193ee.tar.gz
unit-1c0436d644c3a313096cd7d43c4148151c2193ee.tar.bz2
Fixing access_log structure reference counting.
The reference to the access_log structure is stored in the current nxt_router_conf_t and the global nxt_router_t. When the reference is copied, the reference counter should be adjusted accordingly. This closes #593 issue on GitHub.
-rw-r--r--docs/changes.xml7
-rw-r--r--src/nxt_router.c30
2 files changed, 33 insertions, 4 deletions
diff --git a/docs/changes.xml b/docs/changes.xml
index a40d87bb..80477889 100644
--- a/docs/changes.xml
+++ b/docs/changes.xml
@@ -31,6 +31,13 @@ NGINX Unit updated to 1.26.1.
date="" time=""
packager="Andrei Belov &lt;defan@nginx.com&gt;">
+<change type="bugfix">
+<para>
+the router process crash on reconfiguration if "access_log" was configured
+without listeners.
+</para>
+</change>
+
</changes>
diff --git a/src/nxt_router.c b/src/nxt_router.c
index 7623ccbb..85556a72 100644
--- a/src/nxt_router.c
+++ b/src/nxt_router.c
@@ -210,6 +210,8 @@ static void nxt_router_access_log_ready(nxt_task_t *task,
nxt_port_recv_msg_t *msg, void *data);
static void nxt_router_access_log_error(nxt_task_t *task,
nxt_port_recv_msg_t *msg, void *data);
+static void nxt_router_access_log_use(nxt_thread_spinlock_t *lock,
+ nxt_router_access_log_t *access_log);
static void nxt_router_access_log_release(nxt_task_t *task,
nxt_thread_spinlock_t *lock, nxt_router_access_log_t *access_log);
static void nxt_router_access_log_reopen_completion(nxt_task_t *task, void *obj,
@@ -1149,7 +1151,13 @@ nxt_router_conf_apply(nxt_task_t *task, void *obj, void *data)
nxt_queue_add(&router->sockets, &updating_sockets);
nxt_queue_add(&router->sockets, &creating_sockets);
- router->access_log = rtcf->access_log;
+ if (router->access_log != rtcf->access_log) {
+ nxt_router_access_log_use(&router->lock, rtcf->access_log);
+
+ nxt_router_access_log_release(task, &router->lock, router->access_log);
+
+ router->access_log = rtcf->access_log;
+ }
nxt_router_conf_ready(task, tmcf);
@@ -1971,9 +1979,7 @@ nxt_router_conf_create(nxt_task_t *task, nxt_router_temp_conf_t *tmcf,
access_log = router->access_log;
if (access_log != NULL && nxt_strstr_eq(&path, &access_log->path)) {
- nxt_thread_spin_lock(&router->lock);
- access_log->count++;
- nxt_thread_spin_unlock(&router->lock);
+ nxt_router_access_log_use(&router->lock, access_log);
} else {
access_log = nxt_malloc(sizeof(nxt_router_access_log_t)
@@ -3923,6 +3929,22 @@ nxt_router_access_log_error(nxt_task_t *task, nxt_port_recv_msg_t *msg,
static void
+nxt_router_access_log_use(nxt_thread_spinlock_t *lock,
+ nxt_router_access_log_t *access_log)
+{
+ if (access_log == NULL) {
+ return;
+ }
+
+ nxt_thread_spin_lock(lock);
+
+ access_log->count++;
+
+ nxt_thread_spin_unlock(lock);
+}
+
+
+static void
nxt_router_access_log_release(nxt_task_t *task, nxt_thread_spinlock_t *lock,
nxt_router_access_log_t *access_log)
{