]> git.kaiwu.me - nginx.git/commitdiff
Limit req: number of cleanup calls reduced.
authorValentin Bartenev <vbart@nginx.com>
Mon, 30 Jan 2012 10:01:39 +0000 (10:01 +0000)
committerValentin Bartenev <vbart@nginx.com>
Mon, 30 Jan 2012 10:01:39 +0000 (10:01 +0000)
Doing a cleanup before every lookup seems to be too aggressive. It can lead to
premature removal of the nodes still usable, which increases the amount of work
under a mutex lock and therefore decreases performance.

In order to improve cleanup behavior, cleanup function call has been moved right
before the allocation of a new node.

src/http/modules/ngx_http_limit_req_module.c

index 8778a160a15dc8260c20c5ed79e1876be2e83e45..63fd9d0dabc572dd76e3d51d69d20f36fe954e04 100644 (file)
@@ -182,8 +182,6 @@ ngx_http_limit_req_handler(ngx_http_request_t *r)
 
     ngx_shmtx_lock(&ctx->shpool->mutex);
 
-    ngx_http_limit_req_expire(ctx, 1);
-
     rc = ngx_http_limit_req_lookup(lrcf, hash, vv->data, len, &excess);
 
     ngx_shmtx_unlock(&ctx->shpool->mutex);
@@ -385,6 +383,8 @@ ngx_http_limit_req_lookup(ngx_http_limit_req_conf_t *lrcf, ngx_uint_t hash,
            + offsetof(ngx_http_limit_req_node_t, data)
            + len;
 
+    ngx_http_limit_req_expire(ctx, 1);
+
     node = ngx_slab_alloc_locked(ctx->shpool, size);
 
     if (node == NULL) {