fix memory leak in controller and use lock protect apiserver data structure

This commit is contained in:
Rongsong Shen 2026-01-26 15:35:45 +08:00
parent 06c561cea4
commit e7dc09c604
3 changed files with 29 additions and 3 deletions

View file

@ -89,6 +89,7 @@ static int apiserver_push_joblist(cluster_t* c, xlist_t* l)
{
int i;
for (i = 0; i < N_APISERVER_MAX; i++) {
mylock_lock(&(c->apiservers[i].lock));
if ((c->apiservers[i].name != NULL) && c->apiservers[i].ep != NULL) {
int rc;
xce_data_t data;
@ -108,6 +109,7 @@ static int apiserver_push_joblist(cluster_t* c, xlist_t* l)
__func__, c->apiservers[i].name, rc);
}
}
mylock_unlock(&(c->apiservers[i].lock));
}
return 0;
@ -144,6 +146,7 @@ static int apiserver_job_start_fun(int type, int situation, void* data,
switch (situation) {
case HOOK_AFTER_EVENT:
for (i = 0; i < N_APISERVER_MAX; i++) {
mylock_lock(&(c->apiservers[i].lock));
if ((c->apiservers[i].name != NULL)
&& (c->apiservers[i].ep != NULL)) {
int rc;
@ -157,6 +160,7 @@ static int apiserver_job_start_fun(int type, int situation, void* data,
__func__, c->apiservers[i].name, rc);
}
}
mylock_unlock(&(c->apiservers[i].lock));
}
break;
default:
@ -176,6 +180,7 @@ static int apiserver_job_exit_fun(int type, int situation, void* data,
switch (situation) {
case HOOK_AFTER_EVENT:
for (i = 0; i < N_APISERVER_MAX; i++) {
mylock_lock(&(c->apiservers[i].lock));
if ((c->apiservers[i].name != NULL)
&& (c->apiservers[i].ep != NULL)) {
int rc;
@ -190,6 +195,7 @@ static int apiserver_job_exit_fun(int type, int situation, void* data,
__func__, c->apiservers[i].name, rc);
}
}
mylock_unlock(&(c->apiservers[i].lock));
}
break;
default:
@ -209,6 +215,7 @@ static int apiserver_job_fail_fun(int type, int situation, void* data,
switch (situation) {
case HOOK_AFTER_EVENT:
for (i = 0; i < N_APISERVER_MAX; i++) {
mylock_lock(&(c->apiservers[i].lock));
if ((c->apiservers[i].name != NULL)
&& (c->apiservers[i].ep != NULL)) {
int rc;
@ -223,6 +230,7 @@ static int apiserver_job_fail_fun(int type, int situation, void* data,
__func__, c->apiservers[i].name, rc);
}
}
mylock_lock(&(c->apiservers[i].lock));
}
break;
default:
@ -241,6 +249,7 @@ static int apiserver_job_update_fun(int type, int situation, void* data,
switch (situation) {
case HOOK_AFTER_EVENT:
for (i = 0; i < N_APISERVER_MAX; i++) {
mylock_lock(&(c->apiservers[i].lock));
if ((c->apiservers[i].name != NULL)
&& (c->apiservers[i].ep != NULL)) {
int rc;
@ -254,6 +263,7 @@ static int apiserver_job_update_fun(int type, int situation, void* data,
__func__, c->apiservers[i].name, rc);
}
}
mylock_unlock(&(c->apiservers[i].lock));
}
break;
default:
@ -273,6 +283,7 @@ static int apiserver_job_rusage_update_fun(int type, int situation, void* data,
switch (situation) {
case HOOK_AFTER_EVENT:
for (i = 0; i < N_APISERVER_MAX; i++) {
mylock_lock(&(c->apiservers[i].lock));
if ((c->apiservers[i].name != NULL)
&& (c->apiservers[i].ep != NULL)) {
int rc;
@ -285,6 +296,7 @@ static int apiserver_job_rusage_update_fun(int type, int situation, void* data,
__func__, c->apiservers[i].name, rc);
}
}
mylock_unlock(&(c->apiservers[i].lock));
}
break;
default:
@ -347,6 +359,7 @@ static int apiserver_worker_change(int type, int situation, void* data,
switch (situation) {
case HOOK_AFTER_EVENT:
for (i = 0; i < N_APISERVER_MAX; i++) {
mylock_lock(&(c->apiservers[i].lock));
if ((c->apiservers[i].name != NULL)
&& (c->apiservers[i].ep != NULL)) {
xlist_t wlist;
@ -362,6 +375,7 @@ static int apiserver_worker_change(int type, int situation, void* data,
}
xlist_fini(&wlist);
}
mylock_unlock(&(c->apiservers[i].lock));
}
break;
default:
@ -453,6 +467,7 @@ static int apiserver_resource_hook_fun(int type, int situation, int detail,
switch (situation) {
case HOOK_AFTER_EVENT:
for (i = 0; i < N_APISERVER_MAX; i++) {
mylock_lock(&(c->apiservers[i].lock));
if ((c->apiservers[i].name != NULL)
&& (c->apiservers[i].ep != NULL)) {
int rc;
@ -466,6 +481,7 @@ static int apiserver_resource_hook_fun(int type, int situation, int detail,
__func__, c->apiservers[i].name, rc);
}
}
mylock_unlock(&(c->apiservers[i].lock));
}
break;
default:
@ -485,6 +501,7 @@ static int apiserver_queue_hook_fun(int type, int situation, int detail,
switch (situation) {
case HOOK_AFTER_EVENT:
for (i = 0; i < N_APISERVER_MAX; i++) {
mylock_lock(&(c->apiservers[i].lock));
if ((c->apiservers[i].name != NULL)
&& (c->apiservers[i].ep != NULL)) {
int rc;
@ -499,6 +516,7 @@ static int apiserver_queue_hook_fun(int type, int situation, int detail,
__func__, c->apiservers[i].name, rc);
}
}
mylock_unlock(&(c->apiservers[i].lock));
}
break;
default:
@ -512,11 +530,12 @@ int apiserver_init(cluster_t* c)
{
int i;
for(i = 0; i < N_APISERVER_MAX; i ++) {
for (i = 0; i < N_APISERVER_MAX; i++) {
mylock_init(&(c->apiservers[i].lock));
c->apiservers[i].name = NULL;
c->apiservers[i].ep = NULL;
c->apiservers[i].ep = NULL;
}
xce_add_hook(&(c->hooksys), XCE_CONTROLLER_HOOK_JOB,
(hook_fn_t)apiserver_job_hook_fun, NULL);
xce_add_hook(&(c->hooksys), XCE_CONTROLLER_HOOK_WORKER,
@ -553,6 +572,10 @@ int handle_apiserver_leave(cluster_t* c, endpoint_t* ep)
}
i = priv->u.idx;
if (i < 0) {
SET_ERROR(EINVAL);
return -errno;
}
if (c->apiservers[i].name != NULL) {
obj_deref(c->apiservers[i].name);