aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorMaxim Dounin <mdounin@mdounin.ru>2014-01-04 03:31:58 +0400
committerMaxim Dounin <mdounin@mdounin.ru>2014-01-04 03:31:58 +0400
commit9a72030c2507a635d9c17a76a992cec21067dbcf (patch)
tree4a7f1b70800631b40f3b9dc6707fc135551ab207 /src
parent2539ce036f6f9d9c2f0e9d6e723d1f0785b9dc0a (diff)
downloadnginx-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.h1
-rw-r--r--src/http/ngx_http_copy_filter_module.c6
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;
}
}