MEDIUM: threads/server: Use the server lock to protect health check and cli concurrency
diff --git a/src/hlua_fcn.c b/src/hlua_fcn.c
index a4adb21..60becb0 100644
--- a/src/hlua_fcn.c
+++ b/src/hlua_fcn.c
@@ -626,7 +626,9 @@
struct server *srv;
srv = hlua_check_server(L, 1);
+ SPIN_LOCK(SERVER_LOCK, &srv->lock);
srv_shutdown_streams(srv, SF_ERR_KILLED);
+ SPIN_UNLOCK(SERVER_LOCK, &srv->lock);
return 0;
}
@@ -635,7 +637,9 @@
struct server *srv;
srv = hlua_check_server(L, 1);
+ SPIN_LOCK(SERVER_LOCK, &srv->lock);
srv_adm_set_drain(srv);
+ SPIN_UNLOCK(SERVER_LOCK, &srv->lock);
return 0;
}
@@ -644,7 +648,9 @@
struct server *srv;
srv = hlua_check_server(L, 1);
+ SPIN_LOCK(SERVER_LOCK, &srv->lock);
srv_adm_set_maint(srv);
+ SPIN_UNLOCK(SERVER_LOCK, &srv->lock);
return 0;
}
@@ -653,7 +659,9 @@
struct server *srv;
srv = hlua_check_server(L, 1);
+ SPIN_LOCK(SERVER_LOCK, &srv->lock);
srv_adm_set_ready(srv);
+ SPIN_UNLOCK(SERVER_LOCK, &srv->lock);
return 0;
}
@@ -662,9 +670,11 @@
struct server *sv;
sv = hlua_check_server(L, 1);
+ SPIN_LOCK(SERVER_LOCK, &sv->lock);
if (sv->check.state & CHK_ST_CONFIGURED) {
sv->check.state |= CHK_ST_ENABLED;
}
+ SPIN_UNLOCK(SERVER_LOCK, &sv->lock);
return 0;
}
@@ -673,9 +683,11 @@
struct server *sv;
sv = hlua_check_server(L, 1);
+ SPIN_LOCK(SERVER_LOCK, &sv->lock);
if (sv->check.state & CHK_ST_CONFIGURED) {
sv->check.state &= ~CHK_ST_ENABLED;
}
+ SPIN_UNLOCK(SERVER_LOCK, &sv->lock);
return 0;
}
@@ -685,8 +697,10 @@
sv = hlua_check_server(L, 1);
if (!(sv->track)) {
+ SPIN_LOCK(SERVER_LOCK, &sv->lock);
sv->check.health = sv->check.rise + sv->check.fall - 1;
srv_set_running(sv, "changed from Lua script", NULL);
+ SPIN_UNLOCK(SERVER_LOCK, &sv->lock);
}
return 0;
}
@@ -697,8 +711,10 @@
sv = hlua_check_server(L, 1);
if (!(sv->track)) {
+ SPIN_LOCK(SERVER_LOCK, &sv->lock);
sv->check.health = sv->check.rise + sv->check.fall - 1;
srv_set_stopping(sv, "changed from Lua script", NULL);
+ SPIN_UNLOCK(SERVER_LOCK, &sv->lock);
}
return 0;
}
@@ -708,10 +724,12 @@
struct server *sv;
sv = hlua_check_server(L, 1);
+ SPIN_LOCK(SERVER_LOCK, &sv->lock);
if (!(sv->track)) {
sv->check.health = 0;
srv_set_stopped(sv, "changed from Lua script", NULL);
}
+ SPIN_UNLOCK(SERVER_LOCK, &sv->lock);
return 0;
}
@@ -720,9 +738,11 @@
struct server *sv;
sv = hlua_check_server(L, 1);
+ SPIN_LOCK(SERVER_LOCK, &sv->lock);
if (sv->agent.state & CHK_ST_CONFIGURED) {
sv->agent.state |= CHK_ST_ENABLED;
}
+ SPIN_UNLOCK(SERVER_LOCK, &sv->lock);
return 0;
}
@@ -731,9 +751,11 @@
struct server *sv;
sv = hlua_check_server(L, 1);
+ SPIN_LOCK(SERVER_LOCK, &sv->lock);
if (sv->agent.state & CHK_ST_CONFIGURED) {
sv->agent.state &= ~CHK_ST_ENABLED;
}
+ SPIN_UNLOCK(SERVER_LOCK, &sv->lock);
return 0;
}
@@ -742,10 +764,12 @@
struct server *sv;
sv = hlua_check_server(L, 1);
+ SPIN_LOCK(SERVER_LOCK, &sv->lock);
if (sv->agent.state & CHK_ST_ENABLED) {
sv->agent.health = sv->agent.rise + sv->agent.fall - 1;
srv_set_running(sv, "changed from Lua script", NULL);
}
+ SPIN_UNLOCK(SERVER_LOCK, &sv->lock);
return 0;
}
@@ -754,10 +778,12 @@
struct server *sv;
sv = hlua_check_server(L, 1);
+ SPIN_LOCK(SERVER_LOCK, &sv->lock);
if (sv->agent.state & CHK_ST_ENABLED) {
sv->agent.health = 0;
srv_set_stopped(sv, "changed from Lua script", NULL);
}
+ SPIN_UNLOCK(SERVER_LOCK, &sv->lock);
return 0;
}