diff options
author | Maxim Dounin <mdounin@mdounin.ru> | 2014-01-04 03:31:58 +0400 |
---|---|---|
committer | Maxim Dounin <mdounin@mdounin.ru> | 2014-01-04 03:31:58 +0400 |
commit | 9a72030c2507a635d9c17a76a992cec21067dbcf (patch) | |
tree | 4a7f1b70800631b40f3b9dc6707fc135551ab207 /src | |
parent | 2539ce036f6f9d9c2f0e9d6e723d1f0785b9dc0a (diff) | |
download | nginx-9a72030c2507a635d9c17a76a992cec21067dbcf.tar.gz nginx-9a72030c2507a635d9c17a76a992cec21067dbcf.zip |
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.
Diffstat (limited to 'src')
-rw-r--r-- | src/core/ngx_connection.h | 1 | ||||
-rw-r--r-- | src/http/ngx_http_copy_filter_module.c | 6 |
2 files changed, 5 insertions, 2 deletions
diff --git a/src/core/ngx_connection.h b/src/core/ngx_connection.h index c7b3b315c..05b1ad4ce 100644 --- a/src/core/ngx_connection.h +++ b/src/core/ngx_connection.h @@ -177,6 +177,7 @@ struct ngx_connection_s { #if (NGX_HAVE_AIO_SENDFILE) unsigned aio_sendfile:1; + unsigned busy_count:2; ngx_buf_t *busy_sendfile; #endif diff --git a/src/http/ngx_http_copy_filter_module.c b/src/http/ngx_http_copy_filter_module.c index 95bc0b835..3ad27b042 100644 --- 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 *r, ngx_chain_t *in) 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; } } |