comparison src/os/unix/ngx_files.c @ 6240:6fce16b1fc10

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.
author Valentin Bartenev <vbart@nginx.com>
date Wed, 02 Sep 2015 19:26:40 +0300
parents 1fdba317ee6d
children 387696b36c29
comparison
equal deleted inserted replaced
6239:281863981d0b 6240:6fce16b1fc10
262 ngx_pool_t *pool) 262 ngx_pool_t *pool)
263 { 263 {
264 u_char *prev; 264 u_char *prev;
265 size_t size; 265 size_t size;
266 ssize_t total, n; 266 ssize_t total, n;
267 ngx_err_t err;
267 ngx_array_t vec; 268 ngx_array_t vec;
268 struct iovec *iov, iovs[NGX_IOVS]; 269 struct iovec *iov, iovs[NGX_IOVS];
269 270
270 /* use pwrite() if there is the only buf in a chain */ 271 /* use pwrite() if there is the only buf in a chain */
271 272
333 } 334 }
334 335
335 file->sys_offset = offset; 336 file->sys_offset = offset;
336 } 337 }
337 338
339 eintr:
340
338 n = writev(file->fd, vec.elts, vec.nelts); 341 n = writev(file->fd, vec.elts, vec.nelts);
339 342
340 if (n == -1) { 343 if (n == -1) {
341 ngx_log_error(NGX_LOG_CRIT, file->log, ngx_errno, 344 err = ngx_errno;
345
346 if (err == NGX_EINTR) {
347 ngx_log_debug0(NGX_LOG_DEBUG_EVENT, c->log, err,
348 "writev() was interrupted");
349 goto eintr;
350 }
351
352 ngx_log_error(NGX_LOG_CRIT, file->log, err,
342 "writev() \"%s\" failed", file->name.data); 353 "writev() \"%s\" failed", file->name.data);
343 return NGX_ERROR; 354 return NGX_ERROR;
344 } 355 }
345 356
346 if ((size_t) n != size) { 357 if ((size_t) n != size) {