[PATCH] Request hang when cache_lock is used in subrequests

Yichun Zhang (agentzh) agentzh at gmail.com
Sat Oct 26 22:38:35 UTC 2013


Hello!

Akos Gyimesi reported a request hang (downstream connections stuck in
the CLOSE_WAIT state forever) regarding use of proxy_cache_lock in
subrequests.

The issue is that when proxy_cache_lock_timeout is reached,
ngx_http_file_cache_lock_wait_handler calls
r->connection->write->handler() directly, but
r->connection->write->handler is (usually) just
ngx_http_request_handler, which simply picks up r->connection->data,
which is *not* necessarily the current (sub)request, so the current
subrequest may never be continued nor finalized, leading to an
infinite request hang.

The following patch fixes this issue for me. Comments welcome!

Thanks!
-agentzh

--- nginx-1.4.3/src/http/ngx_http_file_cache.c 2013-10-08
05:07:14.000000000 -0700
+++ nginx-1.4.3-patched/src/http/ngx_http_file_cache.c 2013-10-26
14:47:56.184041728 -0700
@@ -432,6 +432,7 @@ ngx_http_file_cache_lock_wait_handler(ng
     ngx_uint_t                 wait;
     ngx_msec_t                 timer;
     ngx_http_cache_t          *c;
+    ngx_connection_t          *conn;
     ngx_http_request_t        *r;
     ngx_http_file_cache_t     *cache;

@@ -471,7 +472,10 @@ wakeup:

     c->waiting = 0;
     r->main->blocked--;
-    r->connection->write->handler(r->connection->write);
+
+    conn = r->connection;
+    r->write_event_handler(r);
+    ngx_http_run_posted_requests(conn);
 }
-------------- next part --------------
A non-text attachment was scrubbed...
Name: nginx-1.4.3-cache_lock_hang_in_subreq.patch
Type: text/x-patch
Size: 705 bytes
Desc: not available
URL: <http://mailman.nginx.org/pipermail/nginx-devel/attachments/20131026/0b9da068/attachment.bin>


More information about the nginx-devel mailing list