annotate src/http/modules/ngx_http_upstream_hash_module.c @ 5862:ecbb99aa0e12

Limit req: use complex value in limit_req_zone. One intentional side effect of this change is that key is allowed only in the first position. Previously, it was possible to specify the key variable at any position, but that was never documented, and is contrary with nginx configuration practice for positional parameters.
author Valentin Bartenev <vbart@nginx.com>
date Wed, 24 Sep 2014 21:55:19 +0400
parents efc84a5723b3
children 435ee290c2e1
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
5717
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
1
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
2 /*
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
3 * Copyright (C) Roman Arutyunyan
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
4 * Copyright (C) Nginx, Inc.
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
5 */
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
6
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
7
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
8 #include <ngx_config.h>
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
9 #include <ngx_core.h>
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
10 #include <ngx_http.h>
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
11
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
12
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
13 typedef struct {
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
14 uint32_t hash;
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
15 ngx_str_t *server;
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
16 } ngx_http_upstream_chash_point_t;
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
17
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
18
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
19 typedef struct {
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
20 ngx_uint_t number;
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
21 ngx_http_upstream_chash_point_t point[1];
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
22 } ngx_http_upstream_chash_points_t;
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
23
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
24
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
25 typedef struct {
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
26 ngx_http_complex_value_t key;
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
27 ngx_http_upstream_chash_points_t *points;
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
28 } ngx_http_upstream_hash_srv_conf_t;
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
29
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
30
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
31 typedef struct {
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
32 /* the round robin data must be first */
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
33 ngx_http_upstream_rr_peer_data_t rrp;
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
34 ngx_http_upstream_hash_srv_conf_t *conf;
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
35 ngx_str_t key;
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
36 ngx_uint_t tries;
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
37 ngx_uint_t rehash;
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
38 uint32_t hash;
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
39 ngx_event_get_peer_pt get_rr_peer;
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
40 } ngx_http_upstream_hash_peer_data_t;
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
41
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
42
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
43 static ngx_int_t ngx_http_upstream_init_hash(ngx_conf_t *cf,
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
44 ngx_http_upstream_srv_conf_t *us);
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
45 static ngx_int_t ngx_http_upstream_init_hash_peer(ngx_http_request_t *r,
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
46 ngx_http_upstream_srv_conf_t *us);
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
47 static ngx_int_t ngx_http_upstream_get_hash_peer(ngx_peer_connection_t *pc,
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
48 void *data);
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
49
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
50 static ngx_int_t ngx_http_upstream_init_chash(ngx_conf_t *cf,
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
51 ngx_http_upstream_srv_conf_t *us);
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
52 static void ngx_http_upstream_add_chash_point(
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
53 ngx_http_upstream_chash_points_t *points, uint32_t hash, ngx_str_t *server);
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
54 static ngx_uint_t ngx_http_upstream_find_chash_point(
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
55 ngx_http_upstream_chash_points_t *points, uint32_t hash);
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
56 static ngx_int_t ngx_http_upstream_init_chash_peer(ngx_http_request_t *r,
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
57 ngx_http_upstream_srv_conf_t *us);
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
58 static ngx_int_t ngx_http_upstream_get_chash_peer(ngx_peer_connection_t *pc,
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
59 void *data);
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
60
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
61 static void *ngx_http_upstream_hash_create_conf(ngx_conf_t *cf);
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
62 static char *ngx_http_upstream_hash(ngx_conf_t *cf, ngx_command_t *cmd,
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
63 void *conf);
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
64
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
65
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
66 static ngx_command_t ngx_http_upstream_hash_commands[] = {
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
67
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
68 { ngx_string("hash"),
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
69 NGX_HTTP_UPS_CONF|NGX_CONF_TAKE12,
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
70 ngx_http_upstream_hash,
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
71 NGX_HTTP_SRV_CONF_OFFSET,
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
72 0,
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
73 NULL },
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
74
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
75 ngx_null_command
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
76 };
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
77
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
78
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
79 static ngx_http_module_t ngx_http_upstream_hash_module_ctx = {
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
80 NULL, /* preconfiguration */
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
81 NULL, /* postconfiguration */
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
82
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
83 NULL, /* create main configuration */
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
84 NULL, /* init main configuration */
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
85
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
86 ngx_http_upstream_hash_create_conf, /* create server configuration */
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
87 NULL, /* merge server configuration */
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
88
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
89 NULL, /* create location configuration */
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
90 NULL /* merge location configuration */
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
91 };
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
92
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
93
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
94 ngx_module_t ngx_http_upstream_hash_module = {
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
95 NGX_MODULE_V1,
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
96 &ngx_http_upstream_hash_module_ctx, /* module context */
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
97 ngx_http_upstream_hash_commands, /* module directives */
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
98 NGX_HTTP_MODULE, /* module type */
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
99 NULL, /* init master */
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
100 NULL, /* init module */
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
101 NULL, /* init process */
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
102 NULL, /* init thread */
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
103 NULL, /* exit thread */
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
104 NULL, /* exit process */
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
105 NULL, /* exit master */
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
106 NGX_MODULE_V1_PADDING
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
107 };
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
108
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
109
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
110 static ngx_int_t
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
111 ngx_http_upstream_init_hash(ngx_conf_t *cf, ngx_http_upstream_srv_conf_t *us)
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
112 {
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
113 if (ngx_http_upstream_init_round_robin(cf, us) != NGX_OK) {
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
114 return NGX_ERROR;
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
115 }
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
116
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
117 us->peer.init = ngx_http_upstream_init_hash_peer;
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
118
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
119 return NGX_OK;
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
120 }
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
121
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
122
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
123 static ngx_int_t
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
124 ngx_http_upstream_init_hash_peer(ngx_http_request_t *r,
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
125 ngx_http_upstream_srv_conf_t *us)
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
126 {
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
127 ngx_http_upstream_hash_srv_conf_t *hcf;
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
128 ngx_http_upstream_hash_peer_data_t *hp;
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
129
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
130 hp = ngx_palloc(r->pool, sizeof(ngx_http_upstream_hash_peer_data_t));
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
131 if (hp == NULL) {
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
132 return NGX_ERROR;
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
133 }
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
134
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
135 r->upstream->peer.data = &hp->rrp;
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
136
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
137 if (ngx_http_upstream_init_round_robin_peer(r, us) != NGX_OK) {
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
138 return NGX_ERROR;
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
139 }
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
140
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
141 r->upstream->peer.get = ngx_http_upstream_get_hash_peer;
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
142
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
143 hcf = ngx_http_conf_upstream_srv_conf(us, ngx_http_upstream_hash_module);
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
144
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
145 if (ngx_http_complex_value(r, &hcf->key, &hp->key) != NGX_OK) {
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
146 return NGX_ERROR;
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
147 }
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
148
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
149 ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
150 "upstream hash key:\"%V\"", &hp->key);
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
151
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
152 hp->conf = hcf;
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
153 hp->tries = 0;
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
154 hp->rehash = 0;
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
155 hp->hash = 0;
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
156 hp->get_rr_peer = ngx_http_upstream_get_round_robin_peer;
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
157
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
158 return NGX_OK;
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
159 }
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
160
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
161
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
162 static ngx_int_t
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
163 ngx_http_upstream_get_hash_peer(ngx_peer_connection_t *pc, void *data)
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
164 {
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
165 ngx_http_upstream_hash_peer_data_t *hp = data;
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
166
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
167 time_t now;
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
168 u_char buf[NGX_INT_T_LEN];
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
169 size_t size;
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
170 uint32_t hash;
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
171 ngx_int_t w;
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
172 uintptr_t m;
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
173 ngx_uint_t i, n, p;
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
174 ngx_http_upstream_rr_peer_t *peer;
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
175
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
176 ngx_log_debug1(NGX_LOG_DEBUG_HTTP, pc->log, 0,
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
177 "get hash peer, try: %ui", pc->tries);
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
178
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
179 if (hp->tries > 20 || hp->rrp.peers->single) {
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
180 return hp->get_rr_peer(pc, &hp->rrp);
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
181 }
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
182
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
183 now = ngx_time();
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
184
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
185 pc->cached = 0;
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
186 pc->connection = NULL;
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
187
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
188 for ( ;; ) {
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
189
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
190 /*
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
191 * Hash expression is compatible with Cache::Memcached:
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
192 * ((crc32([REHASH] KEY) >> 16) & 0x7fff) + PREV_HASH
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
193 * with REHASH omitted at the first iteration.
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
194 */
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
195
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
196 ngx_crc32_init(hash);
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
197
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
198 if (hp->rehash > 0) {
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
199 size = ngx_sprintf(buf, "%ui", hp->rehash) - buf;
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
200 ngx_crc32_update(&hash, buf, size);
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
201 }
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
202
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
203 ngx_crc32_update(&hash, hp->key.data, hp->key.len);
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
204 ngx_crc32_final(hash);
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
205
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
206 hash = (hash >> 16) & 0x7fff;
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
207
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
208 hp->hash += hash;
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
209 hp->rehash++;
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
210
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
211 if (!hp->rrp.peers->weighted) {
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
212 p = hp->hash % hp->rrp.peers->number;
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
213
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
214 } else {
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
215 w = hp->hash % hp->rrp.peers->total_weight;
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
216
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
217 for (i = 0; i < hp->rrp.peers->number; i++) {
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
218 w -= hp->rrp.peers->peer[i].weight;
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
219 if (w < 0) {
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
220 break;
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
221 }
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
222 }
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
223
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
224 p = i;
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
225 }
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
226
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
227 n = p / (8 * sizeof(uintptr_t));
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
228 m = (uintptr_t) 1 << p % (8 * sizeof(uintptr_t));
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
229
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
230 if (hp->rrp.tried[n] & m) {
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
231 goto next;
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
232 }
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
233
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
234 ngx_log_debug2(NGX_LOG_DEBUG_HTTP, pc->log, 0,
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
235 "get hash peer, value:%uD, peer:%ui", hp->hash, p);
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
236
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
237 peer = &hp->rrp.peers->peer[p];
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
238
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
239 if (peer->down) {
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
240 goto next;
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
241 }
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
242
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
243 if (peer->max_fails
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
244 && peer->fails >= peer->max_fails
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
245 && now - peer->checked <= peer->fail_timeout)
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
246 {
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
247 goto next;
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
248 }
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
249
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
250 break;
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
251
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
252 next:
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
253
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
254 if (++hp->tries > 20) {
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
255 return hp->get_rr_peer(pc, &hp->rrp);
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
256 }
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
257 }
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
258
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
259 hp->rrp.current = p;
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
260
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
261 pc->sockaddr = peer->sockaddr;
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
262 pc->socklen = peer->socklen;
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
263 pc->name = &peer->name;
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
264
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
265 if (now - peer->checked > peer->fail_timeout) {
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
266 peer->checked = now;
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
267 }
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
268
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
269 hp->rrp.tried[n] |= m;
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
270
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
271 return NGX_OK;
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
272 }
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
273
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
274
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
275 static ngx_int_t
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
276 ngx_http_upstream_init_chash(ngx_conf_t *cf, ngx_http_upstream_srv_conf_t *us)
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
277 {
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
278 u_char *host, *port, c;
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
279 size_t host_len, port_len, size;
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
280 uint32_t hash, base_hash, prev_hash;
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
281 ngx_str_t *server;
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
282 ngx_uint_t npoints, i, j;
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
283 ngx_http_upstream_rr_peer_t *peer;
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
284 ngx_http_upstream_rr_peers_t *peers;
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
285 ngx_http_upstream_chash_points_t *points;
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
286 ngx_http_upstream_hash_srv_conf_t *hcf;
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
287
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
288 if (ngx_http_upstream_init_round_robin(cf, us) != NGX_OK) {
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
289 return NGX_ERROR;
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
290 }
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
291
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
292 us->peer.init = ngx_http_upstream_init_chash_peer;
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
293
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
294 peers = us->peer.data;
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
295 npoints = peers->total_weight * 160;
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
296
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
297 size = sizeof(ngx_http_upstream_chash_points_t)
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
298 + sizeof(ngx_http_upstream_chash_point_t) * (npoints - 1);
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
299
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
300 points = ngx_palloc(cf->pool, size);
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
301 if (points == NULL) {
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
302 return NGX_ERROR;
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
303 }
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
304
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
305 points->number = 0;
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
306
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
307 for (i = 0; i < peers->number; i++) {
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
308 peer = &peers->peer[i];
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
309 server = &peer->server;
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
310
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
311 /*
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
312 * Hash expression is compatible with Cache::Memcached::Fast:
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
313 * crc32(HOST \0 PORT PREV_HASH).
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
314 */
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
315
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
316 if (server->len >= 5
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
317 && ngx_strncasecmp(server->data, (u_char *) "unix:", 5) == 0)
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
318 {
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
319 host = server->data + 5;
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
320 host_len = server->len - 5;
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
321 port = NULL;
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
322 port_len = 0;
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
323 goto done;
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
324 }
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
325
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
326 for (j = 0; j < server->len; j++) {
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
327 c = server->data[server->len - j - 1];
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
328
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
329 if (c == ':') {
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
330 host = server->data;
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
331 host_len = server->len - j - 1;
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
332 port = server->data + server->len - j;
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
333 port_len = j;
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
334 goto done;
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
335 }
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
336
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
337 if (c < '0' || c > '9') {
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
338 break;
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
339 }
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
340 }
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
341
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
342 host = server->data;
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
343 host_len = server->len;
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
344 port = NULL;
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
345 port_len = 0;
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
346
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
347 done:
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
348
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
349 ngx_crc32_init(base_hash);
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
350 ngx_crc32_update(&base_hash, host, host_len);
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
351 ngx_crc32_update(&base_hash, (u_char *) "", 1);
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
352 ngx_crc32_update(&base_hash, port, port_len);
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
353
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
354 prev_hash = 0;
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
355 npoints = peer->weight * 160;
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
356
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
357 for (j = 0; j < npoints; j++) {
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
358 hash = base_hash;
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
359
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
360 ngx_crc32_update(&hash, (u_char *) &prev_hash, sizeof(uint32_t));
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
361 ngx_crc32_final(hash);
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
362
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
363 ngx_http_upstream_add_chash_point(points, hash, &peer->server);
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
364
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
365 prev_hash = hash;
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
366 }
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
367 }
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
368
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
369 hcf = ngx_http_conf_upstream_srv_conf(us, ngx_http_upstream_hash_module);
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
370 hcf->points = points;
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
371
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
372 return NGX_OK;
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
373 }
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
374
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
375
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
376 static void
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
377 ngx_http_upstream_add_chash_point(ngx_http_upstream_chash_points_t *points,
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
378 uint32_t hash, ngx_str_t *server)
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
379 {
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
380 size_t size;
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
381 ngx_uint_t i;
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
382 ngx_http_upstream_chash_point_t *point;
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
383
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
384 i = ngx_http_upstream_find_chash_point(points, hash);
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
385 point = &points->point[i];
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
386
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
387 if (point->hash == hash) {
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
388 return;
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
389 }
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
390
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
391 size = (points->number - i) * sizeof(ngx_http_upstream_chash_point_t);
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
392
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
393 ngx_memmove(point + 1, point, size);
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
394
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
395 points->number++;
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
396 point->hash = hash;
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
397 point->server = server;
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
398 }
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
399
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
400
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
401 static ngx_uint_t
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
402 ngx_http_upstream_find_chash_point(ngx_http_upstream_chash_points_t *points,
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
403 uint32_t hash)
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
404 {
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
405 ngx_uint_t i, j, k;
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
406 ngx_http_upstream_chash_point_t *point;
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
407
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
408 /* find first point >= hash */
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
409
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
410 point = &points->point[0];
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
411
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
412 i = 0;
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
413 j = points->number;
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
414
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
415 while (i < j) {
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
416 k = (i + j) / 2;
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
417
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
418 if (hash > point[k].hash) {
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
419 i = k + 1;
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
420
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
421 } else if (hash < point[k].hash) {
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
422 j = k;
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
423
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
424 } else {
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
425 return k;
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
426 }
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
427 }
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
428
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
429 return i;
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
430 }
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
431
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
432
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
433 static ngx_int_t
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
434 ngx_http_upstream_init_chash_peer(ngx_http_request_t *r,
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
435 ngx_http_upstream_srv_conf_t *us)
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
436 {
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
437 uint32_t hash;
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
438 ngx_http_upstream_hash_srv_conf_t *hcf;
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
439 ngx_http_upstream_hash_peer_data_t *hp;
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
440
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
441 if (ngx_http_upstream_init_hash_peer(r, us) != NGX_OK) {
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
442 return NGX_ERROR;
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
443 }
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
444
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
445 r->upstream->peer.get = ngx_http_upstream_get_chash_peer;
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
446
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
447 hp = r->upstream->peer.data;
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
448 hcf = ngx_http_conf_upstream_srv_conf(us, ngx_http_upstream_hash_module);
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
449
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
450 hash = ngx_crc32_long(hp->key.data, hp->key.len);
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
451 hp->hash = ngx_http_upstream_find_chash_point(hcf->points, hash);
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
452
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
453 return NGX_OK;
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
454 }
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
455
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
456
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
457 static ngx_int_t
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
458 ngx_http_upstream_get_chash_peer(ngx_peer_connection_t *pc, void *data)
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
459 {
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
460 ngx_http_upstream_hash_peer_data_t *hp = data;
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
461
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
462 time_t now;
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
463 intptr_t m;
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
464 ngx_str_t *server;
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
465 ngx_int_t total;
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
466 ngx_uint_t i, n;
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
467 ngx_http_upstream_rr_peer_t *peer, *best;
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
468 ngx_http_upstream_chash_point_t *point;
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
469 ngx_http_upstream_chash_points_t *points;
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
470 ngx_http_upstream_hash_srv_conf_t *hcf;
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
471
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
472 ngx_log_debug1(NGX_LOG_DEBUG_HTTP, pc->log, 0,
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
473 "get consistent hash peer, try: %ui", pc->tries);
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
474
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
475 pc->cached = 0;
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
476 pc->connection = NULL;
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
477
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
478 now = ngx_time();
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
479 hcf = hp->conf;
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
480
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
481 points = hcf->points;
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
482 point = &points->point[0];
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
483
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
484 for ( ;; ) {
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
485 server = point[hp->hash % points->number].server;
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
486
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
487 ngx_log_debug2(NGX_LOG_DEBUG_HTTP, pc->log, 0,
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
488 "consistent hash peer:%uD, server:\"%V\"",
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
489 hp->hash, server);
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
490
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
491 best = NULL;
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
492 total = 0;
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
493
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
494 for (i = 0; i < hp->rrp.peers->number; i++) {
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
495
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
496 n = i / (8 * sizeof(uintptr_t));
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
497 m = (uintptr_t) 1 << i % (8 * sizeof(uintptr_t));
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
498
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
499 if (hp->rrp.tried[n] & m) {
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
500 continue;
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
501 }
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
502
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
503 peer = &hp->rrp.peers->peer[i];
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
504
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
505 if (peer->down) {
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
506 continue;
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
507 }
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
508
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
509 if (peer->server.len != server->len
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
510 || ngx_strncmp(peer->server.data, server->data, server->len)
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
511 != 0)
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
512 {
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
513 continue;
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
514 }
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
515
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
516 if (peer->max_fails
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
517 && peer->fails >= peer->max_fails
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
518 && now - peer->checked <= peer->fail_timeout)
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
519 {
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
520 continue;
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
521 }
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
522
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
523 peer->current_weight += peer->effective_weight;
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
524 total += peer->effective_weight;
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
525
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
526 if (peer->effective_weight < peer->weight) {
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
527 peer->effective_weight++;
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
528 }
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
529
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
530 if (best == NULL || peer->current_weight > best->current_weight) {
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
531 best = peer;
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
532 }
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
533 }
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
534
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
535 if (best) {
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
536 best->current_weight -= total;
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
537
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
538 i = best - &hp->rrp.peers->peer[0];
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
539
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
540 hp->rrp.current = i;
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
541
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
542 n = i / (8 * sizeof(uintptr_t));
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
543 m = (uintptr_t) 1 << i % (8 * sizeof(uintptr_t));
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
544
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
545 hp->rrp.tried[n] |= m;
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
546
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
547 if (now - best->checked > best->fail_timeout) {
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
548 best->checked = now;
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
549 }
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
550
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
551 pc->sockaddr = best->sockaddr;
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
552 pc->socklen = best->socklen;
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
553 pc->name = &best->name;
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
554
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
555 return NGX_OK;
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
556 }
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
557
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
558 hp->hash++;
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
559 hp->tries++;
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
560
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
561 if (hp->tries >= points->number) {
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
562 return NGX_BUSY;
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
563 }
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
564 }
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
565 }
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
566
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
567
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
568 static void *
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
569 ngx_http_upstream_hash_create_conf(ngx_conf_t *cf)
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
570 {
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
571 ngx_http_upstream_hash_srv_conf_t *conf;
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
572
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
573 conf = ngx_palloc(cf->pool, sizeof(ngx_http_upstream_hash_srv_conf_t));
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
574 if (conf == NULL) {
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
575 return NULL;
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
576 }
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
577
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
578 conf->points = NULL;
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
579
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
580 return conf;
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
581 }
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
582
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
583
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
584 static char *
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
585 ngx_http_upstream_hash(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
586 {
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
587 ngx_http_upstream_hash_srv_conf_t *hcf = conf;
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
588
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
589 ngx_str_t *value;
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
590 ngx_http_upstream_srv_conf_t *uscf;
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
591 ngx_http_compile_complex_value_t ccv;
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
592
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
593 value = cf->args->elts;
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
594
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
595 ngx_memzero(&ccv, sizeof(ngx_http_compile_complex_value_t));
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
596
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
597 ccv.cf = cf;
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
598 ccv.value = &value[1];
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
599 ccv.complex_value = &hcf->key;
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
600
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
601 if (ngx_http_compile_complex_value(&ccv) != NGX_OK) {
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
602 return NGX_CONF_ERROR;
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
603 }
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
604
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
605 uscf = ngx_http_conf_get_module_srv_conf(cf, ngx_http_upstream_module);
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
606
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
607 if (uscf->peer.init_upstream) {
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
608 ngx_conf_log_error(NGX_LOG_WARN, cf, 0,
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
609 "load balancing method redefined");
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
610 }
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
611
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
612 uscf->flags = NGX_HTTP_UPSTREAM_CREATE
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
613 |NGX_HTTP_UPSTREAM_WEIGHT
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
614 |NGX_HTTP_UPSTREAM_MAX_FAILS
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
615 |NGX_HTTP_UPSTREAM_FAIL_TIMEOUT
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
616 |NGX_HTTP_UPSTREAM_DOWN;
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
617
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
618 if (cf->args->nelts == 2) {
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
619 uscf->peer.init_upstream = ngx_http_upstream_init_hash;
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
620
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
621 } else if (ngx_strcmp(value[2].data, "consistent") == 0) {
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
622 uscf->peer.init_upstream = ngx_http_upstream_init_chash;
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
623
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
624 } else {
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
625 ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
626 "invalid parameter \"%V\"", &value[2]);
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
627 return NGX_CONF_ERROR;
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
628 }
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
629
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
630 return NGX_CONF_OK;
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
631 }