save works

This commit is contained in:
Rongsong Shen 2026-03-04 18:18:53 +08:00
parent acfbec875b
commit 3f74f14687
38 changed files with 751 additions and 448 deletions

View file

@ -6,8 +6,8 @@
#include <stdlib.h>
#include "decision.h"
#include "sched/types.h"
#include "resreq.h"
#include "sched/types.h"
typedef void* plugin_data_t;
@ -79,5 +79,6 @@ extern int plugin_job_election(void*, xce_sched_job_t*);
extern int register_fcfs(void*);
extern int register_limit(void*);
extern int register_seqjob_allocator(void*);
extern int register_parjob_allocator(void*);
#endif

View file

@ -28,7 +28,10 @@ int plugin_register(void* arg1, void* arg2)
return rc;
}
lock(sched->plugins, RTTI_LOCK_WRITE);
rc = key_add(sched->plugins, (void*)plugin->name, (void*)plugin);
unlock(sched->plugins);
if (rc >= 0) {
plugin->plugin_id = rc;
}
@ -50,7 +53,10 @@ void plugin_unregister(void* arg)
return;
}
lock(sched->plugins, RTTI_LOCK_WRITE);
key_del(sched->plugins, plugin->name);
unlock(sched->plugins);
if (plugin->fini_fn != NULL) {
plugin->fini_fn(plugin);
}
@ -163,7 +169,7 @@ int plugin_queue_update(void* arg, xce_sched_queue_t* queue)
}
iter_destroy(&it);
return rc;
}

View file

