aboutsummaryrefslogtreecommitdiff
path: root/src/os/unix
diff options
context:
space:
mode:
authorValentin Bartenev <vbart@nginx.com>2015-09-02 19:26:40 +0300
committerValentin Bartenev <vbart@nginx.com>2015-09-02 19:26:40 +0300
commit7dd3f9ee22e7915143f574f31285a1fd8e163b73 (patch)
tree67904cf6d38b5e9941c4c57004861633749dfd79 /src/os/unix
parent5e0b936a07bf9a2c4cbbe353a9a0277c782ffbf6 (diff)
downloadnginx-7dd3f9ee22e7915143f574f31285a1fd8e163b73.tar.gz
nginx-7dd3f9ee22e7915143f574f31285a1fd8e163b73.zip
Writing to some file systems can be interrupted.
At least such behavior was observed with CephFS, see: http://mailman.nginx.org/pipermail/nginx/2015-July/048188.html.
Diffstat (limited to 'src/os/unix')
-rw-r--r--src/os/unix/ngx_files.c13
1 files changed, 12 insertions, 1 deletions
diff --git a/src/os/unix/ngx_files.c b/src/os/unix/ngx_files.c
index 2a3ed2f26..60b737ff1 100644
--- a/src/os/unix/ngx_files.c
+++ b/src/os/unix/ngx_files.c
@@ -264,6 +264,7 @@ ngx_write_chain_to_file(ngx_file_t *file, ngx_chain_t *cl, off_t offset,
u_char *prev;
size_t size;
ssize_t total, n;
+ ngx_err_t err;
ngx_array_t vec;
struct iovec *iov, iovs[NGX_IOVS];
@@ -335,10 +336,20 @@ ngx_write_chain_to_file(ngx_file_t *file, ngx_chain_t *cl, off_t offset,
file->sys_offset = offset;
}
+eintr:
+
n = writev(file->fd, vec.elts, vec.nelts);
if (n == -1) {
- ngx_log_error(NGX_LOG_CRIT, file->log, ngx_errno,
+ err = ngx_errno;
+
+ if (err == NGX_EINTR) {
+ ngx_log_debug0(NGX_LOG_DEBUG_EVENT, c->log, err,
+ "writev() was interrupted");
+ goto eintr;
+ }
+
+ ngx_log_error(NGX_LOG_CRIT, file->log, err,
"writev() \"%s\" failed", file->name.data);
return NGX_ERROR;
}