aboutsummaryrefslogtreecommitdiff
path: root/src/http/modules/ngx_http_log_module.c
diff options
context:
space:
mode:
authorIgor Sysoev <igor@sysoev.ru>2006-04-14 09:53:38 +0000
committerIgor Sysoev <igor@sysoev.ru>2006-04-14 09:53:38 +0000
commit8a2b2fb4fbd1801a5fb70d86384f2c6fd13c32c3 (patch)
treec0f7531cdc57da852f65d2d02bf11888bba63fe6 /src/http/modules/ngx_http_log_module.c
parent2b1b55d025e0444978e1fcf4580217eb391860e0 (diff)
downloadnginx-release-0.3.38.tar.gz
nginx-release-0.3.38.zip
nginx-0.3.38-RELEASE importrelease-0.3.38
*) Feature: the ngx_http_dav_module. *) Change: the ngx_http_perl_module optimizations. Thanks to Sergey Skvortsov. *) Feature: the ngx_http_perl_module supports the $r->request_body_file method. *) Feature: the "client_body_in_file_only" directive. *) Workaround: now on disk overflow nginx tries to write access logs once a second only. Thanks to Anton Yuzhaninov and Maxim Dounin. *) Bugfix: now the "limit_rate" directive more precisely limits rate if rate is more than 100 Kbyte/s. Thanks to ForJest. *) Bugfix: now the IMAP/POP3 proxy escapes the "\r" and "\n" symbols in login and password to pass authorization server. Thanks to Maxim Dounin.
Diffstat (limited to 'src/http/modules/ngx_http_log_module.c')
-rw-r--r--src/http/modules/ngx_http_log_module.c28
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];