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

View file

@ -83,6 +83,7 @@ typedef struct {
} scheduler_t; } scheduler_t;
typedef struct { typedef struct {
mylock_t lock;
char* name; char* name;
endpoint_t* ep; endpoint_t* ep;
} cluster_apiserver_t; } cluster_apiserver_t;

View file

@ -372,9 +372,11 @@ int xce_push_data_req(endpoint_t* ep, xce_peerinfo_t* from, xce_data_t* data,
switch (data->table) { switch (data->table) {
case Data_data_schedjobs: case Data_data_schedjobs:
case Data_data_jobs:
FREEUP(data1.data.jobs); FREEUP(data1.data.jobs);
break; break;
case Data_data_schedworkers: case Data_data_schedworkers:
case Data_data_workers:
FREEUP(data1.data.workers); FREEUP(data1.data.workers);
break; break;
default: default: