diff options
Diffstat (limited to 'src/http/modules/ngx_http_log_module.c')
-rw-r--r-- | src/http/modules/ngx_http_log_module.c | 28 |
1 files changed, 26 insertions, 2 deletions
diff --git a/src/http/modules/ngx_http_log_module.c b/src/http/modules/ngx_http_log_module.c index 9436e5983..07ac113a4 100644 --- a/src/http/modules/ngx_http_log_module.c +++ b/src/http/modules/ngx_http_log_module.c @@ -23,6 +23,7 @@ typedef struct { typedef struct { ngx_open_file_t *file; + time_t disk_full_time; ngx_array_t *ops; /* array of ngx_http_log_op_t */ } ngx_http_log_t; @@ -253,6 +254,17 @@ ngx_http_log_handler(ngx_http_request_t *r) log = lcf->logs->elts; for (l = 0; l < lcf->logs->nelts; l++) { + if (ngx_time() == log[l].disk_full_time) { + + /* + * On FreeBSD writing to a full filesystem with enabled softupdates + * may block process for much longer time than writing to non-full + * filesystem, so we skip writing the log for one second. + */ + + continue; + } + len = 0; op = log[l].ops->elts; for (i = 0; i < log[l].ops->nelts; i++) { @@ -272,7 +284,13 @@ ngx_http_log_handler(ngx_http_request_t *r) if (len > (size_t) (file->last - file->pos)) { - ngx_write_fd(file->fd, file->buffer, file->pos - file->buffer); + if (ngx_write_fd(file->fd, file->buffer, + file->pos - file->buffer) + == -1 + && ngx_errno == NGX_ENOSPC) + { + log[l].disk_full_time = ngx_time(); + } file->pos = file->buffer; } @@ -306,7 +324,11 @@ ngx_http_log_handler(ngx_http_request_t *r) ngx_linefeed(p); - ngx_write_fd(file->fd, line, p - line); + if (ngx_write_fd(file->fd, line, p - line) == -1 + && ngx_errno == NGX_ENOSPC) + { + log[l].disk_full_time = ngx_time(); + } } return NGX_OK; @@ -1017,6 +1039,8 @@ ngx_http_log_set_log(ngx_conf_t *cf, ngx_command_t *cmd, void *conf) return NGX_CONF_ERROR; } + log->disk_full_time = 0; + if (cf->args->nelts >= 3) { name = value[2]; |