Welcome! Log In Create A New Profile

Advanced

[nginx] Core: slab log_nomem flag.

Maxim Dounin
March 31, 2014 01:42PM
details: http://hg.nginx.org/nginx/rev/5024d29354f1
branches:
changeset: 5634:5024d29354f1
user: Maxim Dounin <mdounin@mdounin.ru>
date: Mon Mar 31 21:38:30 2014 +0400
description:
Core: slab log_nomem flag.

The flag allows to suppress "ngx_slab_alloc() failed: no memory" messages
from a slab allocator, e.g., if an LRU expiration is used by a consumer
and allocation failures aren't fatal.

The flag is now used in the SSL session cache code, and in the limit_req
module.

diffstat:

src/core/ngx_slab.c | 6 +++++-
src/core/ngx_slab.h | 2 ++
src/event/ngx_event_openssl.c | 4 +++-
src/http/modules/ngx_http_limit_req_module.c | 4 ++++
4 files changed, 14 insertions(+), 2 deletions(-)

diffs (77 lines):

diff --git a/src/core/ngx_slab.c b/src/core/ngx_slab.c
--- a/src/core/ngx_slab.c
+++ b/src/core/ngx_slab.c
@@ -129,6 +129,7 @@ ngx_slab_init(ngx_slab_pool_t *pool)
pool->pages->slab = pages;
}

+ pool->log_nomem = 1;
pool->log_ctx = &pool->zero;
pool->zero = '\0';
}
@@ -658,7 +659,10 @@ ngx_slab_alloc_pages(ngx_slab_pool_t *po
}
}

- ngx_slab_error(pool, NGX_LOG_CRIT, "ngx_slab_alloc() failed: no memory");
+ if (pool->log_nomem) {
+ ngx_slab_error(pool, NGX_LOG_CRIT,
+ "ngx_slab_alloc() failed: no memory");
+ }

return NULL;
}
diff --git a/src/core/ngx_slab.h b/src/core/ngx_slab.h
--- a/src/core/ngx_slab.h
+++ b/src/core/ngx_slab.h
@@ -39,6 +39,8 @@ typedef struct {
u_char *log_ctx;
u_char zero;

+ unsigned log_nomem:1;
+
void *data;
void *addr;
} ngx_slab_pool_t;
diff --git a/src/event/ngx_event_openssl.c b/src/event/ngx_event_openssl.c
--- a/src/event/ngx_event_openssl.c
+++ b/src/event/ngx_event_openssl.c
@@ -1834,6 +1834,8 @@ ngx_ssl_session_cache_init(ngx_shm_zone_
ngx_sprintf(shpool->log_ctx, " in SSL session shared cache \"%V\"%Z",
&shm_zone->shm.name);

+ shpool->log_nomem = 0;
+
return NGX_OK;
}

@@ -1986,7 +1988,7 @@ failed:
ngx_shmtx_unlock(&shpool->mutex);

ngx_log_error(NGX_LOG_ALERT, c->log, 0,
- "could not add new SSL session to the session cache");
+ "could not allocate new session%s", shpool->log_ctx);

return 0;
}
diff --git a/src/http/modules/ngx_http_limit_req_module.c b/src/http/modules/ngx_http_limit_req_module.c
--- a/src/http/modules/ngx_http_limit_req_module.c
+++ b/src/http/modules/ngx_http_limit_req_module.c
@@ -451,6 +451,8 @@ ngx_http_limit_req_lookup(ngx_http_limit

node = ngx_slab_alloc_locked(ctx->shpool, size);
if (node == NULL) {
+ ngx_log_error(NGX_LOG_ALERT, ngx_cycle->log, 0,
+ "could not allocate node%s", ctx->shpool->log_ctx);
return NGX_ERROR;
}
}
@@ -674,6 +676,8 @@ ngx_http_limit_req_init_zone(ngx_shm_zon
ngx_sprintf(ctx->shpool->log_ctx, " in limit_req zone \"%V\"%Z",
&shm_zone->shm.name);

+ ctx->shpool->log_nomem = 0;
+
return NGX_OK;
}


_______________________________________________
nginx-devel mailing list
nginx-devel@nginx.org
http://mailman.nginx.org/mailman/listinfo/nginx-devel
Subject Author Views Posted

[nginx] Core: slab log_nomem flag.

Maxim Dounin 918 March 31, 2014 01:42PM



Sorry, you do not have permission to post/reply in this forum.

Online Users

Guests: 242
Record Number of Users: 8 on April 13, 2023
Record Number of Guests: 421 on December 02, 2018
Powered by nginx      Powered by FreeBSD      PHP Powered      Powered by MariaDB      ipv6 ready