fix memory leak

This commit is contained in:
Rongsong Shen 2025-12-10 15:25:05 +08:00
parent cf1dbdc07a
commit e001d4955c
3 changed files with 48 additions and 68 deletions

View file

@ -410,8 +410,9 @@ int handle_jobdispatch(cluster_t* c, endpoint_t* ep, xce_request_t* request)
} else {
/* notify dispatch ok */
notify_dispatch(c, ep, alloc->jobid, 0);
free_JobAlloc_ptr(&(alloc));
}
free_JobAlloc_ptr(&(alloc));
}
return rc;
}

View file

@ -13,6 +13,7 @@
#include <readline/readline.h>
#include <cjson/cJSON.h>
#include <cjson/s2j.h>
#include "client.h"
#include "controller.capnp.h"
@ -60,11 +61,25 @@ typedef struct {
int ntasks;
} host_task_t;
typedef struct {
char* PATH;
} sub_envs_t;
typedef struct {
sub_envs_t sub_env_vars;
} exdata_t;
#define MAX_RUN_JOBS (20)
#define MAX_TASK_HOSTS (5)
#define MAX_RUN_TASKS (50)
#define RUSAGE_UPDATE_INTERVAL (60)
#define S2J_JSON_SET_var_string_ELEMENT(to_json, from_struct, _element) \
if (((from_struct) != NULL) && (((from_struct)->_element) != NULL)) { \
cJSON_AddStringToObject((to_json), #_element, \
(from_struct)->_element); \
}
static run_job_t run_jobs[MAX_RUN_JOBS];
static run_task_t run_tasks[MAX_RUN_TASKS];
@ -767,41 +782,16 @@ int cmd_jobrun(int argc, char* argv[])
static int build_job_envs(xce_job_submit_t* submit)
{
char* names[] = { "PATH", "LSAN_OPTIONS", NULL };
int i;
cJSON* top;
cJSON* envars;
char* exdata;
exdata_t exdata = { .sub_env_vars = { .PATH = getenv("PATH") } };
top = cJSON_CreateObject();
if (top == NULL) {
return -1;
}
s2j_create_json_obj(json_exdata);
s2j_create_json_obj(json_envs);
s2j_json_set_basic_element(json_envs, &(exdata.sub_env_vars), var_string,
PATH);
cJSON_AddItemToObject(json_exdata, "sub_env_vars", json_envs);
envars = cJSON_CreateObject();
if (envars == NULL) {
return -1;
}
cJSON_AddItemToObject(top, "sub_env_vars", envars);
for (i = 0; names[i] != NULL; i++) {
cJSON* val;
char* s = getenv(names[i]);
if (s == NULL) {
s = "";
}
val = cJSON_CreateString(s);
cJSON_AddItemToObject(envars, names[i], val);
}
exdata = cJSON_Print(top);
submit->submit->start_info->exdata = exdata;
cJSON_Delete(top);
submit->submit->start_info->exdata = cJSON_Print(json_exdata);
cJSON_Delete(json_exdata);
return 0;
}

View file

@ -250,6 +250,7 @@ void job_obj_killer(job_t* job)
}
obj = TO_MYOBJ(job);
if (job->job.submit != NULL) {
DEREF_OBJ(job->job.submit->queue);
DEREF_OBJ(job->job.submit->user);
DEREF_OBJ(job->job.submit->job_name);
@ -257,6 +258,21 @@ void job_obj_killer(job_t* job)
DEREF_OBJ(job->job.submit->job_description);
DEREF_OBJ(job->job.submit->resreq);
if (job->job.submit->start_info != NULL) {
DEREF_OBJ(job->job.submit->start_info->cmdline);
DEREF_OBJ(job->job.submit->start_info->exechome);
DEREF_OBJ(job->job.submit->start_info->execcwd);
DEREF_OBJ(job->job.submit->start_info->execuser);
DEREF_OBJ(job->job.submit->start_info->exdata);
DEREF_OBJ(job->job.submit->start_info->launch_type);
DEREF_OBJ(job->job.submit->start_info->job_pre_exec);
DEREF_OBJ(job->job.submit->start_info->job_post_exec);
FREEUP(job->job.submit->start_info);
}
FREEUP(job->job.submit);
}
if (job->job.pidinfo != NULL) {
FREEUP(job->job.pidinfo->pids);
FREEUP(job->job.pidinfo->pgids);
@ -268,22 +284,7 @@ void job_obj_killer(job_t* job)
}
if (job->job.allocs != NULL) {
for (int i = 0; i < job->job.allocs->nhosts; i++) {
FREEUP(job->job.allocs->allocs[i]->host);
for (int k = 0; k < job->job.allocs->allocs[i]->nallocs; k++) {
xce_alloc_t* alloc
= (xce_alloc_t*)job->job.allocs->allocs[i]->allocs[k];
if (alloc == NULL) {
continue;
}
FREEUP(alloc->resname);
FREEUP(alloc->reserve);
free(alloc);
}
FREEUP(job->job.allocs->allocs[i]);
}
FREEUP(job->job.allocs->allocs);
FREEUP(job->job.allocs);
free_JobAlloc_ptr(&(job->job.allocs));
}
if (job->job.run_usage != NULL) {
@ -295,18 +296,6 @@ void job_obj_killer(job_t* job)
FREEUP(job->job.run_usage);
}
if (job->job.submit->start_info != NULL) {
DEREF_OBJ(job->job.submit->start_info->cmdline);
DEREF_OBJ(job->job.submit->start_info->exechome);
DEREF_OBJ(job->job.submit->start_info->execcwd);
DEREF_OBJ(job->job.submit->start_info->execuser);
DEREF_OBJ(job->job.submit->start_info->exdata);
DEREF_OBJ(job->job.submit->start_info->launch_type);
DEREF_OBJ(job->job.submit->start_info->job_pre_exec);
DEREF_OBJ(job->job.submit->start_info->job_post_exec);
FREEUP(job->job.submit->start_info);
}
FREEUP(job->job.exit_info);
memset(obj, 0x0, sizeof(*obj));