int newidx;
struct server *srv;
+ if (px->map_state & PR_MAP_RECALC)
+ recalc_server_map(px);
+
if (px->srv_map_sz == 0)
return NULL;
*/
static inline struct server *get_server_rr(struct proxy *px)
{
+ if (px->map_state & PR_MAP_RECALC)
+ recalc_server_map(px);
+
if (px->srv_map_sz == 0)
return NULL;
* If any server is found, it will be returned. If no valid server is found,
* NULL is returned.
*/
-static inline struct server *get_server_sh(const struct proxy *px,
+static inline struct server *get_server_sh(struct proxy *px,
const char *addr, int len)
{
unsigned int h, l;
+ if (px->map_state & PR_MAP_RECALC)
+ recalc_server_map(px);
+
if (px->srv_map_sz == 0)
return NULL;
unsigned long hash = 0;
int c;
+ if (px->map_state & PR_MAP_RECALC)
+ recalc_server_map(px);
+
if (px->srv_map_sz == 0)
return NULL;
#define PR_MODE_HTTP 1
#define PR_MODE_HEALTH 2
+/* values for proxy->map_state */
+#define PR_MAP_RECALC (1 << 0)
+
/* flag values for proxy->cap. This is a bitmask of capabilities supported by the proxy */
#define PR_CAP_NONE 0x0000
#define PR_CAP_FE 0x0001
struct list acl; /* ACL declared on this proxy */
struct list block_cond; /* early blocking conditions (chained) */
struct list switching_rules; /* content switching rules (chained) */
+ int map_state; /* PR_MAP_RECALC */
struct server *srv; /* known servers */
int srv_act, srv_bck; /* # of running servers */
int tot_wact, tot_wbck; /* total weights of active and backup servers */
tot = 1; /* the first server is enough */
} else {
px->srv_map_sz = 0;
+ px->map_state &= ~PR_MAP_RECALC;
return;
}
best->wscore -= tot;
}
px->srv_map_sz = tot;
+ px->map_state &= ~PR_MAP_RECALC;
}
curproxy->srv_map = (struct server **)calloc(act, sizeof(struct server *));
/* recounts servers and their weights */
+ curproxy->map_state = PR_MAP_RECALC;
recount_servers(curproxy);
recalc_server_map(curproxy);
}
/* Sets server <s> down, notifies by all available means, recounts the
* remaining servers on the proxy and transfers queued sessions whenever
- * possible to other servers.
+ * possible to other servers. It automatically recomputes the number of
+ * servers, but not the map.
*/
static void set_server_down(struct server *s)
{
if (s->health == s->rise) {
recount_servers(s->proxy);
- recalc_server_map(s->proxy);
+ s->proxy->map_state |= PR_MAP_RECALC;
/* we might have sessions queued on this server and waiting for
* a connection. Those which are redispatchable will be queued
int xferred;
recount_servers(s->proxy);
- recalc_server_map(s->proxy);
+ s->proxy->map_state |= PR_MAP_RECALC;
/* check if we can handle some connections queued at the proxy. We
* will take as many as we can handle.
case DATA_ST_PX_BE:
/* print the backend */
if (px->cap & PR_CAP_BE) {
+ if (px->map_state & PR_MAP_RECALC)
+ recalc_server_map(px);
+
chunk_printf(&msg, sizeof(trash),
/* name */
"<tr align=center class=\"backend\"><td>Backend</td>"