mirror of
http://git.haproxy.org/git/haproxy.git/
synced 2024-12-11 22:15:14 +00:00
f8e8b76ed3
It was reported that a server configured with a zero weight would sometimes still take connections from the backend queue. This issue is real, it happens this way : 1) the disabled server accepts a request with a cookie 2) many cookie-less requests accumulate in the backend queue 3) when the disabled server completes its request, it checks its own queue and the backend's queue 4) the server takes a pending request from the backend queue and processes it. In response, the server's cookie is assigned to the client, which ensures that some requests will continue to be served by this server, leading back to point 1 above. The fix consists in preventing a zero-weight server from dequeuing pending requests from the backend. Making use of srv_is_usable() in such tests makes the tests more robust against future changes. This fix must be backported to 1.4 and 1.3.
85 lines
2.5 KiB
C
85 lines
2.5 KiB
C
/*
|
|
* include/proto/queue.h
|
|
* This file defines everything related to queues.
|
|
*
|
|
* Copyright (C) 2000-2012 Willy Tarreau - w@1wt.eu
|
|
*
|
|
* This library is free software; you can redistribute it and/or
|
|
* modify it under the terms of the GNU Lesser General Public
|
|
* License as published by the Free Software Foundation, version 2.1
|
|
* exclusively.
|
|
*
|
|
* This library is distributed in the hope that it will be useful,
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
* Lesser General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU Lesser General Public
|
|
* License along with this library; if not, write to the Free Software
|
|
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
|
*/
|
|
|
|
#ifndef _PROTO_QUEUE_H
|
|
#define _PROTO_QUEUE_H
|
|
|
|
#include <common/config.h>
|
|
#include <common/memory.h>
|
|
#include <common/mini-clist.h>
|
|
|
|
#include <types/proxy.h>
|
|
#include <types/queue.h>
|
|
#include <types/session.h>
|
|
#include <types/server.h>
|
|
#include <types/task.h>
|
|
|
|
#include <proto/backend.h>
|
|
|
|
extern struct pool_head *pool2_pendconn;
|
|
|
|
int init_pendconn();
|
|
struct session *pendconn_get_next_sess(struct server *srv, struct proxy *px);
|
|
struct pendconn *pendconn_add(struct session *sess);
|
|
void pendconn_free(struct pendconn *p);
|
|
void process_srv_queue(struct server *s);
|
|
unsigned int srv_dynamic_maxconn(const struct server *s);
|
|
|
|
|
|
|
|
/* Returns the first pending connection for server <s>, which may be NULL if
|
|
* nothing is pending.
|
|
*/
|
|
static inline struct pendconn *pendconn_from_srv(const struct server *s) {
|
|
if (!s->nbpend)
|
|
return NULL;
|
|
|
|
return LIST_ELEM(s->pendconns.n, struct pendconn *, list);
|
|
}
|
|
|
|
/* Returns the first pending connection for proxy <px>, which may be NULL if
|
|
* nothing is pending.
|
|
*/
|
|
static inline struct pendconn *pendconn_from_px(const struct proxy *px) {
|
|
if (!px->nbpend)
|
|
return NULL;
|
|
|
|
return LIST_ELEM(px->pendconns.n, struct pendconn *, list);
|
|
}
|
|
|
|
/* returns 0 if nothing has to be done for server <s> regarding queued connections,
|
|
* and non-zero otherwise. If the server is down, we only check its own queue. Suited
|
|
* for and if/else usage.
|
|
*/
|
|
static inline int may_dequeue_tasks(const struct server *s, const struct proxy *p) {
|
|
return (s && (s->nbpend || (p->nbpend && srv_is_usable(s->state, s->eweight))) &&
|
|
(!s->maxconn || s->cur_sess < srv_dynamic_maxconn(s)));
|
|
}
|
|
|
|
#endif /* _PROTO_QUEUE_H */
|
|
|
|
/*
|
|
* Local variables:
|
|
* c-indent-level: 8
|
|
* c-basic-offset: 8
|
|
* End:
|
|
*/
|