Bug?

Igor Sysoev is at rambler-co.ru
Thu Sep 24 23:39:18 MSD 2009


On Thu, Sep 24, 2009 at 09:23:25PM +0200, Alejandro Mart??nez wrote:

> i keep getting:
> 
> 2009/09/24 18:21:09 [crit] 11956#0: *50 pwrite() has written only 266240
> of 524288, client: 10.100.0.115, server: contentdata.spacash.com,
> request: "POST /store.php HTTP/1.1", host: "10.100.0.155"
> 
> 2009/09/24 18:22:19 [crit] 11956#0: *81 pwrite() has written only 225280
> of 524288, client: 10.100.0.115, server: contentdata.spacash.com,
> request: "POST /store.php HTTP/1.1", host: "10.100.0.155"
> 
> store.php just receives files via POST and then moves them to the final
> location via move_uploaded_file()
> 
> I tracked the string "pwrite() has written only" within nginx's source
> and got to:
> 
> src/os/unix/ngx_files.c where there is:
> 
> ssize_t
> ngx_write_file(ngx_file_t *file, u_char *buf, size_t size, off_t offset)
> {
>     ssize_t  n;
> 
>     ngx_log_debug4(NGX_LOG_DEBUG_CORE, file->log, 0,
>                    "write: %d, %p, %uz, %O", file->fd, buf, size,
> offset);
> 
> #if (NGX_HAVE_PWRITE)
> 
>     n = pwrite(file->fd, buf, size, offset);
> 
>     if (n == -1) {
>         ngx_log_error(NGX_LOG_CRIT, file->log, ngx_errno, "pwrite()
> failed");
>         return NGX_ERROR;
>     }
> 
>     if ((size_t) n != size) {
>         ngx_log_error(NGX_LOG_CRIT, file->log, 0,
>                       "pwrite() has written only %z of %uz", n, size);
>         return NGX_ERROR;
>     }
> 
> #else
> 
>     if (file->sys_offset != offset) {
>         if (lseek(file->fd, offset, SEEK_SET) == -1) {
>             ngx_log_error(NGX_LOG_CRIT, file->log, ngx_errno, "lseek()
> failed");
>             return NGX_ERROR;
>         }
> 
>         file->sys_offset = offset;
>     }
> 
>     n = write(file->fd, buf, size);
>     if (n == -1) {
>         ngx_log_error(NGX_LOG_CRIT, file->log, ngx_errno, "write()
> failed");
>         return NGX_ERROR;
>     }
> 
>     if ((size_t) n != size) {
>         ngx_log_error(NGX_LOG_CRIT, file->log, 0,
>                       "write() has written only %z of %uz", n, size);
>         return NGX_ERROR;
>     }
> 
>     file->sys_offset += n;
> 
> #endif
> 
>     file->offset += n;
> 
>     return n;
> }
> 
> 
> 
> Googling for pwrite, i found out that pwrite just isn't to write all of
> its data at once, so one has to put it into a loop.
> 
> 
> So is this a bug or did i do something terribly wrong?

pwrite() on file system should write all data at once (at least I see it
for the first time). What file system do you use ?

It's seems the issue occures while writing client body in temporary file,
I need to add file name in log message.


-- 
Igor Sysoev
http://sysoev.ru/en/





More information about the nginx mailing list