annotate src/http/modules/ngx_http_upstream_hash_module.c @ 6059:c81d79a7befd

SPDY: always push pending data. This helps to avoid suboptimal behavior when a client waits for a control frame or more data to increase window size, but the frames have been delayed in the socket buffer. The delays can be caused by bad interaction between Nagle's algorithm on nginx side and delayed ACK on the client side or by TCP_CORK/TCP_NOPUSH if SPDY was working without SSL and sendfile() was used. The pushing code is now very similar to ngx_http_set_keepalive().
author Valentin Bartenev <vbart@nginx.com>
date Mon, 23 Mar 2015 21:04:13 +0300
parents 435ee290c2e1
children 6ff0ebd6fbf4
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);
5991
435ee290c2e1 Upstream hash: speedup consistent hash init.
Roman Arutyunyan <arut@nginx.com>
parents: 5717
diff changeset
52 static int ngx_libc_cdecl
435ee290c2e1 Upstream hash: speedup consistent hash init.
Roman Arutyunyan <arut@nginx.com>
parents: 5717
diff changeset
53 ngx_http_upstream_chash_cmp_points(const void *one, const void *two);
5717
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
5991
435ee290c2e1 Upstream hash: speedup consistent hash init.
Roman Arutyunyan <arut@nginx.com>
parents: 5717
diff changeset
363 points->point[points->number].hash = hash;
435ee290c2e1 Upstream hash: speedup consistent hash init.
Roman Arutyunyan <arut@nginx.com>
parents: 5717
diff changeset
364 points->point[points->number].server = server;
435ee290c2e1 Upstream hash: speedup consistent hash init.
Roman Arutyunyan <arut@nginx.com>
parents: 5717
diff changeset
365 points->number++;
5717
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 prev_hash = hash;
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 }
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
370
5991
435ee290c2e1 Upstream hash: speedup consistent hash init.
Roman Arutyunyan <arut@nginx.com>
parents: 5717
diff changeset
371 ngx_qsort(points->point,
435ee290c2e1 Upstream hash: speedup consistent hash init.
Roman Arutyunyan <arut@nginx.com>
parents: 5717
diff changeset
372 points->number,
435ee290c2e1 Upstream hash: speedup consistent hash init.
Roman Arutyunyan <arut@nginx.com>
parents: 5717
diff changeset
373 sizeof(ngx_http_upstream_chash_point_t),
435ee290c2e1 Upstream hash: speedup consistent hash init.
Roman Arutyunyan <arut@nginx.com>
parents: 5717
diff changeset
374 ngx_http_upstream_chash_cmp_points);
435ee290c2e1 Upstream hash: speedup consistent hash init.
Roman Arutyunyan <arut@nginx.com>
parents: 5717
diff changeset
375
435ee290c2e1 Upstream hash: speedup consistent hash init.
Roman Arutyunyan <arut@nginx.com>
parents: 5717
diff changeset
376 for (i = 0, j = 1; j < points->number; j++) {
435ee290c2e1 Upstream hash: speedup consistent hash init.
Roman Arutyunyan <arut@nginx.com>
parents: 5717
diff changeset
377 if (points->point[i].hash != points->point[j].hash) {
435ee290c2e1 Upstream hash: speedup consistent hash init.
Roman Arutyunyan <arut@nginx.com>
parents: 5717
diff changeset
378 points->point[++i] = points->point[j];
435ee290c2e1 Upstream hash: speedup consistent hash init.
Roman Arutyunyan <arut@nginx.com>
parents: 5717
diff changeset
379 }
435ee290c2e1 Upstream hash: speedup consistent hash init.
Roman Arutyunyan <arut@nginx.com>
parents: 5717
diff changeset
380 }
435ee290c2e1 Upstream hash: speedup consistent hash init.
Roman Arutyunyan <arut@nginx.com>
parents: 5717
diff changeset
381
435ee290c2e1 Upstream hash: speedup consistent hash init.
Roman Arutyunyan <arut@nginx.com>
parents: 5717
diff changeset
382 points->number = i + 1;
435ee290c2e1 Upstream hash: speedup consistent hash init.
Roman Arutyunyan <arut@nginx.com>
parents: 5717
diff changeset
383
5717
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
384 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
385 hcf->points = points;
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 return NGX_OK;
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
388 }
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
5991
435ee290c2e1 Upstream hash: speedup consistent hash init.
Roman Arutyunyan <arut@nginx.com>
parents: 5717
diff changeset
391 static int ngx_libc_cdecl
435ee290c2e1 Upstream hash: speedup consistent hash init.
Roman Arutyunyan <arut@nginx.com>
parents: 5717
diff changeset
392 ngx_http_upstream_chash_cmp_points(const void *one, const void *two)
5717
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
393 {
5991
435ee290c2e1 Upstream hash: speedup consistent hash init.
Roman Arutyunyan <arut@nginx.com>
parents: 5717
diff changeset
394 ngx_http_upstream_chash_point_t *first =
435ee290c2e1 Upstream hash: speedup consistent hash init.
Roman Arutyunyan <arut@nginx.com>
parents: 5717
diff changeset
395 (ngx_http_upstream_chash_point_t *) one;
435ee290c2e1 Upstream hash: speedup consistent hash init.
Roman Arutyunyan <arut@nginx.com>
parents: 5717
diff changeset
396 ngx_http_upstream_chash_point_t *second =
435ee290c2e1 Upstream hash: speedup consistent hash init.
Roman Arutyunyan <arut@nginx.com>
parents: 5717
diff changeset
397 (ngx_http_upstream_chash_point_t *) two;
5717
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
398
5991
435ee290c2e1 Upstream hash: speedup consistent hash init.
Roman Arutyunyan <arut@nginx.com>
parents: 5717
diff changeset
399 if (first->hash < second->hash) {
435ee290c2e1 Upstream hash: speedup consistent hash init.
Roman Arutyunyan <arut@nginx.com>
parents: 5717
diff changeset
400 return -1;
5717
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
401
5991
435ee290c2e1 Upstream hash: speedup consistent hash init.
Roman Arutyunyan <arut@nginx.com>
parents: 5717
diff changeset
402 } else if (first->hash > second->hash) {
435ee290c2e1 Upstream hash: speedup consistent hash init.
Roman Arutyunyan <arut@nginx.com>
parents: 5717
diff changeset
403 return 1;
5717
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
404
5991
435ee290c2e1 Upstream hash: speedup consistent hash init.
Roman Arutyunyan <arut@nginx.com>
parents: 5717
diff changeset
405 } else {
435ee290c2e1 Upstream hash: speedup consistent hash init.
Roman Arutyunyan <arut@nginx.com>
parents: 5717
diff changeset
406 return 0;
435ee290c2e1 Upstream hash: speedup consistent hash init.
Roman Arutyunyan <arut@nginx.com>
parents: 5717
diff changeset
407 }
5717
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
408 }
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
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
411 static ngx_uint_t
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
412 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
413 uint32_t hash)
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 ngx_uint_t i, j, k;
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
416 ngx_http_upstream_chash_point_t *point;
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 /* find first point >= hash */
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
419
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
420 point = &points->point[0];
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
421
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
422 i = 0;
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
423 j = points->number;
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
424
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
425 while (i < j) {
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
426 k = (i + j) / 2;
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 if (hash > point[k].hash) {
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
429 i = k + 1;
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 } else if (hash < point[k].hash) {
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
432 j = k;
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
433
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
434 } else {
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
435 return k;
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 }
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
438
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
439 return i;
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
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
442
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
443 static ngx_int_t
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
444 ngx_http_upstream_init_chash_peer(ngx_http_request_t *r,
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
445 ngx_http_upstream_srv_conf_t *us)
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 uint32_t hash;
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
448 ngx_http_upstream_hash_srv_conf_t *hcf;
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
449 ngx_http_upstream_hash_peer_data_t *hp;
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
450
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
451 if (ngx_http_upstream_init_hash_peer(r, us) != NGX_OK) {
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
452 return NGX_ERROR;
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
453 }
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 r->upstream->peer.get = ngx_http_upstream_get_chash_peer;
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 hp = r->upstream->peer.data;
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
458 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
459
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
460 hash = ngx_crc32_long(hp->key.data, hp->key.len);
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
461 hp->hash = ngx_http_upstream_find_chash_point(hcf->points, hash);
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
462
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
463 return NGX_OK;
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
464 }
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
465
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
466
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
467 static ngx_int_t
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
468 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
469 {
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
470 ngx_http_upstream_hash_peer_data_t *hp = data;
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 time_t now;
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
473 intptr_t m;
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
474 ngx_str_t *server;
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
475 ngx_int_t total;
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
476 ngx_uint_t i, n;
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
477 ngx_http_upstream_rr_peer_t *peer, *best;
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
478 ngx_http_upstream_chash_point_t *point;
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
479 ngx_http_upstream_chash_points_t *points;
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
480 ngx_http_upstream_hash_srv_conf_t *hcf;
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
481
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
482 ngx_log_debug1(NGX_LOG_DEBUG_HTTP, pc->log, 0,
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
483 "get consistent hash peer, try: %ui", pc->tries);
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
484
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
485 pc->cached = 0;
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
486 pc->connection = NULL;
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
487
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
488 now = ngx_time();
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
489 hcf = hp->conf;
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 points = hcf->points;
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
492 point = &points->point[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 ( ;; ) {
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
495 server = point[hp->hash % points->number].server;
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
496
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
497 ngx_log_debug2(NGX_LOG_DEBUG_HTTP, pc->log, 0,
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
498 "consistent hash peer:%uD, server:\"%V\"",
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
499 hp->hash, server);
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
500
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
501 best = NULL;
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
502 total = 0;
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
503
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
504 for (i = 0; i < hp->rrp.peers->number; i++) {
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
505
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
506 n = i / (8 * sizeof(uintptr_t));
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
507 m = (uintptr_t) 1 << i % (8 * sizeof(uintptr_t));
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 (hp->rrp.tried[n] & m) {
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
510 continue;
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
511 }
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 peer = &hp->rrp.peers->peer[i];
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 if (peer->down) {
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
516 continue;
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
517 }
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
518
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
519 if (peer->server.len != server->len
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
520 || ngx_strncmp(peer->server.data, server->data, server->len)
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
521 != 0)
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 continue;
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
524 }
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->max_fails
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
527 && peer->fails >= peer->max_fails
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
528 && now - peer->checked <= peer->fail_timeout)
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 continue;
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
531 }
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 peer->current_weight += peer->effective_weight;
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
534 total += peer->effective_weight;
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
535
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
536 if (peer->effective_weight < peer->weight) {
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
537 peer->effective_weight++;
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
538 }
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 if (best == NULL || peer->current_weight > best->current_weight) {
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
541 best = peer;
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
542 }
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
543 }
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 if (best) {
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
546 best->current_weight -= total;
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
547
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
548 i = best - &hp->rrp.peers->peer[0];
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 hp->rrp.current = i;
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
551
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
552 n = i / (8 * sizeof(uintptr_t));
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
553 m = (uintptr_t) 1 << i % (8 * sizeof(uintptr_t));
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 hp->rrp.tried[n] |= m;
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 if (now - best->checked > best->fail_timeout) {
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
558 best->checked = now;
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
559 }
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 pc->sockaddr = best->sockaddr;
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
562 pc->socklen = best->socklen;
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
563 pc->name = &best->name;
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 return NGX_OK;
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 hp->hash++;
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
569 hp->tries++;
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 if (hp->tries >= points->number) {
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
572 return NGX_BUSY;
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
573 }
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
574 }
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
575 }
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 static void *
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
579 ngx_http_upstream_hash_create_conf(ngx_conf_t *cf)
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
580 {
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
581 ngx_http_upstream_hash_srv_conf_t *conf;
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 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
584 if (conf == NULL) {
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
585 return NULL;
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
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
588 conf->points = NULL;
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
589
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
590 return conf;
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
591 }
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
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
594 static char *
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
595 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
596 {
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
597 ngx_http_upstream_hash_srv_conf_t *hcf = conf;
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
598
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
599 ngx_str_t *value;
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
600 ngx_http_upstream_srv_conf_t *uscf;
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
601 ngx_http_compile_complex_value_t ccv;
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
602
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
603 value = cf->args->elts;
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 ngx_memzero(&ccv, sizeof(ngx_http_compile_complex_value_t));
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 ccv.cf = cf;
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
608 ccv.value = &value[1];
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
609 ccv.complex_value = &hcf->key;
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 if (ngx_http_compile_complex_value(&ccv) != NGX_OK) {
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
612 return NGX_CONF_ERROR;
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
613 }
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
614
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
615 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
616
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
617 if (uscf->peer.init_upstream) {
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
618 ngx_conf_log_error(NGX_LOG_WARN, cf, 0,
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
619 "load balancing method redefined");
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
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
622 uscf->flags = NGX_HTTP_UPSTREAM_CREATE
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
623 |NGX_HTTP_UPSTREAM_WEIGHT
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
624 |NGX_HTTP_UPSTREAM_MAX_FAILS
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
625 |NGX_HTTP_UPSTREAM_FAIL_TIMEOUT
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
626 |NGX_HTTP_UPSTREAM_DOWN;
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
627
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
628 if (cf->args->nelts == 2) {
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
629 uscf->peer.init_upstream = ngx_http_upstream_init_hash;
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
630
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
631 } else if (ngx_strcmp(value[2].data, "consistent") == 0) {
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
632 uscf->peer.init_upstream = ngx_http_upstream_init_chash;
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
633
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
634 } else {
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
635 ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
636 "invalid parameter \"%V\"", &value[2]);
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
637 return NGX_CONF_ERROR;
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
638 }
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
639
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
640 return NGX_CONF_OK;
efc84a5723b3 Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
641 }