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