diff src/http/ngx_http_copy_filter_module.c @ 5498:d39a69427056

Allowed up to two EBUSY errors from sendfile(). Fallback to synchronous sendfile() now only done on 3rd EBUSY without any progress in a row. Not falling back is believed to be better in case of occasional EBUSY, though protection is still needed to make sure there will be no infinite loop.
author Maxim Dounin <mdounin@mdounin.ru>
date Sat, 04 Jan 2014 03:31:58 +0400
parents 586969d972b9
children ccad84a174e0
line wrap: on
line diff
--- a/src/http/ngx_http_copy_filter_module.c
+++ b/src/http/ngx_http_copy_filter_module.c
@@ -169,13 +169,15 @@ ngx_http_copy_filter(ngx_http_request_t 
             offset = c->busy_sendfile->file_pos;
 
             if (file->aio) {
-                c->aio_sendfile = (offset != file->aio->last_offset);
+                c->busy_count = (offset == file->aio->last_offset) ?
+                                c->busy_count + 1 : 0;
                 file->aio->last_offset = offset;
 
-                if (c->aio_sendfile == 0) {
+                if (c->busy_count > 2) {
                     ngx_log_error(NGX_LOG_ALERT, c->log, 0,
                                   "sendfile(%V) returned busy again",
                                   &file->name);
+                    c->aio_sendfile = 0;
                 }
             }