# HG changeset patch # User Maxim Dounin # Date 1421167897 -10800 # Node ID 727177743c3c0415b0ce58a20be588088fd3d952 # Parent 7554c83287dcd1baf3ef69b88734e5b8b67bbdc3 Core: added disk_full_time checks to error log. 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 @@ -91,8 +91,9 @@ ngx_log_error_core(ngx_uint_t level, ngx va_list args; #endif u_char *p, *last, *msg; + ssize_t n; + ngx_uint_t wrote_stderr, debug_connection; u_char errstr[NGX_MAX_ERROR_STR]; - ngx_uint_t wrote_stderr, debug_connection; last = errstr + NGX_MAX_ERROR_STR; @@ -150,16 +151,32 @@ ngx_log_error_core(ngx_uint_t level, ngx if (log->writer) { log->writer(log, level, errstr, p - errstr); - log = log->next; - continue; + goto next; } - (void) ngx_write_fd(log->file->fd, errstr, p - errstr); + if (ngx_time() == log->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 to a log for one second + */ + + goto next; + } + + n = ngx_write_fd(log->file->fd, errstr, p - errstr); + + if (n == -1 && ngx_errno == NGX_ENOSPC) { + log->disk_full_time = ngx_time(); + } if (log->file->fd == ngx_stderr) { wrote_stderr = 1; } + next: + log = log->next; } 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,6 +53,8 @@ struct ngx_log_s { ngx_atomic_uint_t connection; + time_t disk_full_time; + ngx_log_handler_pt handler; void *data;