[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


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

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!


--- 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->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