fix memory leak in controller and use lock protect apiserver data structure
This commit is contained in:
parent
06c561cea4
commit
e7dc09c604
3 changed files with 29 additions and 3 deletions
|
|
@ -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);
|
||||||
|
|
|
||||||
|
|
@ -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;
|
||||||
|
|
|
||||||
|
|
@ -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:
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue