export aio presence knowledge to prevent using "aio sendfile",

if aio does not present
This commit is contained in:
Igor Sysoev 2009-11-05 13:12:30 +00:00
parent bfd1a3c03c
commit 152504f0c2
6 changed files with 63 additions and 43 deletions

View File

@ -118,7 +118,7 @@ ngx_http_copy_filter(ngx_http_request_t *r, ngx_chain_t *in)
ctx->filter_ctx = r;
#if (NGX_HAVE_FILE_AIO)
if (clcf->aio) {
if (ngx_file_aio && clcf->aio) {
ctx->aio_handler = ngx_http_copy_aio_handler;
#if (NGX_HAVE_AIO_SENDFILE)
c->aio_sendfile = (clcf->aio == NGX_HTTP_AIO_SENDFILE);

View File

@ -12,6 +12,8 @@
static ngx_int_t ngx_http_file_cache_read(ngx_http_request_t *r,
ngx_http_cache_t *c);
static ssize_t ngx_http_file_cache_aio_read(ngx_http_request_t *r,
ngx_http_cache_t *c);
#if (NGX_HAVE_FILE_AIO)
static void ngx_http_cache_aio_event_handler(ngx_event_t *ev);
#endif
@ -330,36 +332,9 @@ ngx_http_file_cache_read(ngx_http_request_t *r, ngx_http_cache_t *c)
c = r->cache;
#if (NGX_HAVE_FILE_AIO)
{
ngx_http_core_loc_conf_t *clcf;
n = ngx_http_file_cache_aio_read(r, c);
clcf = ngx_http_get_module_loc_conf(r, ngx_http_core_module);
if (clcf->aio) {
n = ngx_file_aio_read(&c->file, c->buf->pos, c->body_start, 0, r->pool);
if (n == NGX_AGAIN) {
c->file.aio->data = r;
c->file.aio->handler = ngx_http_cache_aio_event_handler;
r->main->blocked++;
r->aio = 1;
return NGX_AGAIN;
}
} else {
n = ngx_read_file(&c->file, c->buf->pos, c->body_start, 0);
}
}
#else
n = ngx_read_file(&c->file, c->buf->pos, c->body_start, 0);
#endif
if (n == NGX_ERROR) {
if (n < 0) {
return n;
}
@ -432,8 +407,46 @@ ngx_http_file_cache_read(ngx_http_request_t *r, ngx_http_cache_t *c)
}
static ssize_t
ngx_http_file_cache_aio_read(ngx_http_request_t *r, ngx_http_cache_t *c)
{
#if (NGX_HAVE_FILE_AIO)
ssize_t n;
ngx_http_core_loc_conf_t *clcf;
if (!ngx_file_aio) {
goto noaio;
}
clcf = ngx_http_get_module_loc_conf(r, ngx_http_core_module);
if (!clcf->aio) {
goto noaio;
}
n = ngx_file_aio_read(&c->file, c->buf->pos, c->body_start, 0, r->pool);
if (n != NGX_AGAIN) {
return n;
}
c->file.aio->data = r;
c->file.aio->handler = ngx_http_cache_aio_event_handler;
r->main->blocked++;
r->aio = 1;
return NGX_AGAIN;
noaio:
#endif
return ngx_read_file(&c->file, c->buf->pos, c->body_start, 0);
}
#if (NGX_HAVE_FILE_AIO)
static void
ngx_http_cache_aio_event_handler(ngx_event_t *ev)

View File

@ -39,12 +39,11 @@ ssize_t
ngx_file_aio_read(ngx_file_t *file, u_char *buf, size_t size, off_t offset,
ngx_pool_t *pool)
{
int n;
ngx_event_t *ev;
ngx_event_aio_t *aio;
static ngx_uint_t enosys = 0;
int n;
ngx_event_t *ev;
ngx_event_aio_t *aio;
if (enosys) {
if (!ngx_file_aio) {
return ngx_read_file(file, buf, size, offset);
}
@ -116,7 +115,7 @@ ngx_file_aio_read(ngx_file_t *file, u_char *buf, size_t size, off_t offset,
"aio_read(\"%V\") failed", &file->name);
if (n == NGX_ENOSYS) {
enosys = 1;
ngx_file_aio = 0;
return ngx_read_file(file, buf, size, offset);
}

View File

@ -8,6 +8,13 @@
#include <ngx_core.h>
#if (NGX_HAVE_FILE_AIO)
ngx_uint_t ngx_file_aio = 1;
#endif
ssize_t
ngx_read_file(ngx_file_t *file, u_char *buf, size_t size, off_t offset)
{

View File

@ -313,6 +313,8 @@ size_t ngx_fs_bsize(u_char *name);
ssize_t ngx_file_aio_read(ngx_file_t *file, u_char *buf, size_t size,
off_t offset, ngx_pool_t *pool);
extern ngx_uint_t ngx_file_aio;
#endif

View File

@ -27,13 +27,12 @@ ssize_t
ngx_file_aio_read(ngx_file_t *file, u_char *buf, size_t size, off_t offset,
ngx_pool_t *pool)
{
long n;
struct iocb *piocb[1];
ngx_event_t *ev;
ngx_event_aio_t *aio;
static ngx_uint_t enosys = 0;
long n;
struct iocb *piocb[1];
ngx_event_t *ev;
ngx_event_aio_t *aio;
if (enosys) {
if (!ngx_file_aio) {
return ngx_read_file(file, buf, size, offset);
}
@ -109,7 +108,7 @@ ngx_file_aio_read(ngx_file_t *file, u_char *buf, size_t size, off_t offset,
"io_submit(\"%V\") failed", &file->name);
if (n == NGX_ENOSYS) {
enosys = 1;
ngx_file_aio = 0;
return ngx_read_file(file, buf, size, offset);
}