#include <haproxy/applet-t.h>
#include <haproxy/arg-t.h>
#include <haproxy/freq_ctr.h>
+#include <haproxy/queue.h>
#include <haproxy/proxy-t.h>
#include <haproxy/resolvers-t.h>
#include <haproxy/sample-t.h>
srv->addr_type.xprt_type == PROTO_TYPE_STREAM;
}
+/*
+ * Returns 1 if the server is full, 0 if it is not, and -1 if unknown
+ */
+static inline int srv_manage_queues(struct server *srv, struct proxy *px)
+{
+ int full = -1;
+
+ if (may_dequeue_tasks(srv, px))
+ full = process_srv_queue(srv);
+
+ return full;
+}
+
#endif /* _HAPROXY_SERVER_H */
/*
(!(s->flags & SF_DIRECT) && s->be->srv_act > 1 &&
((s->be->lbprm.algo & BE_LB_KIND) != BE_LB_KIND_HI)))) {
sess_change_server(s, NULL);
- if (may_dequeue_tasks(objt_server(s->target), s->be))
- process_srv_queue(objt_server(s->target));
+ srv_manage_queues(objt_server(s->target), s->be);
sockaddr_free(&s->scb->dst);
s->flags &= ~(SF_DIRECT | SF_ASSIGNED);
if (conn_slot == srv) {
sess_change_server(s, srv);
} else {
- if (may_dequeue_tasks(conn_slot, s->be))
- process_srv_queue(conn_slot);
+ srv_manage_queues(conn_slot, s->be);
}
}
* Not needed for backend queues, already handled in
* assign_server_and_queue().
*/
- if (unlikely(srv && may_dequeue_tasks(srv, s->be)))
- process_srv_queue(srv);
+ if (unlikely(srv))
+ srv_manage_queues(srv, s->be);
return 1;
_HA_ATOMIC_INC(&s->be_tgcounters->failed_conns);
/* release other streams waiting for this server */
- if (may_dequeue_tasks(srv, s->be))
- process_srv_queue(srv);
+ srv_manage_queues(srv, s->be);
return 1;
}
/* if we get here, it's because we got SRV_STATUS_OK, which also
/* release other streams waiting for this server */
sess_change_server(s, NULL);
- if (may_dequeue_tasks(srv, s->be))
- process_srv_queue(srv);
+ srv_manage_queues(srv, s->be);
/* Failed and not retryable. */
sc_abort(sc);
if (s->be_tgcounters)
_HA_ATOMIC_INC(&s->be_tgcounters->failed_conns);
sess_change_server(s, NULL);
- if (may_dequeue_tasks(objt_server(s->target), s->be))
- process_srv_queue(objt_server(s->target));
+ srv_manage_queues(objt_server(s->target), s->be);
/* shutw is enough to stop a connecting socket */
sc_shutdown(sc);
if (s->be_tgcounters)
_HA_ATOMIC_INC(&s->be_tgcounters->internal_errors);
sess_change_server(s, NULL);
- if (may_dequeue_tasks(objt_server(s->target), s->be))
- process_srv_queue(objt_server(s->target));
+ srv_manage_queues(objt_server(s->target), s->be);
/* shutw is enough to stop a connecting socket */
sc_shutdown(sc);
stream_del_srv_conn(s);
if (objt_server(s->target)) {
- if (may_dequeue_tasks(__objt_server(s->target), be))
- process_srv_queue(__objt_server(s->target));
+ srv_manage_queues(__objt_server(s->target), be);
}
s->target = NULL;
sv->maxconn = v;
}
- if (may_dequeue_tasks(sv, sv->proxy))
- process_srv_queue(sv);
-
+ srv_manage_queues(sv, sv->proxy);
return NULL;
}
pendconn_free(s);
if (objt_server(s->target)) { /* there may be requests left pending in queue */
- if (may_dequeue_tasks(__objt_server(s->target), s->be))
- process_srv_queue(__objt_server(s->target));
+ srv_manage_queues(__objt_server(s->target), s->be);
}
if (unlikely(s->srv_conn)) {
*/
if (!(oldsrv->flags & SRV_F_STRICT_MAXCONN)) {
sess_change_server(s, NULL);
- if (may_dequeue_tasks(oldsrv, s->be))
- process_srv_queue(oldsrv);
+ srv_manage_queues(oldsrv, s->be);
}
}
if ((oldsrv->flags & SRV_F_STRICT_MAXCONN)) {
sess_change_server(s, NULL);
- if (may_dequeue_tasks(oldsrv, s->be))
- process_srv_queue(oldsrv);
+ srv_manage_queues(oldsrv, s->be);
}
}
*/
if (!(srv->flags & SRV_F_STRICT_MAXCONN)) {
sess_change_server(s, NULL);
- if (may_dequeue_tasks(srv, s->be))
- process_srv_queue(srv);
+ srv_manage_queues(srv, s->be);
}
}
if (objt_server(stream->target)) {
sess_change_server(stream, NULL);
- if (may_dequeue_tasks(objt_server(stream->target), stream->be))
- process_srv_queue(objt_server(stream->target));
+ srv_manage_queues(__objt_server(stream->target), stream->be);
}
/* shutw is enough to stop a connecting socket */