Skip to content

Commit c5ae96e

Browse files
committed
Add AIO support.
Change-Id: I0a7bf582185eaa921a8c7d75e35b2bd76f29efa4 Signed-off-by: Piotr Sikora <piotr.sikora@frickle.com>
1 parent 0b18d26 commit c5ae96e

File tree

1 file changed

+115
-37
lines changed

1 file changed

+115
-37
lines changed

ngx_cache_purge_module.c

Lines changed: 115 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -59,11 +59,11 @@ char *ngx_http_uwsgi_cache_purge_conf(ngx_conf_t *cf,
5959
ngx_int_t ngx_http_uwsgi_cache_purge_handler(ngx_http_request_t *r);
6060
# endif /* NGX_HTTP_UWSGI */
6161

62-
ngx_int_t ngx_http_cache_purge_handler(ngx_http_request_t *r,
62+
ngx_int_t ngx_http_cache_purge_init(ngx_http_request_t *r,
6363
ngx_http_file_cache_t *cache, ngx_http_complex_value_t *cache_key);
64+
void ngx_http_cache_purge_handler(ngx_http_request_t *r);
6465

65-
ngx_int_t ngx_http_file_cache_purge(ngx_http_request_t *r,
66-
ngx_http_file_cache_t *cache, ngx_http_complex_value_t *cache_key);
66+
ngx_int_t ngx_http_file_cache_purge(ngx_http_request_t *r);
6767

6868
static ngx_command_t ngx_http_cache_purge_module_commands[] = {
6969

@@ -240,8 +240,20 @@ ngx_http_fastcgi_cache_purge_handler(ngx_http_request_t *r)
240240

241241
flcf = ngx_http_get_module_loc_conf(r, ngx_http_fastcgi_module);
242242

243-
return ngx_http_cache_purge_handler(r, flcf->upstream.cache->data,
244-
&flcf->cache_key);
243+
if (ngx_http_cache_purge_init(r, flcf->upstream.cache->data,
244+
&flcf->cache_key)
245+
!= NGX_OK)
246+
{
247+
return NGX_HTTP_INTERNAL_SERVER_ERROR;
248+
}
249+
250+
# if defined(nginx_version) && (nginx_version >= 8011)
251+
r->main->count++;
252+
# endif
253+
254+
ngx_http_cache_purge_handler(r);
255+
256+
return NGX_DONE;
245257
}
246258
# endif /* NGX_HTTP_FASTCGI */
247259

@@ -352,8 +364,20 @@ ngx_http_proxy_cache_purge_handler(ngx_http_request_t *r)
352364

353365
plcf = ngx_http_get_module_loc_conf(r, ngx_http_proxy_module);
354366

355-
return ngx_http_cache_purge_handler(r, plcf->upstream.cache->data,
356-
&plcf->cache_key);
367+
if (ngx_http_cache_purge_init(r, plcf->upstream.cache->data,
368+
&plcf->cache_key)
369+
!= NGX_OK)
370+
{
371+
return NGX_HTTP_INTERNAL_SERVER_ERROR;
372+
}
373+
374+
# if defined(nginx_version) && (nginx_version >= 8011)
375+
r->main->count++;
376+
# endif
377+
378+
ngx_http_cache_purge_handler(r);
379+
380+
return NGX_DONE;
357381
}
358382
# endif /* NGX_HTTP_PROXY */
359383

@@ -437,8 +461,20 @@ ngx_http_scgi_cache_purge_handler(ngx_http_request_t *r)
437461

438462
slcf = ngx_http_get_module_loc_conf(r, ngx_http_scgi_module);
439463

440-
return ngx_http_cache_purge_handler(r, slcf->upstream.cache->data,
441-
&slcf->cache_key);
464+
if (ngx_http_cache_purge_init(r, slcf->upstream.cache->data,
465+
&slcf->cache_key)
466+
!= NGX_OK)
467+
{
468+
return NGX_HTTP_INTERNAL_SERVER_ERROR;
469+
}
470+
471+
# if defined(nginx_version) && (nginx_version >= 8011)
472+
r->main->count++;
473+
# endif
474+
475+
ngx_http_cache_purge_handler(r);
476+
477+
return NGX_DONE;
442478
}
443479
# endif /* NGX_HTTP_SCGI */
444480

@@ -527,29 +563,32 @@ ngx_http_uwsgi_cache_purge_handler(ngx_http_request_t *r)
527563

528564
ulcf = ngx_http_get_module_loc_conf(r, ngx_http_uwsgi_module);
529565

530-
return ngx_http_cache_purge_handler(r, ulcf->upstream.cache->data,
531-
&ulcf->cache_key);
566+
if (ngx_http_cache_purge_init(r, ulcf->upstream.cache->data,
567+
&ulcf->cache_key)
568+
!= NGX_OK)
569+
{
570+
return NGX_HTTP_INTERNAL_SERVER_ERROR;
571+
}
572+
573+
# if defined(nginx_version) && (nginx_version >= 8011)
574+
r->main->count++;
575+
# endif
576+
577+
ngx_http_cache_purge_handler(r);
578+
579+
return NGX_DONE;
532580
}
533581
# endif /* NGX_HTTP_UWSGI */
534582

