[PATCH 1 of 4] Core: fixed ENOSPC handling for error logs

Maxim Dounin mdounin at mdounin.ru
Sun Jun 16 03:23:58 UTC 2024


# HG changeset patch
# User Maxim Dounin <mdounin at mdounin.ru>
# Date 1718501944 -10800
#      Sun Jun 16 04:39:04 2024 +0300
# Node ID 1be15e0f5fe464710dd1a2d20cf4a3289149816c
# Parent  ea0eef2dd12c2d41349d63c532e942cf95fc4d7b
Core: fixed ENOSPC handling for error logs.

For each connection a new ngx_log_t structure is created, and saving
anything into disk_full_time field in this structure doesn't affect
other connections.  Fix is to move the disk_full_time field into the
ngx_open_file_t structure.

diff --git a/src/core/ngx_conf_file.c b/src/core/ngx_conf_file.c
--- a/src/core/ngx_conf_file.c
+++ b/src/core/ngx_conf_file.c
@@ -951,6 +951,7 @@ ngx_conf_open_file(ngx_cycle_t *cycle, n
         file->name = *name;
     }
 
+    file->disk_full_time = 0;
     file->flush = NULL;
     file->data = NULL;
 
diff --git a/src/core/ngx_conf_file.h b/src/core/ngx_conf_file.h
--- a/src/core/ngx_conf_file.h
+++ b/src/core/ngx_conf_file.h
@@ -90,6 +90,8 @@ struct ngx_open_file_s {
     ngx_fd_t              fd;
     ngx_str_t             name;
 
+    time_t                disk_full_time;
+
     void                (*flush)(ngx_open_file_t *file, ngx_log_t *log);
     void                 *data;
 };
diff --git a/src/core/ngx_log.c b/src/core/ngx_log.c
--- a/src/core/ngx_log.c
+++ b/src/core/ngx_log.c
@@ -169,7 +169,7 @@ ngx_log_error_core(ngx_uint_t level, ngx
             goto next;
         }
 
-        if (ngx_time() == log->disk_full_time) {
+        if (ngx_time() == log->file->disk_full_time) {
 
             /*
              * on FreeBSD writing to a full filesystem with enabled softupdates
@@ -183,7 +183,7 @@ ngx_log_error_core(ngx_uint_t level, ngx
         n = ngx_write_fd(log->file->fd, errstr, p - errstr);
 
         if (n == -1 && ngx_errno == NGX_ENOSPC) {
-            log->disk_full_time = ngx_time();
+            log->file->disk_full_time = ngx_time();
         }
 
         if (log->file->fd == ngx_stderr) {
diff --git a/src/core/ngx_log.h b/src/core/ngx_log.h
--- a/src/core/ngx_log.h
+++ b/src/core/ngx_log.h
@@ -53,8 +53,6 @@ struct ngx_log_s {
 
     ngx_atomic_uint_t    connection;
 
-    time_t               disk_full_time;
-
     ngx_log_handler_pt   handler;
     void                *data;
 




More information about the nginx-devel mailing list