MEDIUM: threads/server: Add a lock per server and atomically update server vars
The server's lock is use, among other things, to lock acces to the active
connection list of a server.
diff --git a/src/backend.c b/src/backend.c
index 5e51f39..d17635f 100644
--- a/src/backend.c
+++ b/src/backend.c
@@ -702,7 +702,7 @@
}
else if (srv != prev_srv) {
HA_ATOMIC_ADD(&s->be->be_counters.cum_lbconn, 1);
- srv->counters.cum_lbconn++;
+ HA_ATOMIC_ADD(&srv->counters.cum_lbconn, 1);
}
s->target = &srv->obj_type;
}
@@ -879,10 +879,10 @@
s->txn->flags |= TX_CK_DOWN;
}
s->flags |= SF_REDISP;
- prev_srv->counters.redispatches++;
+ HA_ATOMIC_ADD(&prev_srv->counters.redispatches, 1);
HA_ATOMIC_ADD(&s->be->be_counters.redispatches, 1);
} else {
- prev_srv->counters.retries++;
+ HA_ATOMIC_ADD(&prev_srv->counters.retries, 1);
HA_ATOMIC_ADD(&s->be->be_counters.retries, 1);
}
}
@@ -1197,10 +1197,11 @@
s->si[1].exp = tick_add_ifset(now_ms, s->be->timeout.connect);
if (srv) {
+ int count;
+
s->flags |= SF_CURR_SESS;
- srv->cur_sess++;
- if (srv->cur_sess > srv->counters.cur_sess_max)
- srv->counters.cur_sess_max = srv->cur_sess;
+ count = HA_ATOMIC_ADD(&srv->cur_sess, 1);
+ HA_ATOMIC_UPDATE_MAX(&srv->counters.cur_sess_max, count);
if (s->be->lbprm.server_take_conn)
s->be->lbprm.server_take_conn(srv);
@@ -1277,7 +1278,7 @@
s->si[1].err_type = SI_ET_QUEUE_ERR;
}
- srv->counters.failed_conns++;
+ HA_ATOMIC_ADD(&srv->counters.failed_conns, 1);
HA_ATOMIC_ADD(&s->be->be_counters.failed_conns, 1);
return 1;
@@ -1307,7 +1308,7 @@
if (srv)
srv_set_sess_last(srv);
if (srv)
- srv->counters.failed_conns++;
+ HA_ATOMIC_ADD(&srv->counters.failed_conns, 1);
HA_ATOMIC_ADD(&s->be->be_counters.failed_conns, 1);
/* release other streams waiting for this server */