[nginx] svn commit: r4419 - trunk/src/http/modules
vbart at nginx.com
vbart at nginx.com
Mon Jan 30 09:41:49 UTC 2012
Author: vbart
Date: 2012-01-30 09:41:49 +0000 (Mon, 30 Jan 2012)
New Revision: 4419
Modified:
trunk/src/http/modules/ngx_http_limit_req_module.c
Log:
Limit req: allocation and initialization of a new node moved to the lookup
function.
No functional changes.
Modified: trunk/src/http/modules/ngx_http_limit_req_module.c
===================================================================
--- trunk/src/http/modules/ngx_http_limit_req_module.c 2012-01-30 09:26:08 UTC (rev 4418)
+++ trunk/src/http/modules/ngx_http_limit_req_module.c 2012-01-30 09:41:49 UTC (rev 4419)
@@ -136,15 +136,12 @@
static ngx_int_t
ngx_http_limit_req_handler(ngx_http_request_t *r)
{
- size_t len, n;
+ size_t len;
uint32_t hash;
ngx_int_t rc;
ngx_uint_t excess;
- ngx_time_t *tp;
- ngx_rbtree_node_t *node;
ngx_http_variable_value_t *vv;
ngx_http_limit_req_ctx_t *ctx;
- ngx_http_limit_req_node_t *lr;
ngx_http_limit_req_conf_t *lrcf;
if (r->main->limit_req_set) {
@@ -189,58 +186,24 @@
rc = ngx_http_limit_req_lookup(lrcf, hash, vv->data, len, &excess);
+ ngx_shmtx_unlock(&ctx->shpool->mutex);
+
ngx_log_debug3(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
"limit_req: %i %ui.%03ui", rc, excess / 1000, excess % 1000);
- if (rc == NGX_DECLINED) {
-
- n = offsetof(ngx_rbtree_node_t, color)
- + offsetof(ngx_http_limit_req_node_t, data)
- + len;
-
- node = ngx_slab_alloc_locked(ctx->shpool, n);
- if (node == NULL) {
-
- ngx_http_limit_req_expire(ctx, 0);
-
- node = ngx_slab_alloc_locked(ctx->shpool, n);
- if (node == NULL) {
- ngx_shmtx_unlock(&ctx->shpool->mutex);
- return NGX_HTTP_SERVICE_UNAVAILABLE;
- }
- }
-
- lr = (ngx_http_limit_req_node_t *) &node->color;
-
- node->key = hash;
- lr->len = (u_char) len;
-
- tp = ngx_timeofday();
- lr->last = (ngx_msec_t) (tp->sec * 1000 + tp->msec);
-
- lr->excess = 0;
- ngx_memcpy(lr->data, vv->data, len);
-
- ngx_rbtree_insert(&ctx->sh->rbtree, node);
-
- ngx_queue_insert_head(&ctx->sh->queue, &lr->queue);
-
- ngx_shmtx_unlock(&ctx->shpool->mutex);
-
- return NGX_DECLINED;
- }
-
- ngx_shmtx_unlock(&ctx->shpool->mutex);
-
if (rc == NGX_OK) {
return NGX_DECLINED;
}
- if (rc == NGX_BUSY) {
- ngx_log_error(lrcf->limit_log_level, r->connection->log, 0,
- "limiting requests, excess: %ui.%03ui by zone \"%V\"",
- excess / 1000, excess % 1000, &lrcf->shm_zone->shm.name);
+ if (rc == NGX_BUSY || rc == NGX_ERROR) {
+ if (rc == NGX_BUSY) {
+ ngx_log_error(lrcf->limit_log_level, r->connection->log, 0,
+ "limiting requests, excess: %ui.%03ui by zone \"%V\"",
+ excess / 1000, excess % 1000,
+ &lrcf->shm_zone->shm.name);
+ }
+
return NGX_HTTP_SERVICE_UNAVAILABLE;
}
@@ -345,6 +308,7 @@
ngx_http_limit_req_lookup(ngx_http_limit_req_conf_t *lrcf, ngx_uint_t hash,
u_char *data, size_t len, ngx_uint_t *ep)
{
+ size_t size;
ngx_int_t rc, excess;
ngx_time_t *tp;
ngx_msec_t now;
@@ -353,6 +317,9 @@
ngx_http_limit_req_ctx_t *ctx;
ngx_http_limit_req_node_t *lr;
+ tp = ngx_timeofday();
+ now = (ngx_msec_t) (tp->sec * 1000 + tp->msec);
+
ctx = lrcf->shm_zone->data;
node = ctx->sh->rbtree.root;
@@ -381,9 +348,6 @@
ngx_queue_remove(&lr->queue);
ngx_queue_insert_head(&ctx->sh->queue, &lr->queue);
- tp = ngx_timeofday();
-
- now = (ngx_msec_t) (tp->sec * 1000 + tp->msec);
ms = (ngx_msec_int_t) (now - lr->last);
excess = lr->excess - ctx->rate * ngx_abs(ms) / 1000 + 1000;
@@ -417,7 +381,36 @@
*ep = 0;
- return NGX_DECLINED;
+ size = offsetof(ngx_rbtree_node_t, color)
+ + offsetof(ngx_http_limit_req_node_t, data)
+ + len;
+
+ node = ngx_slab_alloc_locked(ctx->shpool, size);
+
+ if (node == NULL) {
+ ngx_http_limit_req_expire(ctx, 0);
+
+ node = ngx_slab_alloc_locked(ctx->shpool, size);
+ if (node == NULL) {
+ return NGX_ERROR;
+ }
+ }
+
+ node->key = hash;
+
+ ngx_rbtree_insert(&ctx->sh->rbtree, node);
+
+ lr = (ngx_http_limit_req_node_t *) &node->color;
+
+ ngx_queue_insert_head(&ctx->sh->queue, &lr->queue);
+
+ lr->len = (u_char) len;
+ lr->excess = 0;
+ lr->last = now;
+
+ ngx_memcpy(lr->data, data, len);
+
+ return NGX_OK;
}
More information about the nginx-devel
mailing list