be->be_counters.last_sess = now.tv_sec;
}
-/* This function returns non-zero if a server with the given weight and state
- * is usable for LB, otherwise zero.
+/* This function returns non-zero if the designated server is usable for LB
+ * according to its current weight and current state. Otherwise it returns 0.
*/
-static inline int srv_is_usable(int state, int weight)
+static inline int srv_is_usable(const struct server *srv)
{
- if (!weight)
+ int state = srv->state;
+
+ if (!srv->eweight)
+ return 0;
+ if (state & (SRV_GOINGDOWN | SRV_MAINTAIN))
+ return 0;
+ if (!(state & SRV_RUNNING))
+ return 0;
+ return 1;
+}
+
+/* This function returns non-zero if the designated server was usable for LB
+ * according to its current weight and previous state. Otherwise it returns 0.
+ */
+static inline int srv_was_usable(const struct server *srv)
+{
+ int state = srv->prev_state;
+
+ if (!srv->prev_eweight)
return 0;
if (state & (SRV_GOINGDOWN | SRV_MAINTAIN))
return 0;
* 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))) &&
+ return (s && (s->nbpend || (p->nbpend && srv_is_usable(s))) &&
(!s->maxconn || s->cur_sess < srv_dynamic_maxconn(s)));
}
px->lbprm.tot_wact = px->lbprm.tot_wbck = 0;
px->lbprm.fbck = NULL;
for (srv = px->srv; srv != NULL; srv = srv->next) {
- if (!srv_is_usable(srv->state, srv->eweight))
+ if (!srv_is_usable(srv))
continue;
if (srv->state & SRV_BACKUP) {
(!s->be->max_ka_queue ||
server_has_room(__objt_server(conn->target)) ||
(__objt_server(conn->target)->nbpend + 1) < s->be->max_ka_queue))) &&
- srv_is_usable(__objt_server(conn->target)->state, __objt_server(conn->target)->eweight)) {
+ srv_is_usable(__objt_server(conn->target))) {
/* This session was relying on a server in a previous request
* and the proxy has "option prefer-current-server" set, so
* let's try to reuse the same server.
if (!srv_lb_status_changed(srv))
return;
- if (srv_is_usable(srv->state, srv->eweight))
+ if (srv_is_usable(srv))
goto out_update_state;
- if (!srv_is_usable(srv->prev_state, srv->prev_eweight))
+ if (!srv_was_usable(srv))
/* server was already down */
goto out_update_backend;
srv2 = srv2->next;
} while (srv2 &&
!((srv2->state & SRV_BACKUP) &&
- srv_is_usable(srv2->state, srv2->eweight)));
+ srv_is_usable(srv2)));
p->lbprm.fbck = srv2;
}
} else {
if (!srv_lb_status_changed(srv))
return;
- if (!srv_is_usable(srv->state, srv->eweight))
+ if (!srv_is_usable(srv))
goto out_update_state;
- if (srv_is_usable(srv->prev_state, srv->prev_eweight))
+ if (srv_was_usable(srv))
/* server was already up */
goto out_update_backend;
* possibly a new tree for this server.
*/
- old_state = srv_is_usable(srv->prev_state, srv->prev_eweight);
- new_state = srv_is_usable(srv->state, srv->eweight);
+ old_state = srv_was_usable(srv);
+ new_state = srv_is_usable(srv);
if (!old_state && !new_state) {
srv_lb_commit_status(srv);
srv->lb_nodes[node].node.key = full_hash(srv->puid * SRV_EWGHT_RANGE + node);
}
- if (srv_is_usable(srv->state, srv->eweight))
+ if (srv_is_usable(srv))
chash_queue_dequeue_srv(srv);
}
}
if (!srv_lb_status_changed(srv))
return;
- if (srv_is_usable(srv->state, srv->eweight))
+ if (srv_is_usable(srv))
goto out_update_state;
- if (!srv_is_usable(srv->prev_state, srv->prev_eweight))
+ if (!srv_was_usable(srv))
/* server was already down */
goto out_update_backend;
srv2 = srv2->next;
} while (srv2 &&
!((srv2->state & SRV_BACKUP) &&
- srv_is_usable(srv2->state, srv2->eweight)));
+ srv_is_usable(srv2)));
p->lbprm.fbck = srv2;
}
} else {
if (!srv_lb_status_changed(srv))
return;
- if (!srv_is_usable(srv->state, srv->eweight))
+ if (!srv_is_usable(srv))
goto out_update_state;
- if (srv_is_usable(srv->prev_state, srv->prev_eweight))
+ if (srv_was_usable(srv))
/* server was already up */
goto out_update_backend;
* possibly a new tree for this server.
*/
- old_state = srv_is_usable(srv->prev_state, srv->prev_eweight);
- new_state = srv_is_usable(srv->state, srv->eweight);
+ old_state = srv_was_usable(srv);
+ new_state = srv_is_usable(srv);
if (!old_state && !new_state) {
srv_lb_commit_status(srv);
/* queue active and backup servers in two distinct groups */
for (srv = p->srv; srv; srv = srv->next) {
- if (!srv_is_usable(srv->state, srv->eweight))
+ if (!srv_is_usable(srv))
continue;
srv->lb_tree = (srv->state & SRV_BACKUP) ? &p->lbprm.fas.bck : &p->lbprm.fas.act;
fas_queue_srv(srv);
if (!srv_lb_status_changed(srv))
return;
- if (srv_is_usable(srv->state, srv->eweight))
+ if (srv_is_usable(srv))
goto out_update_state;
- if (!srv_is_usable(srv->prev_state, srv->prev_eweight))
+ if (!srv_was_usable(srv))
/* server was already down */
goto out_update_backend;
srv2 = srv2->next;
} while (srv2 &&
!((srv2->state & SRV_BACKUP) &&
- srv_is_usable(srv2->state, srv2->eweight)));
+ srv_is_usable(srv2)));
p->lbprm.fbck = srv2;
}
} else {
if (!srv_lb_status_changed(srv))
return;
- if (!srv_is_usable(srv->state, srv->eweight))
+ if (!srv_is_usable(srv))
goto out_update_state;
- if (srv_is_usable(srv->prev_state, srv->prev_eweight))
+ if (srv_was_usable(srv))
/* server was already up */
goto out_update_backend;
* possibly a new tree for this server.
*/
- old_state = srv_is_usable(srv->prev_state, srv->prev_eweight);
- new_state = srv_is_usable(srv->state, srv->eweight);
+ old_state = srv_was_usable(srv);
+ new_state = srv_is_usable(srv);
if (!old_state && !new_state) {
srv_lb_commit_status(srv);
/* queue active and backup servers in two distinct groups */
for (srv = p->srv; srv; srv = srv->next) {
- if (!srv_is_usable(srv->state, srv->eweight))
+ if (!srv_is_usable(srv))
continue;
srv->lb_tree = (srv->state & SRV_BACKUP) ? &p->lbprm.fwlc.bck : &p->lbprm.fwlc.act;
fwlc_queue_srv(srv);
if (!srv_lb_status_changed(srv))
return;
- if (srv_is_usable(srv->state, srv->eweight))
+ if (srv_is_usable(srv))
goto out_update_state;
- if (!srv_is_usable(srv->prev_state, srv->prev_eweight))
+ if (!srv_was_usable(srv))
/* server was already down */
goto out_update_backend;
srv2 = srv2->next;
} while (srv2 &&
!((srv2->state & SRV_BACKUP) &&
- srv_is_usable(srv2->state, srv2->eweight)));
+ srv_is_usable(srv2)));
p->lbprm.fbck = srv2;
}
} else {
if (!srv_lb_status_changed(srv))
return;
- if (!srv_is_usable(srv->state, srv->eweight))
+ if (!srv_is_usable(srv))
goto out_update_state;
- if (srv_is_usable(srv->prev_state, srv->prev_eweight))
+ if (srv_was_usable(srv))
/* server was already up */
goto out_update_backend;
* possibly a new tree for this server.
*/
- old_state = srv_is_usable(srv->prev_state, srv->prev_eweight);
- new_state = srv_is_usable(srv->state, srv->eweight);
+ old_state = srv_was_usable(srv);
+ new_state = srv_is_usable(srv);
if (!old_state && !new_state) {
srv_lb_commit_status(srv);
/* queue active and backup servers in two distinct groups */
for (srv = p->srv; srv; srv = srv->next) {
- if (!srv_is_usable(srv->state, srv->eweight))
+ if (!srv_is_usable(srv))
continue;
fwrr_queue_by_weight((srv->state & SRV_BACKUP) ?
p->lbprm.fwrr.bck.init :
/* Delay everything which does not fit into the window and everything
* which does not fit into the theorical new window.
*/
- if (!srv_is_usable(s->state, s->eweight)) {
+ if (!srv_is_usable(s)) {
fwrr_remove_from_tree(s);
}
else if (s->eweight <= 0 ||
if (!srv_lb_status_changed(srv))
return;
- if (srv_is_usable(srv->state, srv->eweight))
+ if (srv_is_usable(srv))
goto out_update_state;
/* FIXME: could be optimized since we know what changed */
if (!srv_lb_status_changed(srv))
return;
- if (!srv_is_usable(srv->state, srv->eweight))
+ if (!srv_is_usable(srv))
goto out_update_state;
/* FIXME: could be optimized since we know what changed */
ps = pendconn_from_srv(srv);
pp = pendconn_from_px(px);
/* we want to get the definitive pendconn in <ps> */
- if (!pp || !srv_is_usable(rsrv->state, rsrv->eweight)) {
+ if (!pp || !srv_is_usable(rsrv)) {
if (!ps)
return NULL;
} else {