From 43dc12a36cff8c6747cfb7574cd5ca6ce3d95513 Mon Sep 17 00:00:00 2001 From: Rongsong Shen Date: Fri, 6 Mar 2026 18:20:30 +0800 Subject: [PATCH] save works --- src/apiserver/meson.build | 1 + src/controller/cluster.c | 8 ------ src/include/config.h | 12 ++++++++ src/include/xce/cluster_def.h | 2 -- src/lib/jobj.c | 6 ++-- src/lib/resobj.c | 4 ++- src/lib/resreq.c | 2 ++ src/lib/testsuite/test_jobj.c | 2 -- src/lib/testsuite/test_qobj.c | 2 -- src/lib/testsuite/test_resreq.c | 2 +- src/lib/testsuite/test_wobj.c | 1 - src/lib/xcelimit.c | 47 ++++++++++--------------------- src/lib/zarray.c | 5 +++- src/meson.build | 4 +++ src/nixSupport/xce.nix | 8 +++++- src/scheduler/src/plugins/limit.c | 3 +- src/scheduler/src/resource.c | 4 +-- src/scheduler/src/schedobj.c | 23 +++++++-------- src/scheduler/src/scheduler.c | 16 ++++++++--- 19 files changed, 80 insertions(+), 72 deletions(-) diff --git a/src/apiserver/meson.build b/src/apiserver/meson.build index 953ba2cf..8c97ea40 100644 --- a/src/apiserver/meson.build +++ b/src/apiserver/meson.build @@ -8,6 +8,7 @@ endif apiserver_ext_deps = [ libxce_dep, + librtti_dep, c_capnproto_dep, ssl_dep, tinylog_dep, diff --git a/src/controller/cluster.c b/src/controller/cluster.c index aa978fda..5ce01ed0 100644 --- a/src/controller/cluster.c +++ b/src/controller/cluster.c @@ -376,14 +376,6 @@ int cluster_build_resources(cluster_t* c) if (res == NULL) { return -errno; } - - if ((res->flags & XCE_RESF_GLOBAL) != 0) { - res->idx = c->n_shared_res; - c->n_shared_res++; - } else { - res->idx = c->n_host_res; - c->n_host_res++; - } } return 0; diff --git a/src/include/config.h b/src/include/config.h index a88523ef..e25bd015 100644 --- a/src/include/config.h +++ b/src/include/config.h @@ -4,6 +4,18 @@ #include +#if defined(__has_c_attribute) && __has_c_attribute(gnu::constructor) +#define CONSTRUCTOR(prio) [[gnu::constructor(prio)]] +#define DESTRUCTOR(prio) [[gnu::destructor(prio)]] +#elif defined(__GNUC__) || defined(__clang__) +#define CONSTRUCTOR(prio) __attribute__((constructor(prio))) +#define DESTRUCTOR(prio) __attribute__((destructor(prio))) +#else +#define CONSTRUCTOR(prio) +#define DESTRUCTOR(prio) +#warning "No constructor support found" +#endif + typedef uint64_t jobid_t; #define BUG_EMAIL "rshen@shenrs.eu" diff --git a/src/include/xce/cluster_def.h b/src/include/xce/cluster_def.h index b5a84fdf..cd6f35be 100644 --- a/src/include/xce/cluster_def.h +++ b/src/include/xce/cluster_def.h @@ -102,8 +102,6 @@ typedef struct { int myidx; int master; int ncontrollers; - int n_shared_res; - int n_host_res; delaymgr_t delaymgr; scheduler_t sched; var jobmgr; diff --git a/src/lib/jobj.c b/src/lib/jobj.c index 976949cd..d8e84e71 100644 --- a/src/lib/jobj.c +++ b/src/lib/jobj.c @@ -8,10 +8,10 @@ #include "jobj.h" #include "kv.h" #include "mylock.h" +#include "preason.h" #include "utils.h" #include "xce/types.h" #include "xstring.h" -#include "preason.h" static struct { mylock_t lock; @@ -588,11 +588,11 @@ static void job_destroy(meta_obj_t* obj) if (j->job.run_usage != NULL) { int i; - for(i = 0; i < j->job.run_usage->num_hosts; i ++) { + for (i = 0; i < j->job.run_usage->num_hosts; i++) { if (j->job.run_usage->host_runusage[i] != NULL) { FREEUP(j->job.run_usage->host_runusage[i]->host_name); } - + FREEUP(j->job.run_usage->host_runusage[i]); } diff --git a/src/lib/resobj.c b/src/lib/resobj.c index fb9358c2..6ed34f6d 100644 --- a/src/lib/resobj.c +++ b/src/lib/resobj.c @@ -126,13 +126,15 @@ static xce_resource_t* makeResource_(var resmgr, xce_resource_t* r) resobj = makeInstance(&resobj_type, r); if (resobj != NULL) { rc = key_add(resmgr, (void*)resobj->name, (void*)resobj); - + if (rc < 0) { destroy(resobj); errno = -rc; return NULL; } + + resobj->idx = rc; } return resobj; } diff --git a/src/lib/resreq.c b/src/lib/resreq.c index 25bf5e54..752675ac 100644 --- a/src/lib/resreq.c +++ b/src/lib/resreq.c @@ -75,6 +75,8 @@ int parse_section(xce_resreq_data_t* resreq, char* data, char** errmsg) *errmsg = NULL; ctx.input = data; + memset(resreq, 0x0, sizeof(*resreq)); + p = xce_section_create(&ctx); if (p == NULL) { return -errno; diff --git a/src/lib/testsuite/test_jobj.c b/src/lib/testsuite/test_jobj.c index 6ddc979c..892150fc 100644 --- a/src/lib/testsuite/test_jobj.c +++ b/src/lib/testsuite/test_jobj.c @@ -281,8 +281,6 @@ static void test_job_create(void) && (j2->job.submit->mintasks == 1) && (j2->job.submit->maxtasks == 5) && (j2->job.submit->user_group == NULL)); - dereference(j2); - destroy(jobmgr); job_obj_fini(); diff --git a/src/lib/testsuite/test_qobj.c b/src/lib/testsuite/test_qobj.c index 004dff41..9a405599 100644 --- a/src/lib/testsuite/test_qobj.c +++ b/src/lib/testsuite/test_qobj.c @@ -37,8 +37,6 @@ static void test_queue_create(void) TEST_ASSERT_TRUE(q != NULL); - dereference(q); - destroy(qmgr); xstring_table_fini(); } diff --git a/src/lib/testsuite/test_resreq.c b/src/lib/testsuite/test_resreq.c index 49f4fd64..e360f4aa 100644 --- a/src/lib/testsuite/test_resreq.c +++ b/src/lib/testsuite/test_resreq.c @@ -52,7 +52,7 @@ void test_parse_section_fail(void) "same[type] same[abcd] affinity[core(20)]"; char* errmsg = NULL; int rc = 0; - xce_resreq_data_t data; + xce_resreq_data_t data = {0}; rc = parse_section(&data, (char*)resreq, &errmsg); TEST_ASSERT_TRUE(rc < 0); diff --git a/src/lib/testsuite/test_wobj.c b/src/lib/testsuite/test_wobj.c index 99b5acb1..12d01f59 100644 --- a/src/lib/testsuite/test_wobj.c +++ b/src/lib/testsuite/test_wobj.c @@ -47,7 +47,6 @@ static void test_worker_create(void) && (w->host.attrs->cpufactor == attrs1.cpufactor) && (w->host.attrs->maxcpus == attrs1.maxcpus)); - dereference(w); destroy(workermgr); xstring_table_fini(); diff --git a/src/lib/xcelimit.c b/src/lib/xcelimit.c index 65e12eb8..43aa917a 100644 --- a/src/lib/xcelimit.c +++ b/src/lib/xcelimit.c @@ -305,10 +305,10 @@ int match_limit(xce_limit_t* limit, int global, ...) int build_vres_name(char** vname, xce_limit_t* limit, char* user, char* queue, char* project) { - char resname[2 * XCE_MAXNAME_LEN + 1]; - xce_consumer_t* c = NULL; - char* p = NULL; - int rc = 0; + size_t bufsize = 0; + FILE* fp = NULL; + xce_consumer_t* c = NULL; + int rc = 0; *vname = NULL; if ((vname == NULL) || (limit == NULL) || (user == NULL) || (queue == NULL) @@ -316,50 +316,33 @@ int build_vres_name(char** vname, xce_limit_t* limit, char* user, char* queue, return -EINVAL; } - memset(resname, 0x0, sizeof(resname)); - - p = &resname[0]; - - rc = sprintf(p, "limit=%s", limit->name); - if (rc < 0) { - return rc; + fp = open_memstream(vname, &bufsize); + if (fp == NULL) { + return -errno; } - p += rc; + fprintf(fp, "limit=%s", limit->name); c = limit->consumers[CONSUMER_USER]; if ((c != NULL) && (c->per_consumer == 1)) { - rc = sprintf(p, "/u=%s", user); - if (rc < 0) { - return rc; - } - - p += rc; + fprintf(fp, "/u=%s", user); } c = limit->consumers[CONSUMER_QUEUE]; if ((c != NULL) && (c->per_consumer == 1)) { - rc = sprintf(p, "/q=%s", queue); - if (rc < 0) { - return rc; - } - - p += rc; + fprintf(fp, "/q=%s", queue); } c = limit->consumers[CONSUMER_PROJECT]; if ((c != NULL) && (c->per_consumer == 1)) { - rc = sprintf(p, "/p=%s", project); - if (rc < 0) { - return rc; - } - - p += rc; + fprintf(fp, "/p=%s", project); } - *vname = strdup(resname); - + fflush(fp); + + fclose(fp); + if ((*vname) != NULL) { return 1; } diff --git a/src/lib/zarray.c b/src/lib/zarray.c index 4f7b377c..29c660d6 100644 --- a/src/lib/zarray.c +++ b/src/lib/zarray.c @@ -444,7 +444,10 @@ static int xzarray_ensure_items(xzarray_t* array, int mincap) /* this will make we can get next free * location quickly */ - array->pos = array->caps; + if (array->data[array->pos].inuse) { + array->pos = array->caps; + } + array->caps = nc; return 1; diff --git a/src/meson.build b/src/meson.build index 76d989c7..0d7e9272 100644 --- a/src/meson.build +++ b/src/meson.build @@ -11,14 +11,18 @@ if get_option('buildtype') == 'debug' # add -DWITH_DEBUG=1 add_project_arguments(['-DWITH_DEBUG=1', '-DDEBUG', + '-O0', + '-fno-lto', '-Wno-cpp', '-fno-inline', '-fno-omit-frame-pointer', '-ggdb', + '-gdwarf-4', '-g3', '-fvar-tracking', '-fvar-tracking-assignments', ], language: ['c', 'cpp']) + add_project_link_arguments('-fno-lto', language: ['c', 'cpp']) with_debug=true endif diff --git a/src/nixSupport/xce.nix b/src/nixSupport/xce.nix index 425e2dab..c4a06902 100644 --- a/src/nixSupport/xce.nix +++ b/src/nixSupport/xce.nix @@ -57,7 +57,13 @@ stdenv.mkDerivation { separateDebugInfo = true; })) packcc - ] ++ (if withDebug then [librtti_debug] else [librtti]); + ] ++ (if withDebug then [ + (librtti_debug.overrideAttrs (oldattrs: { + separateDebugInfo = true; + })) + ] else [ + librtti + ]); build-system = [ pkgs.meson ]; diff --git a/src/scheduler/src/plugins/limit.c b/src/scheduler/src/plugins/limit.c index 8a170e3b..1c08e40a 100644 --- a/src/scheduler/src/plugins/limit.c +++ b/src/scheduler/src/plugins/limit.c @@ -11,6 +11,7 @@ #include "utils.h" #include "xcelimit.h" #include "xlist.h" +#include "xstring.h" typedef struct { var limits; @@ -398,7 +399,7 @@ static int build_limit_vres_requests(xce_scheduler_t* sched, continue; } - rq->res = strdup(vres->vres->name); + rq->res = makeString(vres->vres->name); rq->value = get_vres_value(ctx, vres); xlist_store(requests, rq); diff --git a/src/scheduler/src/resource.c b/src/scheduler/src/resource.c index b90e5ad8..320e4f79 100644 --- a/src/scheduler/src/resource.c +++ b/src/scheduler/src/resource.c @@ -342,8 +342,8 @@ static int sched_update_res_accounts(xce_scheduler_t* sched, zarray_t* array, for (i = 0; i < naccounts; i++) { float val = accounts[i]->used + accounts[i]->reserved; - TRACE("%s resource %d old %f delta %f charge %d", __func__, vals[i], - val, charge); + TRACE("%s resource %d old %f delta %f charge %d", __func__, idxs[i], + vals[i], val, charge); if (charge) { vals[i] += val; } else { diff --git a/src/scheduler/src/schedobj.c b/src/scheduler/src/schedobj.c index eb7259a9..2ae977c2 100644 --- a/src/scheduler/src/schedobj.c +++ b/src/scheduler/src/schedobj.c @@ -12,6 +12,7 @@ #include "xcealloc.h" #include "xlist.h" #include "xvec.h" +#include "xstring.h" void kill_sched_job(void* arg) { @@ -29,7 +30,7 @@ request_res_t* make_resource_request(char* res, float value) return NULL; } - req->res = strdup(res); + req->res = makeString(res); req->value = value; return req; @@ -111,9 +112,9 @@ static int make_sched_obj(xce_sched_obj_t* obj, xce_scheduler_t* sched, { int rc = 0; - obj->user = strdup(j->submit->user); - obj->queue = strdup(j->submit->queue); - obj->project = strdup(j->submit->project_name); + obj->user = makeString(j->submit->user); + obj->queue = makeString(j->submit->queue); + obj->project = makeString(j->submit->project_name); xlist_init(&(obj->glimits), 8); zarray_init(&(obj->hlimits), 32, NULL); @@ -218,7 +219,7 @@ xce_sched_queue_t* make_sched_queue(void* arg, xce_queue_t* q) return NULL; } - queue->name = strdup(q->queue); + queue->name = makeString(q->queue); queue->attrs = q->attrs; queue->status = q->status; queue->priority = q->priority; @@ -259,7 +260,7 @@ xce_sched_worker_t* make_sched_worker(void* arg, xce_worker_t* w) return NULL; } - worker->name = strdup(w->name); + worker->name = makeString(w->name); worker->status = w->status; worker->idx = -1; @@ -288,7 +289,7 @@ void kill_sched_user(void* arg) return; } - FREEUP(user->name); + dereference(user->name); FREEUP(user); } @@ -302,7 +303,7 @@ xce_sched_user_t* make_sched_user(void* arg, char* name) return NULL; } - user->name = strdup(name); + user->name = makeString(name); sched_add_user(sched, user); @@ -317,7 +318,7 @@ void kill_sched_project(void* arg) return; } - FREEUP(project->name); + dereference(project->name); FREEUP(project); } @@ -332,9 +333,9 @@ xce_sched_project_t* make_sched_project(void* arg, char* name) } if ((name == NULL) || (strlen(name) == 0)) { - project->name = strdup("default"); + project->name = makeString("default"); } else { - project->name = strdup(name); + project->name = makeString(name); } sched_add_project(sched, project); diff --git a/src/scheduler/src/scheduler.c b/src/scheduler/src/scheduler.c index ec34e267..21952f72 100644 --- a/src/scheduler/src/scheduler.c +++ b/src/scheduler/src/scheduler.c @@ -13,6 +13,7 @@ #include "misc.h" #include "plugin.h" #include "preason.h" +#include "resobj.h" #include "scheduler.h" #include "utils.h" #include "xcealloc.h" @@ -465,11 +466,18 @@ static int sched_init_resources(xce_scheduler_t* sched) xce_conf4sched_t* config = sched->config; for (i = 0; i < config->n_resources; i++) { - xce_resource_t* r = config->resources[i]; + xce_resource_t* r = config->resources[i]; + xce_resource_t* r1 = NULL; - lock(sched->resmgr, RTTI_LOCK_WRITE); - key_add(sched->resmgr, (void*)r->name, (void*)r); - unlock(sched->resmgr); + if (r == NULL) { + continue; + } + + r1 = makeResource(sched->resmgr, r); + + if (r1 == NULL) { + ERROR("%s add resource %s failed", __func__, r->name); + } } return 0; }