save works

This commit is contained in:
Rongsong Shen 2026-02-28 17:55:50 +08:00
parent b1faeb94b6
commit b748e30d20
35 changed files with 1247 additions and 2149 deletions

View file

@ -66,11 +66,11 @@ typedef struct {
void* affinity_allocator;
void* gpu_allocator;
dataq_t* pend_updates[2];
resmgr_t resmgr;
groupmgr_t ugmgr;
groupmgr_t qgmgr;
groupmgr_t pgmgr;
groupmgr_t hgmgr;
var resmgr;
var ugmgr;
var qgmgr;
var pgmgr;
var hgmgr;
zarray_t sharedInst;
zarray_t sharedInUse;
var jobs;

View file

@ -64,8 +64,8 @@ static int limit_update_config(xce_sched_plugin_t* plugin,
int rc;
xce_limit_t* limit;
rc = build_limit(&limit, &(sched->ugmgr), &(sched->qgmgr),
&(sched->pgmgr), &(sched->hgmgr), limits[i]);
rc = build_limit(&limit, (sched->ugmgr), (sched->qgmgr),
(sched->pgmgr), (sched->hgmgr), limits[i]);
if (rc < 0) {
return rc;
}

View file

@ -1,5 +1,6 @@
#include <errno.h>
#include <pthread.h>
#include <rtti.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
@ -50,6 +51,7 @@ static int seqjob_prepare_allocation(void* arg, xce_sched_ctx_t* ctx)
xce_sched_obj_t* obj = NULL;
xce_resource_t* r = NULL;
xce_primary_resreq_t* primary = NULL;
int rc = 0;
if ((plugin == NULL) || (ctx == NULL) || (sched == NULL)) {
return -EINVAL;
@ -73,15 +75,23 @@ static int seqjob_prepare_allocation(void* arg, xce_sched_ctx_t* ctx)
if (ctx->worker == NULL) {
ctx->nhosts = 1;
ctx->nslots = 1;
calc_wanted_global_resvals(&(ctx->alloc_req.shared), &(sched->resmgr),
calc_wanted_global_resvals(&(ctx->alloc_req.shared), sched->resmgr,
&(primary->rusages), PER_TASK, 1, 1);
} else {
calc_wanted_host_resvals(&(ctx->alloc_req.host), &(sched->resmgr),
calc_wanted_host_resvals(&(ctx->alloc_req.host), sched->resmgr,
&(primary->rusages), PER_TASK, 1, 1);
}
/* add slots into requested resources */
r = resmgr_lockres(&(sched->resmgr), "slots", OBJREF_NOP);
rc = key_find(sched->resmgr, (void*)"slots", (void**)&r);
if (rc < 0) {
return rc;
}
if (rc == 0) {
return -ENOENT;
}
if (r == NULL) {
return -EINVAL;
}
@ -123,8 +133,14 @@ static int my_alloc(xce_sched_plugin_t* plugin, xce_sched_ctx_t* ctx)
int i;
for (i = 0; i < ctx->alloc_req.shared.count; i++) {
xce_resource_t* r = resmgr_lock_byid(
&(sched->resmgr), ((int*)ctx->unmeet.idxs.data)[i], OBJREF_NOP);
xce_resource_t* r = NULL;
rc = vget(sched->resmgr, ((int*)ctx->unmeet.idxs.data)[i],
(void**)&r);
if (rc <= 0) {
continue;
}
add_job_preason(reason->reasons, PREASON_NO_RESOURCE, NULL,
r->name);
}

View file

@ -299,20 +299,27 @@ static int sched_update_res_accounts(xce_scheduler_t* sched, zarray_t* array,
xce_res_account_t* acct = accounts[i];
if (acct->residx < 0) {
xce_resource_t* r
= resmgr_lockres(&(sched->resmgr), acct->resname, OBJREF_NOP);
xce_resource_t* r = NULL;
int rc = 0;
rc = key_find(sched->resmgr, (void*)acct->resname, (void**)&r);
if (rc < 0) {
return rc;
}
/* It's possible that r return NULL if acct->resname is a
* virtual resource of limit */
if (r == NULL) {
int rc;
rc = add_vres(&r, &(sched->resmgr), acct->resname, global);
rc = add_vres(&r, sched->resmgr, acct->resname, global);
if (rc < 0) {
return rc;
}
r = resmgr_lockres(&(sched->resmgr), acct->resname, OBJREF_NOP);
rc = key_find(sched->resmgr, (void*)acct->resname, (void**)&r);
if (rc < 0) {
return rc;
}
}
if (r != NULL) {
@ -383,8 +390,13 @@ static int sched_try_alloc_on_host_(xce_sched_worker_t* w, va_list ap)
int i;
for (i = 0; i < ctx->unmeet.count; i++) {
xce_resource_t* r = resmgr_lock_byid(
&(sched->resmgr), ((int*)ctx->unmeet.idxs.data)[i], OBJREF_NOP);
xce_resource_t* r = NULL;
rc = vget(sched->resmgr, ((int*)ctx->unmeet.idxs.data)[i],
(void**)&r);
if (rc < 0) {
continue;
}
add_job_preason(ctx->reason->reasons, PREASON_NO_RESOURCE, w->name,
r->name);

View file

@ -346,6 +346,11 @@ int sched_init(xce_scheduler_t* sched, xce_client_config_t* config,
.nslots = 31,
.delta = 8,
.datakiller = (destroy_fn_t)kill_sched_project };
kvmgr_params_t resmgr_params = { .key_type = KVMGR_KEY_STRING,
.dynamic = 1,
.nslots = 64,
.delta = 8,
.datakiller = NULL };
if ((sched == NULL) || (config == NULL) || (handler == NULL)) {
return -EINVAL;
@ -367,11 +372,8 @@ int sched_init(xce_scheduler_t* sched, xce_client_config_t* config,
sched->pend_updates[1] = (dataq_t*)calloc(1, sizeof(dataq_t));
dataq_init(sched->pend_updates[1], sched_pend_update_killer);
resmgr_init(
&(sched->resmgr), /* slots */ 128, /* delta */ 128,
/* should be NULL as resmgr will provide hash find by resource name, the
real resource stored in sched->config->resources[] */
NULL);
sched->resmgr = makeInstance(&xkvmgr_type, &resmgr_params);
groupmgr_init(&(sched->ugmgr), 64, 64);
groupmgr_init(&(sched->qgmgr), 16, 16);
groupmgr_init(&(sched->pgmgr), 16, 16);
@ -446,11 +448,12 @@ void sched_fini(xce_scheduler_t* sched)
dataq_fini(sched->pend_updates[0]);
dataq_fini(sched->pend_updates[1]);
resmgr_fini(&(sched->resmgr));
groupmgr_fini(&(sched->ugmgr));
groupmgr_fini(&(sched->qgmgr));
groupmgr_fini(&(sched->pgmgr));
groupmgr_fini(&(sched->hgmgr));
destroy(sched->resmgr);
destroy(sched->ugmgr);
destroy(sched->qgmgr);
destroy(sched->pgmgr);
destroy(sched->hgmgr);
mylock_fini(&(sched->lock));
@ -465,7 +468,7 @@ static int sched_init_resources(xce_scheduler_t* sched)
for (i = 0; i < config->n_resources; i++) {
xce_resource_t* r = config->resources[i];
resmgr_add_res(&(sched->resmgr), r);
key_add(sched->resmgr, (void*)r->name, (void*)r);
}
return 0;
}
@ -846,7 +849,7 @@ xce_sched_project_t* sched_get_project(xce_scheduler_t* sched, char* name)
name = "default";
}
rc = key_find(sched->projects, (void*)name, (void **)&project);
rc = key_find(sched->projects, (void*)name, (void**)&project);
if (rc < 0) {
return NULL;
}
@ -999,9 +1002,12 @@ xce_alloc_t** sched_make_allocs(xce_scheduler_t* sched, char* reserve, int nres,
}
for (i = 0; i < nres; i++) {
xce_resource_t* r = (xce_resource_t*)resmgr_lock_byid(
&(sched->resmgr), idxs[i], OBJREF_NOP);
int d = (duration != NULL) ? duration[i] : -1;
xce_resource_t* r = NULL;
int rc = 0;
int d;
rc = vget(sched->resmgr, idxs[i], (void**)&r);
d = (duration != NULL) ? duration[i] : -1;
allocs[i] = NULL;
if (r == NULL) {