nginx-0.3.38-RELEASE import
*) 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.
diff --git a/src/http/modules/ngx_http_log_module.c b/src/http/modules/ngx_http_log_module.c
index 9436e59..07ac113 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 {
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 @@
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 @@
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_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 @@
return NGX_CONF_ERROR;
}
+ log->disk_full_time = 0;
+
if (cf->args->nelts >= 3) {
name = value[2];