Mercurial > hg > nginx-quic
view src/core/ngx_crc32.h @ 4010:74a93d3fdd85
Fixing cpu hog with all upstream servers marked "down".
The following configuration causes nginx to hog cpu due to infinite loop
in ngx_http_upstream_get_peer():
upstream backend {
server 127.0.0.1:8080 down;
server 127.0.0.1:8080 down;
}
server {
...
location / {
proxy_pass http://backend;
}
}
Make sure we don't loop infinitely in ngx_http_upstream_get_peer() but stop
after resetting peer weights once.
Return 0 if we are stuck. This is guaranteed to work as peer 0 always exists,
and eventually ngx_http_upstream_get_round_robin_peer() will do the right
thing falling back to backup servers or returning NGX_BUSY.
author | Maxim Dounin <mdounin@mdounin.ru> |
---|---|
date | Thu, 18 Aug 2011 16:52:38 +0000 |
parents | d6afb8723155 |
children | d620f497c50f |
line wrap: on
line source
/* * Copyright (C) Igor Sysoev */ #ifndef _NGX_CRC32_H_INCLUDED_ #define _NGX_CRC32_H_INCLUDED_ #include <ngx_config.h> #include <ngx_core.h> extern uint32_t *ngx_crc32_table_short; extern uint32_t ngx_crc32_table256[]; static ngx_inline uint32_t ngx_crc32_short(u_char *p, size_t len) { u_char c; uint32_t crc; crc = 0xffffffff; while (len--) { c = *p++; crc = ngx_crc32_table_short[(crc ^ (c & 0xf)) & 0xf] ^ (crc >> 4); crc = ngx_crc32_table_short[(crc ^ (c >> 4)) & 0xf] ^ (crc >> 4); } return crc ^ 0xffffffff; } static ngx_inline uint32_t ngx_crc32_long(u_char *p, size_t len) { uint32_t crc; crc = 0xffffffff; while (len--) { crc = ngx_crc32_table256[(crc ^ *p++) & 0xff] ^ (crc >> 8); } return crc ^ 0xffffffff; } #define ngx_crc32_init(crc) \ crc = 0xffffffff static ngx_inline void ngx_crc32_update(uint32_t *crc, u_char *p, size_t len) { uint32_t c; c = *crc; while (len--) { c = ngx_crc32_table256[(c ^ *p++) & 0xff] ^ (c >> 8); } *crc = c; } #define ngx_crc32_final(crc) \ crc ^= 0xffffffff ngx_int_t ngx_crc32_table_init(void); #endif /* _NGX_CRC32_H_INCLUDED_ */