@ -21,14 +21,12 @@ static int limit_priv_data_init(limit_plugin_data_t* data)
{
kvmgr_params_t limits_params = {
.key_type = KVMGR_KEY_STRING,
.dynamic = 1,
.nslots = 1021,
.delta = 64,
.datakiller = (destroy_fn_t)kill_limit,
};
kvmgr_params_t instances_params = {
.key_type = KVMGR_KEY_STRING,
.dynamic = 1,
.nslots = 1021,
.delta = 64,
.datakiller = (destroy_fn_t)kill_limit,
@ -63,13 +61,16 @@ 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;
}
lock(privdata->limits, RTTI_LOCK_WRITE);
rc = key_add(privdata->limits, (void*)limit->name, (void*)limit);
unlock(privdata->limits);
if (rc < 0) {
kill_limit(limit);
@ -182,7 +183,10 @@ static int match_job_global_limit_(xce_sched_plugin_t* plugin,
return rc;
}
lock(privdata->instances, RTTI_LOCK_READ);
rc = key_find(privdata->instances, (void*)vresname, (void*)&vres);
unlock(privdata->instances);
if (rc <= 0) {
return rc;
}
@ -196,7 +200,10 @@ static int match_job_global_limit_(xce_sched_plugin_t* plugin,
return rc;
}
lock(privdata->instances, RTTI_LOCK_WRITE);
rc = key_add(privdata->instances, (void*)vres->vres->name, vres);
unlock(privdata->instances);
if (rc < 0) {
return rc;
}
@ -324,7 +331,10 @@ static int match_job_host_limit_(xce_sched_plugin_t* plugin,
return rc;
}
lock(privdata->instances, RTTI_LOCK_READ);
rc = key_find(privdata->instances, (void*)vresname, (void*)&vres);
unlock(privdata->instances);
if (rc < 0) {
return rc;
}
@ -337,7 +347,9 @@ static int match_job_host_limit_(xce_sched_plugin_t* plugin,
return rc;
}
lock(privdata->instances, RTTI_LOCK_WRITE);
rc = key_add(privdata->instances, vres->vres->name, vres);
unlock(privdata->instances);
if (rc < 0) {
return rc;
}
@ -398,8 +410,8 @@ static int build_limit_vres_requests(xce_scheduler_t* sched,
static int limit_prepare_allocation(void* arg, xce_sched_ctx_t* ctx)
{
xce_sched_plugin_t* plugin = (xce_sched_plugin_t*)arg;
xce_sched_worker_t* worker = NULL;
xce_sched_plugin_t* plugin = (xce_sched_plugin_t*)arg;
xce_sched_worker_t* worker = NULL;
int rc = 0;
limit_plugin_data_t* privdata = NULL;
iterator_t it;
@ -439,7 +451,7 @@ static int limit_prepare_allocation(void* arg, xce_sched_ctx_t* ctx)
}
iter_destroy(&it);
return rc;
}

View file

@ -82,7 +82,10 @@ static int seqjob_prepare_allocation(void* arg, xce_sched_ctx_t* ctx)
}
/* add slots into requested resources */
lock(sched->resmgr, RTTI_LOCK_READ);
rc = key_find(sched->resmgr, (void*)"slots", (void**)&r);
unlock(sched->resmgr);
if (rc < 0) {
return rc;
}

View file

@ -301,7 +301,10 @@ static int sched_update_res_accounts(xce_scheduler_t* sched, zarray_t* array,
xce_resource_t* r = NULL;
int rc = 0;
lock(sched->resmgr, RTTI_LOCK_READ);
rc = key_find(sched->resmgr, (void*)acct->resname, (void**)&r);
unlock(sched->resmgr);
if (rc < 0) {
return rc;
}
@ -315,7 +318,9 @@ static int sched_update_res_accounts(xce_scheduler_t* sched, zarray_t* array,
return rc;
}
lock(sched->resmgr, RTTI_LOCK_READ);
rc = key_find(sched->resmgr, (void*)acct->resname, (void**)&r);
unlock(sched->resmgr);
if (rc < 0) {
return rc;
}

View file

@ -16,6 +16,7 @@
#include "scheduler.h"
#include "utils.h"
#include "xcealloc.h"
#include "xstring.h"
static void* sched_job_picker(void* arg)
{
@ -24,7 +25,10 @@ static void* sched_job_picker(void* arg)
char* job_pick_plugin = "xce_sched_fcfs";
int rc = 0;
lock(sched->plugins, RTTI_LOCK_READ);
rc = key_find(sched->plugins, job_pick_plugin, (void**)&job_picker);
unlock(sched->plugins);
if (rc < 0) {
errno = -rc;
@ -290,6 +294,7 @@ static int sched_register_plugins(xce_scheduler_t* sched)
register_fcfs(sched);
register_limit(sched);
register_seqjob_allocator(sched);
register_parjob_allocator(sched);
return 0;
}
@ -297,7 +302,6 @@ static int sched_register_plugins(xce_scheduler_t* sched)
static int sched_plugin_init(xce_scheduler_t* sched)
{
kvmgr_params_t params = { .key_type = KVMGR_KEY_STRING,
.dynamic = 1,
.nslots = 16,
.delta = 8,
.datakiller = plugin_unregister };
@ -317,36 +321,30 @@ int sched_init(xce_scheduler_t* sched, xce_client_config_t* config,
int ndecisions = 5; /* FIXME: make this configurable */
int njobs = 1; /* FIXME: make this configurable */
kvmgr_params_t jobs_params = { .key_type = KVMGR_KEY_INT,
.dynamic = 1,
.nslots = 5381, /* FIXME */
.delta = 1024,
.datakiller = kill_sched_job };
kvmgr_params_t queues_params
= { .key_type = KVMGR_KEY_STRING,
.dynamic = 0,
.nslots = 59,
.delta = 16,
.datakiller = (destroy_fn_t)kill_sched_queue };
kvmgr_params_t workers_params
= { .key_type = KVMGR_KEY_STRING,
.dynamic = 1,
.nslots = 5381,
.delta = 64,
.datakiller = (destroy_fn_t)kill_sched_worker };
kvmgr_params_t users_params
= { .key_type = KVMGR_KEY_STRING,
.dynamic = 1,
.nslots = 5381,
.delta = 64,
.datakiller = (destroy_fn_t)kill_sched_user };
kvmgr_params_t projects_params
= { .key_type = KVMGR_KEY_STRING,
.dynamic = 1,
.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 };
@ -360,6 +358,8 @@ int sched_init(xce_scheduler_t* sched, xce_client_config_t* config,
sched->nextid = 1;
sched->configver = 0;
xstring_table_init(1024*1024);
mylock_init(&(sched->lock));
cbuf_init(&(sched->wbuf), 1, sizeof(int));
cbuf_init(&(sched->jbuf), njobs, sizeof(uint64_t));
@ -467,7 +467,9 @@ static int sched_init_resources(xce_scheduler_t* sched)
for (i = 0; i < config->n_resources; i++) {
xce_resource_t* r = config->resources[i];
lock(sched->resmgr, RTTI_LOCK_WRITE);
key_add(sched->resmgr, (void*)r->name, (void*)r);
unlock(sched->resmgr);
}
return 0;
}
@ -747,7 +749,13 @@ void sched_end_session(xce_scheduler_t* sched)
int sched_add_job(xce_scheduler_t* sched, xce_sched_job_t* j)
{
return key_add(sched->jobs, (void*)j->jobid, j);
int rc;
lock(sched->jobs, RTTI_LOCK_WRITE);
rc = key_add(sched->jobs, (void*)j->jobid, j);
unlock(sched->jobs);
return rc;
}
xce_sched_job_t* sched_get_job(xce_scheduler_t* sched, uint64_t jobid)
@ -755,7 +763,10 @@ xce_sched_job_t* sched_get_job(xce_scheduler_t* sched, uint64_t jobid)
int rc = 0;
xce_sched_job_t* job = NULL;
lock(sched->jobs, RTTI_LOCK_READ);
rc = key_find(sched->jobs, (void*)jobid, (void**)&job);
unlock(sched->jobs);
if (rc <= 0) {
return NULL;
}
@ -765,7 +776,13 @@ xce_sched_job_t* sched_get_job(xce_scheduler_t* sched, uint64_t jobid)
int sched_add_queue(xce_scheduler_t* sched, xce_sched_queue_t* q)
{
return key_add(sched->queues, (void*)q->name, q);
int rc;
lock(sched->queues, RTTI_LOCK_WRITE);
rc = key_add(sched->queues, (void*)q->name, q);
unlock(sched->queues);
return rc;
}
xce_sched_queue_t* sched_get_queue(xce_scheduler_t* sched, char* name)
@ -773,7 +790,10 @@ xce_sched_queue_t* sched_get_queue(xce_scheduler_t* sched, char* name)
xce_sched_queue_t* q = NULL;
int rc = 0;
lock(sched->queues, RTTI_LOCK_READ);
rc = key_find(sched->queues, (void*)name, (void**)&q);
unlock(sched->queues);
if (rc <= 0) {
return NULL;
}
@ -785,7 +805,9 @@ int sched_add_worker(xce_scheduler_t* sched, xce_sched_worker_t* w)
{
int rc;
lock(sched->workers, RTTI_LOCK_WRITE);
rc = key_add(sched->workers, (void*)w->name, (void*)w);
unlock(sched->workers);
if (rc >= 0) {
w->idx = rc;
}
@ -798,7 +820,10 @@ xce_sched_worker_t* sched_get_worker(xce_scheduler_t* sched, char* name)
xce_sched_worker_t* w = NULL;
int rc = 0;
lock(sched->workers, RTTI_LOCK_READ);
rc = key_find(sched->workers, (void*)name, (void**)&w);
unlock(sched->workers);
if (rc <= 0) {
return NULL;
}
@ -810,7 +835,9 @@ int sched_add_user(xce_scheduler_t* sched, xce_sched_user_t* u)
{
int rc = 0;
lock(sched->users, RTTI_LOCK_WRITE);
rc = key_add(sched->users, (void*)u->name, (void*)u);
unlock(sched->users);
return rc;
}
@ -820,7 +847,9 @@ xce_sched_user_t* sched_get_user(xce_scheduler_t* sched, char* name)
xce_sched_user_t* user = NULL;
int rc = 0;
lock(sched->users, RTTI_LOCK_READ);
rc = key_find(sched->users, (void*)name, (void**)&user);
unlock(sched->users);
if (rc < 0) {
return NULL;
}
@ -835,7 +864,10 @@ int sched_add_project(xce_scheduler_t* sched, xce_sched_project_t* p)
{
int rc;
lock(sched->projects, RTTI_LOCK_WRITE);
rc = key_add(sched->projects, (void*)p->name, (void*)p);
unlock(sched->projects);
return rc;
}
@ -848,7 +880,9 @@ xce_sched_project_t* sched_get_project(xce_scheduler_t* sched, char* name)
name = "default";
}
lock(sched->projects, RTTI_LOCK_READ);
rc = key_find(sched->projects, (void*)name, (void**)&project);
unlock(sched->projects);
if (rc < 0) {
return NULL;
}