535583
ngx_int_t
536-
ngx_http_cache_purge_handler(ngx_http_request_t *r,
537-
ngx_http_file_cache_t *cache, ngx_http_complex_value_t *cache_key)
584+
ngx_http_cache_purge_send_response(ngx_http_request_t *r)
538585
{
539586
ngx_chain_t out;
540587
ngx_buf_t *b;
541588
ngx_str_t *key;
542589
ngx_int_t rc;
543590
size_t len;
544591

545-
rc = ngx_http_file_cache_purge(r, cache, cache_key);
546-
547-
if (rc == NGX_ERROR) {
548-
return NGX_HTTP_INTERNAL_SERVER_ERROR;
549-
} else if (rc == NGX_DECLINED) {
550-
return NGX_HTTP_NOT_FOUND;
551-
}
552-
553592
key = r->cache->keys.elts;
554593

555594
len = sizeof(ngx_http_cache_purge_success_page_top) - 1
@@ -598,12 +637,12 @@ ngx_http_cache_purge_handler(ngx_http_request_t *r,
598637
}
599638

600639
ngx_int_t
601-
ngx_http_file_cache_purge(ngx_http_request_t *r, ngx_http_file_cache_t *cache,
640+
ngx_http_cache_purge_init(ngx_http_request_t *r, ngx_http_file_cache_t *cache,
602641
ngx_http_complex_value_t *cache_key)
603642
{
604-
ngx_http_cache_t *c;
605-
ngx_str_t *key;
606-
ngx_int_t rc;
643+
ngx_http_cache_t *c;
644+
ngx_str_t *key;
645+
ngx_int_t rc;
607646

608647
rc = ngx_http_discard_request_body(r);
609648
if (rc != NGX_OK) {
@@ -637,24 +676,63 @@ ngx_http_file_cache_purge(ngx_http_request_t *r, ngx_http_file_cache_t *cache,
637676

638677
ngx_http_file_cache_create_key(r);
639678

640-
rc = ngx_http_file_cache_open(r);
679+
return NGX_OK;
680+
}
681+
682+
void
683+
ngx_http_cache_purge_handler(ngx_http_request_t *r)
684+
{
685+
# if (NGX_HAVE_FILE_AIO)
686+
if (r->aio) {
687+
return;
688+
}
689+
# endif
690+
691+
switch (ngx_http_file_cache_purge(r)) {
692+
case NGX_DECLINED:
693+
ngx_http_finalize_request(r, NGX_HTTP_NOT_FOUND);
694+
return;
695+
case NGX_ERROR:
696+
ngx_http_finalize_request(r, NGX_HTTP_INTERNAL_SERVER_ERROR);
697+
return;
698+
# if (NGX_HAVE_FILE_AIO)
699+
case NGX_AGAIN:
700+
r->write_event_handler = ngx_http_cache_purge_handler;
701+
return;
702+
# endif
703+
default:
704+
r->write_event_handler = ngx_http_request_empty_handler;
705+
ngx_http_finalize_request(r, ngx_http_cache_purge_send_response(r));
706+
}
707+
}
708+
709+
ngx_int_t
710+
ngx_http_file_cache_purge(ngx_http_request_t *r)
711+
{
712+
ngx_http_file_cache_t *cache;
713+
ngx_http_cache_t *c;
714+
715+
switch (ngx_http_file_cache_open(r)) {
716+
case NGX_OK:
717+
case NGX_HTTP_CACHE_STALE:
641718
# if defined(nginx_version) \
642719
&& ((nginx_version >= 8001) \
643720
|| ((nginx_version < 8000) && (nginx_version >= 7060)))
644-
if (rc == NGX_HTTP_CACHE_UPDATING || rc == NGX_HTTP_CACHE_STALE) {
645-
# else
646-
if (rc == NGX_HTTP_CACHE_STALE) {
721+
case NGX_HTTP_CACHE_UPDATING:
647722
# endif
648-
rc = NGX_OK;
723+
break;
724+
case NGX_DECLINED:
725+
return NGX_DECLINED;
726+
# if (NGX_HAVE_FILE_AIO)
727+
case NGX_AGAIN:
728+
return NGX_AGAIN;
729+
# endif
730+
default:
731+
return NGX_ERROR;
649732
}
650733

651-
if (rc != NGX_OK) {
652-
if (rc == NGX_DECLINED) {
653-
return rc;
654-
} else {
655-
return NGX_ERROR;
656-
}
657-
}
734+
c = r->cache;
735+
cache = c->file_cache;
658736

659737
/*
660738
* delete file from disk but *keep* in-memory node,

0 commit comments

Comments
 (0)