MEDIUM: threads/proxy: Add a lock per proxy and atomically update proxy vars
Now, each proxy contains a lock that must be used when necessary to protect
it. Moreover, all proxy's counters are now updated using atomic operations.
diff --git a/src/backend.c b/src/backend.c
index d0810e2..475efa3 100644
--- a/src/backend.c
+++ b/src/backend.c
@@ -701,7 +701,7 @@
goto out;
}
else if (srv != prev_srv) {
- s->be->be_counters.cum_lbconn++;
+ HA_ATOMIC_ADD(&s->be->be_counters.cum_lbconn, 1);
srv->counters.cum_lbconn++;
}
s->target = &srv->obj_type;
@@ -880,10 +880,10 @@
}
s->flags |= SF_REDISP;
prev_srv->counters.redispatches++;
- s->be->be_counters.redispatches++;
+ HA_ATOMIC_ADD(&s->be->be_counters.redispatches, 1);
} else {
prev_srv->counters.retries++;
- s->be->be_counters.retries++;
+ HA_ATOMIC_ADD(&s->be->be_counters.retries, 1);
}
}
}
@@ -1279,7 +1279,7 @@
}
srv->counters.failed_conns++;
- s->be->be_counters.failed_conns++;
+ HA_ATOMIC_ADD(&s->be->be_counters.failed_conns, 1);
return 1;
case SRV_STATUS_NOSRV:
@@ -1288,7 +1288,7 @@
s->si[1].err_type = SI_ET_CONN_ERR;
}
- s->be->be_counters.failed_conns++;
+ HA_ATOMIC_ADD(&s->be->be_counters.failed_conns, 1);
return 1;
case SRV_STATUS_QUEUED:
@@ -1309,7 +1309,7 @@
srv_set_sess_last(srv);
if (srv)
srv->counters.failed_conns++;
- s->be->be_counters.failed_conns++;
+ HA_ATOMIC_ADD(&s->be->be_counters.failed_conns, 1);
/* release other streams waiting for this server */
if (may_dequeue_tasks(srv, s->be))
@@ -1328,7 +1328,7 @@
void set_backend_down(struct proxy *be)
{
be->last_change = now.tv_sec;
- be->down_trans++;
+ HA_ATOMIC_ADD(&be->down_trans, 1);
if (!(global.mode & MODE_STARTING)) {
Alert("%s '%s' has no server available!\n", proxy_type_str(be), be->id);