comparison src/http/modules/ngx_http_upstream_keepalive_module.c @ 5162:ee9a043765ea stable-1.2

Merge of r5133, r5134: peer.free() and peer.get() balance. *) Upstream: only call peer.free() if peer.get() selected a peer. *) Upstream: removed double-free workarounds in peer.free() methods.
author Maxim Dounin <mdounin@mdounin.ru>
date Fri, 29 Mar 2013 18:16:27 +0000
parents 63bc961253eb
children 822b82191940
comparison
equal deleted inserted replaced
5161:a5f7d455e271 5162:ee9a043765ea
34 34
35 #if (NGX_HTTP_SSL) 35 #if (NGX_HTTP_SSL)
36 ngx_event_set_peer_session_pt original_set_session; 36 ngx_event_set_peer_session_pt original_set_session;
37 ngx_event_save_peer_session_pt original_save_session; 37 ngx_event_save_peer_session_pt original_save_session;
38 #endif 38 #endif
39
40 ngx_uint_t failed; /* unsigned:1 */
41 39
42 } ngx_http_upstream_keepalive_peer_data_t; 40 } ngx_http_upstream_keepalive_peer_data_t;
43 41
44 42
45 typedef struct { 43 typedef struct {
218 ngx_connection_t *c; 216 ngx_connection_t *c;
219 217
220 ngx_log_debug0(NGX_LOG_DEBUG_HTTP, pc->log, 0, 218 ngx_log_debug0(NGX_LOG_DEBUG_HTTP, pc->log, 0,
221 "get keepalive peer"); 219 "get keepalive peer");
222 220
223 kp->failed = 0;
224
225 /* ask balancer */ 221 /* ask balancer */
226 222
227 rc = kp->original_get_peer(pc, kp->data); 223 rc = kp->original_get_peer(pc, kp->data);
228 224
229 if (rc != NGX_OK) { 225 if (rc != NGX_OK) {
280 ngx_http_upstream_t *u; 276 ngx_http_upstream_t *u;
281 277
282 ngx_log_debug0(NGX_LOG_DEBUG_HTTP, pc->log, 0, 278 ngx_log_debug0(NGX_LOG_DEBUG_HTTP, pc->log, 0,
283 "free keepalive peer"); 279 "free keepalive peer");
284 280
285 /* remember failed state - peer.free() may be called more than once */
286
287 if (state & NGX_PEER_FAILED) {
288 kp->failed = 1;
289 }
290
291 /* cache valid connections */ 281 /* cache valid connections */
292 282
293 u = kp->upstream; 283 u = kp->upstream;
294 c = pc->connection; 284 c = pc->connection;
295 285
296 if (kp->failed 286 if (state & NGX_PEER_FAILED
297 || c == NULL 287 || c == NULL
298 || c->read->eof 288 || c->read->eof
299 || c->read->error 289 || c->read->error
300 || c->read->timedout 290 || c->read->timedout
301 || c->write->error 291 || c->write->error