static ngx_http_reqstat_store_t * ngx_http_reqstat_lookup_fnode(ngx_http_request_t *r, ngx_http_reqstat_conf_t *slcf) { ngx_str_t val; ngx_uint_t i; ngx_shm_zone_t **shm_zone, *z; ngx_http_reqstat_ctx_t *ctx; ngx_http_reqstat_store_t *store; ngx_http_reqstat_rbnode_t *fnode, **fnode_store; store = ngx_http_get_module_ctx(r, ngx_http_reqstat_module); if (store == NULL) { store = ngx_http_reqstat_create_store(r, slcf); return store; } if (ngx_array_init(&store->monitor_index, r->pool, slcf->monitor->nelts, sizeof(ngx_http_reqstat_rbnode_t *)) == NGX_ERROR) { return NULL; } shm_zone = slcf->monitor->elts; for (i = 0; i < slcf->monitor->nelts; i++) { z = shm_zone[i]; ctx = z->data; if (ngx_http_complex_value(r, &ctx->value, &val) != NGX_OK) { ngx_log_error(NGX_LOG_WARN, r->connection->log, 0, "failed to reap the key \"%V\"", ctx->val); continue; } fnode = ngx_http_reqstat_rbtree_lookup(shm_zone[i], &val); if (fnode == NULL) { ngx_log_error(NGX_LOG_WARN, r->connection->log, 0, "failed to alloc node in zone \"%V\", " "enlarge it please", &z->shm.name); } else { fnode_store = ngx_array_push(&store->monitor_index); *fnode_store = fnode; } } return store; }
static ngx_http_reqstat_store_t * ngx_http_reqstat_create_store(ngx_http_request_t *r, ngx_http_reqstat_conf_t *rlcf) { ngx_str_t val; ngx_uint_t i; ngx_shm_zone_t **shm_zone, *z; ngx_http_reqstat_ctx_t *ctx; ngx_http_reqstat_store_t *store; ngx_http_reqstat_rbnode_t *fnode, **fnode_store; store = ngx_pcalloc(r->pool, sizeof(ngx_http_reqstat_store_t)); if (store == NULL) { return NULL; } if (rlcf->monitor == NULL) { store->bypass = 1; return store; } store->conf = rlcf; switch (ngx_http_test_predicates(r, rlcf->bypass)) { case NGX_ERROR: return NULL; case NGX_DECLINED: store->bypass = 1; return store; default: /* NGX_OK */ break; } if (ngx_array_init(&store->monitor_index, r->pool, rlcf->monitor->nelts, sizeof(ngx_http_reqstat_rbnode_t *)) == NGX_ERROR) { return NULL; } shm_zone = rlcf->monitor->elts; for (i = 0; i < rlcf->monitor->nelts; i++) { z = shm_zone[i]; ctx = z->data; if (ngx_http_complex_value(r, &ctx->value, &val) != NGX_OK) { ngx_log_error(NGX_LOG_WARN, r->connection->log, 0, "failed to reap the key \"%V\"", ctx->val); continue; } fnode = ngx_http_reqstat_rbtree_lookup(shm_zone[i], &val); if (fnode == NULL) { ngx_log_error(NGX_LOG_WARN, r->connection->log, 0, "failed to alloc node in zone \"%V\", " "enlarge it please", &z->shm.name); } else { fnode_store = ngx_array_push(&store->monitor_index); *fnode_store = fnode; } } return store; }