Skip to content

Commit

Permalink
fix case when the output filter should add incoming buffers
Browse files Browse the repository at this point in the history
while waiting on file AIO completion
  • Loading branch information
igorsysoev committed Sep 13, 2009
1 parent 570608f commit 84b20ca
Show file tree
Hide file tree
Showing 3 changed files with 18 additions and 11 deletions.
9 changes: 5 additions & 4 deletions src/core/ngx_buf.h
Original file line number Diff line number Diff line change
Expand Up @@ -89,6 +89,11 @@ struct ngx_output_chain_ctx_s {
#endif
unsigned need_in_memory:1;
unsigned need_in_temp:1;
#if (NGX_HAVE_FILE_AIO)
unsigned aio:1;

ngx_output_chain_aio_pt aio_handler;
#endif

off_t alignment;

Expand All @@ -99,10 +104,6 @@ struct ngx_output_chain_ctx_s {

ngx_output_chain_filter_pt output_filter;
void *filter_ctx;

#if (NGX_HAVE_FILE_AIO)
ngx_output_chain_aio_pt aio;
#endif
};


Expand Down
10 changes: 8 additions & 2 deletions src/core/ngx_output_chain.c
Original file line number Diff line number Diff line change
Expand Up @@ -74,6 +74,12 @@ ngx_output_chain(ngx_output_chain_ctx_t *ctx, ngx_chain_t *in)
}
}

#if (NGX_HAVE_FILE_AIO)
if (ctx->aio) {
return NGX_AGAIN;
}
#endif

out = NULL;
last_out = &out;
last = NGX_NONE;
Expand Down Expand Up @@ -519,11 +525,11 @@ ngx_output_chain_copy_buf(ngx_output_chain_ctx_t *ctx)

#if (NGX_HAVE_FILE_AIO)

if (ctx->aio) {
if (ctx->aio_handler) {
n = ngx_file_aio_read(src->file, dst->pos, (size_t) size,
src->file_pos, ctx->pool);
if (n == NGX_AGAIN) {
ctx->aio(ctx, src->file);
ctx->aio_handler(ctx, src->file);
return NGX_AGAIN;
}

Expand Down
10 changes: 5 additions & 5 deletions src/http/ngx_http_copy_filter_module.c
Original file line number Diff line number Diff line change
Expand Up @@ -87,10 +87,6 @@ ngx_http_copy_filter(ngx_http_request_t *r, ngx_chain_t *in)

c = r->connection;

if (r->aio) {
return NGX_AGAIN;
}

ngx_log_debug2(NGX_LOG_DEBUG_HTTP, c->log, 0,
"http copy filter: \"%V?%V\"", &r->uri, &r->args);

Expand Down Expand Up @@ -123,7 +119,7 @@ ngx_http_copy_filter(ngx_http_request_t *r, ngx_chain_t *in)

#if (NGX_HAVE_FILE_AIO)
if (clcf->aio) {
ctx->aio = ngx_http_copy_aio_handler;
ctx->aio_handler = ngx_http_copy_aio_handler;
#if (NGX_HAVE_AIO_SENDFILE)
c->aio_sendfile = (clcf->aio == NGX_HTTP_AIO_SENDFILE);
#endif
Expand All @@ -133,6 +129,10 @@ ngx_http_copy_filter(ngx_http_request_t *r, ngx_chain_t *in)
r->request_output = 1;
}

#if (NGX_HAVE_FILE_AIO)
ctx->aio = r->aio;
#endif

for ( ;; ) {
rc = ngx_output_chain(ctx, in);

Expand Down

0 comments on commit 84b20ca

Please sign in to comment.