From b748e30d20061b8302f299091cff16faf1ea146d Mon Sep 17 00:00:00 2001 From: Rongsong Shen Date: Sat, 28 Feb 2026 17:55:50 +0800 Subject: [PATCH] save works --- src/controller/apiserver.c | 24 +- src/controller/cluster.c | 167 ++- src/controller/dataex.c | 496 ++++----- src/controller/include/cluster.h | 12 +- src/controller/job.c | 285 +++-- src/controller/meson.build | 1 - src/controller/misc.c | 11 +- src/controller/myconf.c | 3 +- src/controller/opget.c | 8 +- src/controller/opupd.c | 4 +- src/controller/queue.c | 51 +- src/controller/sched.c | 87 +- src/controller/task.c | 25 +- src/controller/worker.c | 145 ++- src/controller/xceobjs.c | 1011 ------------------ src/include/configobj.h | 11 + src/include/group.h | 19 +- src/include/resobj.h | 11 + src/include/resreq.h | 4 +- src/include/xce/cluster_def.h | 11 +- src/include/xce/types.h | 14 +- src/include/xcelimit.h | 9 +- src/lib/configobj.c | 47 +- src/lib/group.c | 318 ++++-- src/lib/kvmgr.c | 158 --- src/lib/resreq.c | 18 +- src/lib/testsuite/test_group.c | 69 +- src/lib/testsuite/test_limit.c | 97 +- src/lib/xcelimit.c | 47 +- src/lib/xstring.c | 133 --- src/scheduler/include/scheduler.h | 10 +- src/scheduler/src/plugins/limit.c | 4 +- src/scheduler/src/plugins/seqjob_allocator.c | 26 +- src/scheduler/src/resource.c | 24 +- src/scheduler/src/scheduler.c | 36 +- 35 files changed, 1247 insertions(+), 2149 deletions(-) delete mode 100644 src/controller/xceobjs.c diff --git a/src/controller/apiserver.c b/src/controller/apiserver.c index fbba0bd2..44d4f2d1 100644 --- a/src/controller/apiserver.c +++ b/src/controller/apiserver.c @@ -256,7 +256,7 @@ static int apiserver_job_update_fun(int type, int situation, void* data, int rc; xce_notify_data_t xdata = { .event = NotifyData_data_updateJob, - .data = { .update_job = &(job->job) } }; + .data = { .update_job = job->job } }; rc = notify(c, c->apiservers[i].ep, &xdata); if (rc < 0) { @@ -351,11 +351,11 @@ static int apiserver_worker_change(int type, int situation, void* data, { int i; - TRACE("%s worker %s idx %d situation %d", __func__, w->host.name, w->idx, + TRACE("%s worker %s idx %d situation %d", __func__, w->host->name, w->idx, situation); - collect_resval_with_idx(&(w->host.resvals), &(w->host.nresvals_to_sched), - &(w->host.resvals_to_sched)); + collect_resval_with_idx(&(w->host->resvals), &(w->host->nresvals_to_sched), + &(w->host->resvals_to_sched)); switch (situation) { case HOOK_AFTER_EVENT: @@ -383,8 +383,8 @@ static int apiserver_worker_change(int type, int situation, void* data, break; } - free_resval_with_idx_list(&(w->host.resvals_to_sched), - w->host.nresvals_to_sched); + free_resval_with_idx_list(&(w->host->resvals_to_sched), + w->host->nresvals_to_sched); return 0; } @@ -402,12 +402,18 @@ static int apiserver_worker_join(int type, int situation, void* data, return 0; } - w = workermgr_lock(&(c->workermgr), name, OBJREF_READ); + rc = key_find(c->workermgr, (void *)name, (void **)&w); + if (rc < 0) { + return rc; + } + + if (rc == 0) { + return -ENOENT; + } rc = apiserver_worker_change(type, situation, data, c, w); /* FIXME: need to mark the jobs in this worker */ - obj_deref(w); return rc; } @@ -508,7 +514,7 @@ static int apiserver_queue_hook_fun(int type, int situation, int detail, int rc; xce_notify_data_t xdata = { .event = NotifyData_data_schedUpdateQueue, - .data = { .sched_update_queue = &(q->queue) } }; + .data = { .sched_update_queue = q->queue } }; rc = notify(c, c->apiservers[i].ep, &xdata); if (rc < 0) { diff --git a/src/controller/cluster.c b/src/controller/cluster.c index 0749c883..dfbad8c0 100644 --- a/src/controller/cluster.c +++ b/src/controller/cluster.c @@ -1,12 +1,14 @@ #include "config.h" #include +#include #include #include #include "cluster.h" #include "dataq.h" #include "htab.h" +#include "kvmgr.h" #include "mylock.h" #include "request.h" #include "vtaskmgr.h" @@ -15,6 +17,7 @@ #include "xce/types.h" +#include "resobj.h" #include "utils.h" #include "worker.h" #include "xce/errnox.h" @@ -368,8 +371,7 @@ int cluster_build_resources(cluster_t* c) for (i = 0; i < c->myconf->cluster_config->nres; i++) { xce_resource_t* res; - res = create_obj_by_typename(&(c->objmgr), "xresource", - c->myconf->cluster_config->resources[i]); + res = makeResource(c->myconf->cluster_config->resources[i]); if (res == NULL) { return -errno; } @@ -458,10 +460,82 @@ static int run_delay_tasks(delay_task_entry_fn_t entry, void* arg) return entry(arg); } +static void res_obj_killer(xce_resource_t* r) +{ + if (r == NULL) { + return; + } +} + +static void job_obj_killer(void* arg) +{ + if (arg == NULL) { + return; + } +} + +static void worker_obj_killer(void* arg) +{ + if (arg == NULL) { + return; + } +} + +static void queue_obj_killer(void* arg) +{ + if (arg == NULL) { + return; + } +} + +static void resval_obj_killer(void* arg) +{ + if (arg == NULL) { + return; + } +} + +static void config_obj_killer(void* arg) +{ + if (arg == NULL) { + return; + } +} + int cluster_init(cluster_t* c) { - int i, rc; - SSL_CTX* ssl_ctx = NULL; + int i, rc; + SSL_CTX* ssl_ctx = NULL; + kvmgr_params_t config_mgr_params + = { .key_type = KVMGR_KEY_STRING, + .dynamic = 1, + .nslots = 128, + .delta = 128, + .datakiller = (destroy_fn_t)config_obj_killer }; + kvmgr_params_t resmgr_params + = { .key_type = KVMGR_KEY_STRING, + .dynamic = 1, + .nslots = c->myconf->cluster_config->resmgr->nhash_slots, + .delta = c->myconf->cluster_config->resmgr->delta, + .datakiller = (destroy_fn_t)res_obj_killer }; + kvmgr_params_t jobmgr_params + = { .key_type = KVMGR_KEY_INT, + .dynamic = 1, + .nslots = c->myconf->cluster_config->jobmgr->nhash_slots, + .delta = c->myconf->cluster_config->jobmgr->delta, + .datakiller = (destroy_fn_t)job_obj_killer }; + kvmgr_params_t workermgr_params + = { .key_type = KVMGR_KEY_STRING, + .dynamic = 1, + .nslots = c->myconf->cluster_config->workermgr->nhash_slots, + .delta = c->myconf->cluster_config->workermgr->delta, + .datakiller = (destroy_fn_t)worker_obj_killer }; + kvmgr_params_t qmgr_params + = { .key_type = KVMGR_KEY_STRING, + .dynamic = 0, + .nslots = c->myconf->cluster_config->qmgr->nhash_slots, + .delta = c->myconf->cluster_config->qmgr->delta, + .datakiller = (destroy_fn_t)queue_obj_killer }; if (c == NULL) { return -EINVAL; @@ -491,36 +565,21 @@ int cluster_init(cluster_t* c) return -errno; } - kvmgr_init(&(c->configmgr), string_hash_key, 128, 128, - (zarray_item_killer_t)config_obj_killer); + c->configmgr = makeInstance(&xkvmgr_type, &config_mgr_params); objmgr_init(&(c->objmgr)); - jobmgr_init(&(c->jobmgr), c->myconf->cluster_config->jobmgr->nhash_slots, - c->myconf->cluster_config->jobmgr->delta, - (zarray_item_killer_t)job_obj_killer); - resmgr_init(&(c->resmgr), c->myconf->cluster_config->resmgr->nhash_slots, - c->myconf->cluster_config->resmgr->delta, - (zarray_item_killer_t)res_obj_killer); + c->jobmgr = makeInstance(&xkvmgr_type, &jobmgr_params); + c->resmgr = makeInstance(&xkvmgr_type, &resmgr_params); zarray_init(&(c->sharedinst), c->myconf->cluster_config->resmgr->inst_delta, (zarray_item_killer_t)resval_obj_killer); - workermgr_init(&(c->workermgr), - c->myconf->cluster_config->workermgr->nhash_slots, - c->myconf->cluster_config->workermgr->delta, - (zarray_item_killer_t)worker_obj_killer); - qmgr_init(&(c->qmgr), c->myconf->cluster_config->qmgr->nhash_slots, - c->myconf->cluster_config->qmgr->delta, - (zarray_item_killer_t)queue_obj_killer); + c->workermgr = makeInstance(&xkvmgr_type, &workermgr_params); + c->qmgr = makeInstance(&xkvmgr_type, &qmgr_params); iomgr_init(&(c->iomgr)); iomgr_set_ssl_ctx(&(c->iomgr), ssl_ctx); xstring_table_init(c->myconf->cluster_config->xstrings->nhash_slots); - register_xstring(&(c->objmgr), - c->myconf->cluster_config->xstrings->nhash_slots, - c->myconf->cluster_config->xstrings->delta); - register_types(c); - zarray_init(&(c->endpoints), 16, endpoint_killer); rc = endpoint_init(&(c->ep), AF_INET, SOCK_STREAM, @@ -557,10 +616,8 @@ static int make_heartbeat(cluster_t* c, endpoint_t* ep) return xce_nop_req(ep); } -static int check_worker_timeout_(void* arg1, void* arg2) +static int check_worker_timeout_(cluster_t* c, worker_t* w) { - cluster_t* c = (cluster_t*)arg1; - worker_t* w = (worker_t*)arg2; worker_t* w1 = NULL; endpoint_t* ep; time_t now = time(NULL); @@ -581,24 +638,19 @@ static int check_worker_timeout_(void* arg1, void* arg2) } /* grab lock on worker */ - w1 = obj_ref(w, OBJREF_UPDATE); - if (w1 == NULL) { - return -EINVAL; - } config = c->myconf->cluster_config; timeout = config->heartbeat_interval * config->inactive_heartbeat_count; if (now - ep->ts_last_in > timeout) { TRACE("%s worker %s becomes UNAVAIL as heartbeat timeout", __func__, - w->host.name); + w->host->name); mark_worker_unavail(c, w); - obj_deref(w1); return 0; } else { - if (IS_WORKER_UNAVAIL(w->host.status)) { + if (IS_WORKER_UNAVAIL(w->host->status)) { mark_worker_back(c, w); } } @@ -607,34 +659,49 @@ static int check_worker_timeout_(void* arg1, void* arg2) if (DATAQ_EMPTY(&(ep->outq))) { int rc = 0; - TRACE("%s send heartbeat to %s", __func__, w->host.name); + TRACE("%s send heartbeat to %s", __func__, w->host->name); rc = make_heartbeat(c, ep); if (rc < 0) { - ERROR("%s make_heartbeat to %s failed", __func__, w->host.name); + ERROR("%s make_heartbeat to %s failed", __func__, + w->host->name); - obj_deref(w1); return rc; } } } - obj_deref(w1); return 0; } static int check_workers_timeout(void* args) { - xlist_t lst; - int rc; - cluster_t* c = (cluster_t*)args; + iterator_t it; + cluster_t* c = (cluster_t*)args; + int rc = 0; - xlist_init(&lst, 3); - xlist_store(&lst, check_worker_timeout_); - rc = workermgr_iter(&(c->workermgr), &lst, c); + rc = iter_make(&it, c->workermgr); + if (rc < 0) { + return rc; + } - xlist_fini(&lst); + for (;;) { + worker_t* w = NULL; + + rc = iter_next(&it, (void**)&w); + if ((rc < 0) || (rc == RTTI_ITER_NO_DATA)) { + break; + } + + check_worker_timeout_(c, w); + } + + if (rc == RTTI_ITER_NO_DATA) { + rc = 0; + } + + iter_destroy(&it); return rc; } @@ -698,11 +765,11 @@ void cluster_fini(cluster_t* c) cbuf_fini(&(c->wbuf)); iomgr_fini(&(c->iomgr)); - jobmgr_fini(&(c->jobmgr)); - workermgr_fini(&(c->workermgr)); - qmgr_fini(&(c->qmgr)); - resmgr_fini(&(c->resmgr)); - kvmgr_fini(&(c->configmgr)); + destroy(c->jobmgr); + destroy(c->workermgr); + destroy(c->qmgr); + destroy(c->resmgr); + destroy(c->configmgr); mylock_fini(&(c->sched.lock)); zarray_fini(&(c->endpoints)); diff --git a/src/controller/dataex.c b/src/controller/dataex.c index 549a815d..06c7f6a5 100644 --- a/src/controller/dataex.c +++ b/src/controller/dataex.c @@ -18,22 +18,6 @@ int check_controller(void* arg) return 1; } -struct intern_array_ { - int count; - int idx; - void* data; - check_fn_t checkfn; -}; - -int not_null_check(void* arg) -{ - if (arg == NULL) { - return 0; - } - - return 1; -} - static int collect_resval_with_idx_(zarray_t* array, int* nres, xce_val_with_idx_t*** resvals) { @@ -118,345 +102,309 @@ int collect_resval_with_idx(zarray_t* array, int* nres, return rc; } -static int count_(void* arg1, void* arg2) -{ - struct intern_array_* arg = (struct intern_array_*)arg1; - - if ((arg == NULL) || (arg->checkfn == NULL)) { - return -EINVAL; - } - - if (!(arg->checkfn(arg2))) { - return 0; - } - - arg->count++; - - return 0; -} - -static int add_confvar_(void* arg1, void* arg2) -{ - struct intern_array_* arg = (struct intern_array_*)arg1; - xce_config_t** p = NULL; - - if ((arg == NULL) || (arg->count < 0)) { - return -EINVAL; - } - - if (arg->count == 0) { - return 0; - } - - if (!(arg->checkfn(arg2))) { - return 0; - } - - p = (xce_config_t**)arg->data; - if (p == NULL) { - p = (xce_config_t**)calloc(arg->count, sizeof(xce_config_t*)); - if (p == NULL) { - return -ENOMEM; - } - - arg->data = p; - } - - p[arg->idx] = (xce_config_t*)obj_ref(arg2, OBJREF_READ); - arg->idx++; - - return 1; -} void collect_confvars(cluster_t* c, collect_check_fn_t fn, int* nconfig, xce_config_t*** configs) { - xlist_t lst; - struct intern_array_ args - = { .count = 0, - .idx = 0, - .data = NULL, - .checkfn = (fn == NULL) ? not_null_check : fn }; - int rc; + iterator_t it; + int nc = 0, idx; + int rc; *nconfig = 0; *configs = NULL; - xlist_init(&lst, 3); - xlist_store(&lst, count_); - xlist_store(&lst, add_confvar_); - - rc = kvmgr_iter(&(c->configmgr), NULL, &lst, &args); - - xlist_fini(&lst); - - if (rc >= 0) { - *nconfig = args.count; - *configs = args.data; - } -} - -static int add_queue_(void* arg1, void* arg2) -{ - struct intern_array_* arg = (struct intern_array_*)arg1; - xce_queue_t** p = NULL; - - if (arg == NULL) { - return -EINVAL; + rc = iter_make(&it, c->configmgr); + if (rc < 0) { + return; } - if (arg->count < 0) { - return -EINVAL; - } + nc = 0; + for (;;) { + xce_config_t* config = NULL; - if (arg->count == 0) { - return 0; - } - - if (!(arg->checkfn(arg2))) { - return 0; - } - - p = (xce_queue_t**)arg->data; - if (p == NULL) { - p = (xce_queue_t**)calloc(arg->count, sizeof(xce_queue_t*)); - if (p == NULL) { - return -ENOMEM; + rc = iter_next(&it, (void**)&config); + if ((rc < 0) || (rc == RTTI_ITER_NO_DATA)) { + break; } - arg->data = p; + if (config != NULL) { + nc++; + } } - p[arg->idx] = (xce_queue_t*)obj_ref(arg2, OBJREF_READ); - arg->idx++; + if (rc < 0) { + iter_destroy(&it); + return; + } - return 1; + if (nc == 0) { + iter_destroy(&it); + return; + } + + iter_reset(&it); + *configs = (xce_config_t**)calloc(nc, sizeof(xce_config_t*)); + if ((*configs) == NULL) { + return; + } + + idx = 0; + for (;;) { + xce_config_t* config = NULL; + + rc = iter_next(&it, (void**)&config); + if ((rc < 0) || (rc == RTTI_ITER_NO_DATA)) { + break; + } + + if (config != NULL) { + (*configs)[idx] = config; + idx++; + } + } + + iter_destroy(&it); } void collect_queues(cluster_t* c, collect_check_fn_t fn, int* nqueues, xce_queue_t*** queues) { - xlist_t lst; - struct intern_array_ args - = { .count = 0, - .idx = 0, - .data = NULL, - .checkfn = (fn == NULL) ? not_null_check : fn }; - int rc; + iterator_t it; + int count; + int rc; + int nc; *nqueues = 0; *queues = NULL; - xlist_init(&lst, 3); - xlist_store(&lst, count_); - xlist_store(&lst, add_queue_); - - rc = qmgr_iter(&(c->qmgr), &lst, &args); - - xlist_fini(&lst); - - if (rc >= 0) { - *nqueues = args.count; - *queues = args.data; - } -} - -static int add_resource_(void* arg1, void* arg2) -{ - struct intern_array_* arg = (struct intern_array_*)arg1; - xce_resource_t** p = NULL; - - if (arg == NULL) { - return -EINVAL; + rc = iter_make(&it, c->qmgr); + if (rc < 0) { + return; } - if (arg->count < 0) { - return -EINVAL; - } + count = 0; + for (;;) { + xce_queue_t* q = NULL; - if (arg->count == 0) { - return 0; - } - - if (!(arg->checkfn(arg2))) { - return 0; - } - - p = (xce_resource_t**)arg->data; - if (p == NULL) { - p = (xce_resource_t**)calloc(arg->count, sizeof(xce_resource_t*)); - if (p == NULL) { - return -ENOMEM; + rc = iter_next(&it, (void**)&q); + if ((rc < 0) || (rc == RTTI_ITER_NO_DATA)) { + break; } - arg->data = p; + if (q != NULL) { + count++; + } } - p[arg->idx] = (xce_resource_t*)obj_ref(arg2, OBJREF_READ); + if (rc < 0) { + return; + } - arg->idx++; + *queues = (xce_queue_t**)calloc(count, sizeof(xce_queue_t*)); + if ((*queues) == NULL) { + iter_destroy(&it); + return; + } - return 1; + iter_reset(&it); + + nc = 0; + + for (;;) { + xce_queue_t* q = NULL; + + rc = iter_next(&it, (void**)&q); + if ((rc < 0) || (rc == RTTI_ITER_NO_DATA)) { + break; + } + + if (q != NULL) { + (*queues)[nc] = q; + nc++; + } + } + + *nqueues = nc; + + iter_destroy(&it); } void collect_resources(cluster_t* c, collect_check_fn_t fn, int* nresources, xce_resource_t*** resources) { - xlist_t lst; - struct intern_array_ args - = { .count = 0, - .idx = 0, - .data = NULL, - .checkfn = (fn == NULL) ? not_null_check : fn }; - int rc; + iterator_t it; + int rc; + int i, nc; *nresources = 0; *resources = NULL; - xlist_init(&lst, 3); - xlist_store(&lst, count_); - xlist_store(&lst, add_resource_); - - rc = resmgr_iter(&(c->resmgr), &lst, &args); - - xlist_fini(&lst); - - if (rc >= 0) { - *nresources = args.count; - *resources = args.data; - } -} - -static int add_job_(void* arg1, void* arg2) -{ - struct intern_array_* arg = (struct intern_array_*)arg1; - xce_job_t** p = NULL; - - if (arg == NULL) { - return -EINVAL; + rc = iter_make(&it, c->resmgr); + if (rc < 0) { + return; } - if (arg->count < 0) { - return -EINVAL; - } + nc = 0; + for (;;) { + xce_resource_t* r = NULL; - if (arg->count == 0) { - return 0; - } - - if (!(arg->checkfn(arg2))) { - return 0; - } - - p = (xce_job_t**)arg->data; - if (p == NULL) { - p = (xce_job_t**)calloc(arg->count, sizeof(xce_job_t*)); - if (p == NULL) { - return -ENOMEM; + rc = iter_next(&it, (void**)&r); + if ((rc < 0) || (rc == RTTI_ITER_NO_DATA)) { + break; } - arg->data = p; + if (r != NULL) { + nc++; + } } - p[arg->idx] = (xce_job_t*)obj_ref(arg2, OBJREF_READ); - arg->idx++; + if ((rc < 0) || (nc == 0)) { + iter_destroy(&it); + return; + } - return 1; + *resources = calloc(nc, sizeof(xce_resource_t)); + if ((*resources) == NULL) { + iter_destroy(&it); + return; + } + + iter_reset(&it); + + i = 0; + for (;;) { + xce_resource_t* r = NULL; + + rc = iter_next(&it, (void**)&r); + if ((rc < 0) || (rc == RTTI_ITER_NO_DATA)) { + break; + } + + if (r != NULL) { + (*resources)[i] = r; + i++; + } + } + + *nresources = i; + + iter_destroy(&it); + return; } void collect_jobs(cluster_t* c, collect_check_fn_t fn, int* njobs, xce_job_t*** jobs) { - xlist_t lst; - struct intern_array_ args - = { .count = 0, .idx = 0, .data = NULL, .checkfn = (check_fn_t)fn }; - int rc = 0; + iterator_t it; + int nc, i; + int rc = 0; *njobs = 0; *jobs = NULL; - xlist_init(&lst, 3); - xlist_store(&lst, count_); - xlist_store(&lst, add_job_); - - rc = jobmgr_iter(&(c->jobmgr), &lst, &args); - xlist_fini(&lst); - - if (rc >= 0) { - *njobs = args.count; - *jobs = args.data; + rc = iter_make(&it, c->jobmgr); + if (rc < 0) { + return; } - return; -} + nc = 0; + for (;;) { + xce_job_t* j = NULL; -static int add_worker_(void* arg1, void* arg2) -{ - struct intern_array_* arg = (struct intern_array_*)arg1; - xce_worker_t** p = NULL; - xce_worker_t* w; - - if (arg == NULL) { - return -EINVAL; - } - - if (arg->count < 0) { - return -EINVAL; - } - - if (arg->count == 0) { - return 0; - } - - if (!(arg->checkfn(arg2))) { - return 0; - } - - p = (xce_worker_t**)arg->data; - if (p == NULL) { - p = (xce_worker_t**)calloc(arg->count, sizeof(xce_worker_t*)); - if (p == NULL) { - return -ENOMEM; + rc = iter_next(&it, (void**)&j); + if ((rc < 0) || (rc == RTTI_ITER_NO_DATA)) { + break; } - arg->data = p; + if (j != NULL) { + nc++; + } } - w = (xce_worker_t*)obj_ref(arg2, OBJREF_READ); + if ((rc < 0) || (nc == 0)) { + iter_destroy(&it); + return; + } - collect_resval_with_idx(&(w->resvals), &(w->nresvals_to_sched), - &(w->resvals_to_sched)); + iter_reset(&it); + i = 0; - p[arg->idx] = w; - arg->idx++; + for (;;) { + xce_job_t* j = NULL; - return 1; + rc = iter_next(&it, (void**)&j); + if ((rc < 0) || (rc == RTTI_ITER_NO_DATA)) { + break; + } + + if (j != NULL) { + (*jobs)[i] = j; + i++; + } + } + + *njobs = i; + + iter_destroy(&it); + return; } void collect_workers(cluster_t* c, collect_check_fn_t fn, int* nworkers, xce_worker_t*** workers) { - xlist_t lst; - struct intern_array_ args - = { .count = 0, .idx = 0, .data = NULL, .checkfn = (check_fn_t)fn }; - int rc = 0; + iterator_t it; + int i, nc; + int rc = 0; *nworkers = 0; *workers = NULL; - xlist_init(&lst, 3); - xlist_store(&lst, count_); - xlist_store(&lst, add_worker_); - - rc = workermgr_iter(&(c->workermgr), &lst, &args); - - xlist_fini(&lst); - - if (rc >= 0) { - *nworkers = args.count; - *workers = args.data; + rc = iter_make(&it, c->workermgr); + if (rc < 0) { + return; } + nc = 0; + for (;;) { + xce_worker_t* w = NULL; + + rc = iter_next(&it, (void**)&w); + if ((rc < 0) || (rc == RTTI_ITER_NO_DATA)) { + break; + } + + if (w != NULL) { + nc++; + } + } + + if ((rc < 0) || (nc == 0)) { + iter_destroy(&it); + + return; + } + + iter_reset(&it); + + i = 0; + for (;;) { + xce_worker_t* w = NULL; + + rc = iter_next(&it, (void**)&w); + if ((rc < 0) || (rc == RTTI_ITER_NO_DATA)) { + break; + } + + if (w != NULL) { + (*workers)[i] = w; + i++; + } + } + + *nworkers = i; + + iter_destroy(&it); + return; } diff --git a/src/controller/include/cluster.h b/src/controller/include/cluster.h index 273c1237..7617da6c 100644 --- a/src/controller/include/cluster.h +++ b/src/controller/include/cluster.h @@ -34,12 +34,8 @@ extern int add_to_xlist(xlist_t*, void*); extern int add_worker_to_xlist(xlist_t*, void*); extern int add_queue_to_xlist(xlist_t*, void*); extern int add_job_to_xlist(xlist_t*, void*); -extern void queue_obj_killer(queue_t*); -extern void res_obj_killer(xce_resource_t*); -extern void resval_obj_killer(xce_resval_t*); extern void resource_killer(void*); -extern int add_resource(void*, char*, char*, int, xce_order_t, int, int); -extern void config_obj_killer(xce_config_t*); +extern int add_resource(void*, char*, char*, int, xce_order_t, int, int); extern int update_resvals(cluster_t*, worker_t*, int, xce_resval_t*); @@ -69,8 +65,6 @@ extern int get_resval(cluster_t*, char*, char*, xce_val_t*); extern job_t* jobmgr_lockjob(jobmgr_t*, uint64_t, int); extern int32_t jobmgr_add_job(jobmgr_t*, job_t*); extern void jobmgr_del_job(jobmgr_t*, job_t*); -extern void job_obj_killer(job_t*); -extern void worker_obj_killer(worker_t*); extern int handle_push(struct capn*, cluster_t*, endpoint_t*, struct Request*); extern int do_get_op(cluster_t*, endpoint_t*, xce_request_t*); extern int do_update_op(cluster_t*, endpoint_t*, xce_request_t*); @@ -106,7 +100,6 @@ extern int on_job_resume(cluster_t*, uint64_t); extern int on_job_postdone(cluster_t*, endpoint_t*, uint64_t); extern int on_job_ckpt(cluster_t*, endpoint_t*, xce_ckptinfo_t*); extern int notify(cluster_t*, endpoint_t*, xce_notify_data_t*); -extern int not_null_check(void*); extern int check_worker_(xce_worker_t*); extern int update_resval_list(cluster_t*, worker_t*, xce_resval_list_t*); extern int do_jobcontrol_op(cluster_t*, endpoint_t*, xce_request_t*); @@ -117,9 +110,8 @@ extern int update_host_runusage(xce_job_runusage_t**, char*, int, extern int update_pids(job_pidinfo_t**, int, int*); extern int update_pgids(job_pidinfo_t**, int, int*); extern int get_ep_role(endpoint_t*); -extern worker_t* get_ep_worker(cluster_t*, endpoint_t*, int); +extern worker_t* get_ep_worker(cluster_t*, endpoint_t*); -extern int not_null_check(void*); extern int check_worker_(xce_worker_t*); extern int update_resval_list(cluster_t*, worker_t*, xce_resval_list_t*); extern int do_jobcontrol_op(cluster_t*, endpoint_t*, xce_request_t*); diff --git a/src/controller/job.c b/src/controller/job.c index 7ab28d2f..35bcf7cf 100644 --- a/src/controller/job.c +++ b/src/controller/job.c @@ -3,10 +3,12 @@ #include #include "cluster.h" +#include "jobj.h" #include "preason.h" #include "xce/cluster_def.h" #include "xce/errnox.h" #include "xce/types.h" +#include "xstring.h" static int mark_job_start(cluster_t*, job_t*, job_pidinfo_t*); static int mark_job_finish(cluster_t*, job_t*, xce_jobfinish_t*); @@ -19,20 +21,15 @@ uint64_t jobid = 100; static job_t* create_job(cluster_t* c, xce_job_t* j) { - job_t* job = NULL; - static int typeid = -1; + job_t* job = NULL; - if (typeid < 0) { - typeid = typeid_of_name(&(c->objmgr), "xjob"); - TRACE("%s type %s id %d", __func__, "xjob", typeid); - } - - if (typeid < 0) { - SET_ERROR(-typeid); + job = calloc(1, sizeof(*job)); + if (job == NULL) { return NULL; } - job = create_obj_by_typeid(&(c->objmgr), typeid, j); + /* FIXME: */ + job->job = makeJob(j); return job; } @@ -72,26 +69,26 @@ uint64_t job_submit(void* c, xce_job_submit_t* submit) int load_jobs(void* c) { #if 0 - job_t* job; - int i; - char cmdline[1024]; + job_t* job; + int i; + char cmdline[1024]; - for (i = 1; i < NJOBS; i++) { - sprintf(cmdline, "echo normal; sleep %d", i); - job = create_job(c, jobid++, "normal", "rshen", "/home/rshen", "/tmp", - "rshen", (char*)cmdline, NULL, 1, 1); - if (job == NULL) { - return -errno; + for (i = 1; i < NJOBS; i++) { + sprintf(cmdline, "echo normal; sleep %d", i); + job = create_job(c, jobid++, "normal", "rshen", "/home/rshen", "/tmp", + "rshen", (char*)cmdline, NULL, 1, 1); + if (job == NULL) { + return -errno; + } } - } - for (i = 1; i < NJOBS; i++) { - job = create_job(c, jobid++, "xce", "rshen", "/home/rshen", "/tmp", - "rshen", "echo xce; sleep 30", NULL, 1, 1); - if (job == NULL) { - return -errno; + for (i = 1; i < NJOBS; i++) { + job = create_job(c, jobid++, "xce", "rshen", "/home/rshen", "/tmp", + "rshen", "echo xce; sleep 30", NULL, 1, 1); + if (job == NULL) { + return -errno; + } } - } #endif return 0; @@ -157,8 +154,8 @@ static int mk_launchinfo(xce_launch_t* launch, xce_job_alloc_t* alloc) static int dispatch_a_job_(cluster_t* c, endpoint_t* ep, xce_job_alloc_t* alloc) { int rc = 0; - job_t* j; - worker_t* w; + job_t* j = NULL; + worker_t* w = NULL; xce_host_alloc_t** allocs; int nc; xce_job_exec_t einfo; @@ -166,7 +163,10 @@ static int dispatch_a_job_(cluster_t* c, endpoint_t* ep, xce_job_alloc_t* alloc) TRACE("%s jobid %ld", __func__, alloc->jobid); - j = jobmgr_lockjob(&(c->jobmgr), alloc->jobid, OBJREF_UPDATE); + rc = key_find(c->jobmgr, (void*)alloc->jobid, (void**)&j); + if (rc < 0) { + return rc; + } if (j == NULL) { PERROR("jobmgr_lockjob"); @@ -187,17 +187,20 @@ static int dispatch_a_job_(cluster_t* c, endpoint_t* ep, xce_job_alloc_t* alloc) allocs = (xce_host_alloc_t**)alloc->allocs; /* using head node of job */ - w = workermgr_lock(&(c->workermgr), allocs[0]->host, OBJREF_READ); + rc = key_find(c->workermgr, (void*)allocs[0]->host, (void**)&w); + if (rc < 0) { + return rc; + } + if (w == NULL) { - PERROR("workermgr_lock"); free_launchinfo(&launchinfo); obj_deref(j); return -errno; } - if ((w->ep == NULL) || (w->host.status != 0)) { + if ((w->ep == NULL) || (w->host->status != 0)) { ERROR("worker %s is not in correct state, status %x ep %p", - w->host.name, w->host.status, w->ep); + w->host->name, w->host->status, w->ep); free_launchinfo(&launchinfo); obj_deref(w); @@ -212,40 +215,41 @@ static int dispatch_a_job_(cluster_t* c, endpoint_t* ep, xce_job_alloc_t* alloc) char* q_pre_exec; char* q_post_exec; - rc = get_queue_exec(c, j->job.submit->queue, &q_pre_exec, &q_post_exec); + rc = get_queue_exec(c, j->job->submit->queue, &q_pre_exec, + &q_post_exec); if (rc < 0) { obj_deref(j); obj_deref(w); return rc; } - if (j->job.submit->start_info->q_pre_exec != NULL) { - obj_deref(j->job.submit->start_info->q_pre_exec); + if (j->job->submit->start_info->q_pre_exec != NULL) { + obj_deref(j->job->submit->start_info->q_pre_exec); } - if (j->job.submit->start_info->q_post_exec != NULL) { - obj_deref(j->job.submit->start_info->q_post_exec); + if (j->job->submit->start_info->q_post_exec != NULL) { + obj_deref(j->job->submit->start_info->q_post_exec); } - j->job.submit->start_info->q_pre_exec = q_pre_exec; - j->job.submit->start_info->q_post_exec = q_post_exec; + j->job->submit->start_info->q_pre_exec = q_pre_exec; + j->job->submit->start_info->q_post_exec = q_post_exec; } einfo.jobid = alloc->jobid; - einfo.start_info = j->job.submit->start_info; + einfo.start_info = j->job->submit->start_info; einfo.launchinfo = &launchinfo; rc = xce_startjob_req(w->ep, &einfo); free_launchinfo(&launchinfo); - if (j->job.allocs != NULL) { - free_JobAlloc_ptr(&(j->job.allocs)); + if (j->job->allocs != NULL) { + free_JobAlloc_ptr(&(j->job->allocs)); } - j->job.allocs = (xce_job_alloc_t*)calloc(1, sizeof(xce_job_alloc_t)); - j->job.allocs->jobid = alloc->jobid; - j->job.allocs->nhosts = nc; - MOVE_PTR(j->job.allocs->allocs, allocs); + j->job->allocs = (xce_job_alloc_t*)calloc(1, sizeof(xce_job_alloc_t)); + j->job->allocs->jobid = alloc->jobid; + j->job->allocs->nhosts = nc; + MOVE_PTR(j->job->allocs->allocs, allocs); alloc->allocs = NULL; DEREF_OBJ(w); @@ -263,40 +267,47 @@ static int dispatch_a_job_(cluster_t* c, endpoint_t* ep, xce_job_alloc_t* alloc) int job_ctrl(cluster_t* c, xce_jobctrl_t* ctrinfo) { uint64_t jobid = ctrinfo->jobid; - job_t* j; - int rc = 0; + job_t* j = NULL; + int rc = 0; TRACE("%s job_ctrl job %ld", __func__, jobid); - j = jobmgr_lockjob(&(c->jobmgr), jobid, OBJREF_UPDATE); + + rc = key_find(c->jobmgr, (void*)jobid, (void**)&j); + if (rc < 0) { + return rc; + } + if (j == NULL) { PERROR("jobmgr_lockjob"); return -ENOENT; } - if (j->job.allocs != NULL) { - xce_host_alloc_t** allocs = j->job.allocs->allocs; - worker_t* w; + if (j->job->allocs != NULL) { + xce_host_alloc_t** allocs = j->job->allocs->allocs; + worker_t* w = NULL; /* job control command will be sent to first node * for parallel jobs */ - w = workermgr_lock(&(c->workermgr), allocs[0]->host, OBJREF_READ); + rc = key_find(c->workermgr, (void*)allocs[0]->host, (void**)&w); + if (rc < 0) { + return rc; + } if (w != NULL) { /* FIXME: better method to check host status */ - if ((w->ep != NULL) && (w->host.status == 0)) { + if ((w->ep != NULL) && (w->host->status == 0)) { rc = xce_jobctrl_req(w->ep, ctrinfo); if (rc < 0) { ERROR("job ctrl %ld on host %s returns %d", jobid, - w->host.name, rc); + w->host->name, rc); } } else { ERROR("worker %s is not in correct state, status %x ep %p", - w->host.name, w->host.status, w->ep); + w->host->name, w->host->status, w->ep); rc = -errno; } obj_deref(w); } else { - PERROR("workermgr_lock"); rc = -errno; } } else { @@ -311,9 +322,9 @@ int job_ctrl(cluster_t* c, xce_jobctrl_t* ctrinfo) case JobControl_u_siginfo: switch (ctrinfo->u.siginfo->signo) { case SIGCONT: - if (j->job.state + if (j->job->state & (JOB_STAT_PSUSP | JOB_STAT_USUSP | JOB_STAT_SSUSP)) { - int state = j->job.state; + int state = j->job->state; /* resume suspend job? */ state &= ~(JOB_STAT_PSUSP | JOB_STAT_USUSP); @@ -322,9 +333,9 @@ int job_ctrl(cluster_t* c, xce_jobctrl_t* ctrinfo) break; case SIGSTOP: case SIGTSTP: - if (!(j->job.state + if (!(j->job->state & (JOB_STAT_PSUSP | JOB_STAT_USUSP | JOB_STAT_SSUSP))) { - int state = j->job.state; + int state = j->job->state; state |= JOB_STAT_PSUSP; mark_job_update(c, j, state); @@ -333,7 +344,7 @@ int job_ctrl(cluster_t* c, xce_jobctrl_t* ctrinfo) case SIGKILL: case SIGTERM: default: - if (j->job.state + if (j->job->state & (JOB_STAT_DONE | JOB_STAT_EXIT | JOB_STAT_ERR)) { break; } @@ -346,7 +357,8 @@ int job_ctrl(cluster_t* c, xce_jobctrl_t* ctrinfo) } break; case JobControl_u_ckptoption: - if (j->job.state & (JOB_STAT_DONE | JOB_STAT_EXIT | JOB_STAT_ERR)) { + if (j->job->state + & (JOB_STAT_DONE | JOB_STAT_EXIT | JOB_STAT_ERR)) { ERROR("job <%ld> has been finished, no checkpoint can be done.", jobid); } else { @@ -433,6 +445,7 @@ int handle_jobsubmit(cluster_t* c, endpoint_t* ep, xce_request_t* request) xlist_t jlist; job_t* j = NULL; int i; + int rc; submit = request->body.jobsubmsg; @@ -467,8 +480,8 @@ int handle_jobsubmit(cluster_t* c, endpoint_t* ep, xce_request_t* request) for (i = 0; i < submit->array_size; i++) { /* Run hooks to tell scheduler */ - j = jobmgr_lockjob(&(c->jobmgr), jobid + i, OBJREF_READ); - if (j == NULL) { + rc = key_find(c->jobmgr, (void*)(jobid + i), (void**)&j); + if ((rc <= 0) || (j == NULL)) { char idstring[128]; fmt_jobid(idstring, sizeof(idstring) - 1, jobid); @@ -496,21 +509,20 @@ static int mark_job_start(cluster_t* c, job_t* job, job_pidinfo_t* info) xce_run_hooks(&(c->hooksys), XCE_CONTROLLER_HOOK_JOB, HOOK_BEFORE_EVENT, HOOK_DETAIL_JOB_START, c, info, job); /* update job information */ - job->job.state = JOB_STAT_RUN; - job->job.start_time = time(NULL); - if (job->job.pidinfo == NULL) { - job->job.pidinfo = (job_pidinfo_t*)calloc(1, sizeof(job_pidinfo_t)); + job->job->state = JOB_STAT_RUN; + job->job->start_time = time(NULL); + if (job->job->pidinfo == NULL) { + job->job->pidinfo = (job_pidinfo_t*)calloc(1, sizeof(job_pidinfo_t)); } - job->job.pidinfo->npids = copy_int_list((int**)&(job->job.pidinfo->pids), - (int*)info->pids, info->npids); - job->job.pidinfo->npgids = copy_int_list((int**)&(job->job.pidinfo->pgids), - (int*)info->pgids, info->npgids); + job->job->pidinfo->npids = copy_int_list((int**)&(job->job->pidinfo->pids), + (int*)info->pids, info->npids); + job->job->pidinfo->npgids = copy_int_list( + (int**)&(job->job->pidinfo->pgids), (int*)info->pgids, info->npgids); if (info->exdata != NULL) { - job->job.pidinfo->exdata - = create_obj_by_typename(&(c->objmgr), "xstring", info->exdata); + job->job->pidinfo->exdata = makeString(info->exdata); } else { - job->job.pidinfo->exdata = NULL; + job->job->pidinfo->exdata = NULL; } xce_run_hooks(&(c->hooksys), XCE_CONTROLLER_HOOK_JOB, HOOK_AFTER_EVENT, @@ -522,20 +534,19 @@ static int mark_job_start(cluster_t* c, job_t* job, job_pidinfo_t* info) int on_job_start(cluster_t* c, job_pidinfo_t* info) { job_t* job = NULL; + int rc; TRACE("%s jobid %ld", __func__, info->jobid); - job = jobmgr_lockjob(&(c->jobmgr), info->jobid, OBJREF_UPDATE); - if (job == NULL) { + rc = key_find(c->jobmgr, (void*)info->jobid, (void**)&job); + + if ((rc <= 0) || (job == NULL)) { ERROR("can not find job %ld", info->jobid); return -errno; } mark_job_start(c, job, info); - /* unlock the job */ - DEREF_OBJ(job); - return 0; } @@ -545,23 +556,24 @@ static int mark_job_finish(cluster_t* c, job_t* job, xce_jobfinish_t* finish) HOOK_DETAIL_JOB_EXIT, c, finish, job); /* update job information */ if (finish->exit_code == 0) { - job->job.state = JOB_STAT_DONE; + job->job->state = JOB_STAT_DONE; } else { - job->job.state = JOB_STAT_EXIT; + job->job->state = JOB_STAT_EXIT; } - job->job.finish_time = time(NULL); + job->job->finish_time = time(NULL); /* fill job run time/rusage information */ - if (job->job.exit_info == NULL) { - job->job.exit_info = (job_exitinfo_t*)calloc(1, sizeof(job_exitinfo_t)); + if (job->job->exit_info == NULL) { + job->job->exit_info + = (job_exitinfo_t*)calloc(1, sizeof(job_exitinfo_t)); } - if (job->job.exit_info != NULL) { - job->job.exit_info->exitcode = finish->exit_code; + if (job->job->exit_info != NULL) { + job->job->exit_info->exitcode = finish->exit_code; } - job->job.run_time = job->job.finish_time - job->job.start_time; + job->job->run_time = job->job->finish_time - job->job->start_time; xce_run_hooks(&(c->hooksys), XCE_CONTROLLER_HOOK_JOB, HOOK_AFTER_EVENT, HOOK_DETAIL_JOB_EXIT, c, finish, job); @@ -576,7 +588,8 @@ int on_job_finish(cluster_t* c, xce_jobfinish_t* finish) TRACE("%s job finish jobid %ld exit code %d", __func__, finish->jobid, finish->exit_code); - job = jobmgr_lockjob(&(c->jobmgr), finish->jobid, OBJREF_UPDATE); + key_find(c->jobmgr, (void*)finish->jobid, (void**)&job); + if (job == NULL) { ERROR("can not find job %ld", finish->jobid); return -errno; @@ -584,9 +597,6 @@ int on_job_finish(cluster_t* c, xce_jobfinish_t* finish) mark_job_finish(c, job, finish); - /* unlock the job */ - DEREF_OBJ(job); - return 0; } @@ -599,20 +609,20 @@ static int mark_job_fail(cluster_t* c, job_t* job, job_failinfo_t* failinfo) switch (failinfo->stage) { case JOB_EXEC_STAGE_Q_POST_EXEC: case JOB_EXEC_STAGE_POST_EXEC: - if ((job->job.state & (JOB_STAT_EXIT | JOB_STAT_DONE)) == 0) { + if ((job->job->state & (JOB_STAT_EXIT | JOB_STAT_DONE)) == 0) { WARN("job %ld got post exec fail notification but job's exit " "status has not been set", - job->job.jobid); - job->job.state |= JOB_STAT_EXIT; + job->job->jobid); + job->job->state |= JOB_STAT_EXIT; } - job->job.state |= JOB_STAT_PERR; + job->job->state |= JOB_STAT_PERR; break; default: - job->job.state = JOB_STAT_EXIT; + job->job->state = JOB_STAT_EXIT; break; } - job->job.finish_time = time(NULL); + job->job->finish_time = time(NULL); xce_run_hooks(&(c->hooksys), XCE_CONTROLLER_HOOK_JOB, HOOK_AFTER_EVENT, HOOK_DETAIL_JOB_FAIL, c, failinfo, job); @@ -625,7 +635,7 @@ static int mark_job_update(cluster_t* c, job_t* job, int state) xce_run_hooks(&(c->hooksys), XCE_CONTROLLER_HOOK_JOB, HOOK_BEFORE_EVENT, HOOK_DETAIL_JOB_UPDATE, c, job); /* update job state */ - job->job.state = state; + job->job->state = state; xce_run_hooks(&(c->hooksys), XCE_CONTROLLER_HOOK_JOB, HOOK_AFTER_EVENT, HOOK_DETAIL_JOB_UPDATE, c, job); @@ -640,7 +650,7 @@ int on_job_fail(cluster_t* c, job_failinfo_t* failinfo) TRACE("%s job fail jobid %ld code %d", __func__, failinfo->jobid, failinfo->code); - job = jobmgr_lockjob(&(c->jobmgr), failinfo->jobid, OBJREF_UPDATE); + key_find(c->jobmgr, (void*)failinfo->jobid, (void**)&job); if (job == NULL) { ERROR("can not find job %ld", failinfo->jobid); return -errno; @@ -648,9 +658,6 @@ int on_job_fail(cluster_t* c, job_failinfo_t* failinfo) mark_job_fail(c, job, failinfo); - /* unlock the job */ - DEREF_OBJ(job); - return 0; } @@ -661,20 +668,17 @@ int on_job_stop(cluster_t* c, uint64_t jobid) TRACE("%s job stop jobid %ld", __func__, jobid); - job = jobmgr_lockjob(&(c->jobmgr), jobid, OBJREF_UPDATE); + key_find(c->jobmgr, (void*)jobid, (void**)&job); if (job == NULL) { ERROR("can not find job %ld", jobid); return -errno; } - state = job->job.state; + state = job->job->state; state |= JOB_STAT_USUSP; mark_job_update(c, job, state); - /* unlock the job */ - DEREF_OBJ(job); - return 0; } @@ -685,19 +689,16 @@ int on_job_resume(cluster_t* c, uint64_t jobid) TRACE("%s job resume jobid %ld", __func__, jobid); - job = jobmgr_lockjob(&(c->jobmgr), jobid, OBJREF_UPDATE); + key_find(c->jobmgr, (void*)jobid, (void**)&job); if (job == NULL) { ERROR("can not find job %ld", jobid); return -errno; } - state = job->job.state; + state = job->job->state; state &= ~JOB_STAT_USUSP; mark_job_update(c, job, state); - /* unlock the job */ - DEREF_OBJ(job); - return 0; } @@ -708,28 +709,25 @@ int on_job_postdone(cluster_t* c, endpoint_t* ep, uint64_t jobid) TRACE("%s job post done jobid %ld", __func__, jobid); - job = jobmgr_lockjob(&(c->jobmgr), jobid, OBJREF_UPDATE); + key_find(c->jobmgr, (void*)jobid, (void**)&job); if (job == NULL) { ERROR("can not find job %ld", jobid); return -errno; } - state = job->job.state; + state = job->job->state; if ((state & (JOB_STAT_EXIT | JOB_STAT_DONE)) == 0) { WARN("job %ld got post exec fail notification but job's exit status " "has not been set", - job->job.jobid); + job->job->jobid); state |= JOB_STAT_EXIT; /* ensure that job finish time has been set */ - job->job.finish_time = time(NULL); + job->job->finish_time = time(NULL); } state |= JOB_STAT_PDONE; mark_job_update(c, job, state); - /* unlock the job */ - DEREF_OBJ(job); - return 0; } @@ -737,7 +735,7 @@ int on_job_ckpt(cluster_t* c, endpoint_t* ep, xce_ckptinfo_t* ckptinfo) { uint64_t jobid; char* info = NULL; - job_t* j; + job_t* j = NULL; if (ckptinfo == NULL) { ERROR("%s ckptinfo should not be NULL", __func__); @@ -749,7 +747,8 @@ int on_job_ckpt(cluster_t* c, endpoint_t* ep, xce_ckptinfo_t* ckptinfo) TRACE("%s job %ld ckptinfo %s", __func__, jobid, info); - j = jobmgr_lockjob(&(c->jobmgr), jobid, OBJREF_UPDATE); + key_find(c->jobmgr, (void*)jobid, (void**)&j); + if (j == NULL) { ERROR("%s can not find job %ld", __func__, jobid); return -errno; @@ -757,11 +756,12 @@ int on_job_ckpt(cluster_t* c, endpoint_t* ep, xce_ckptinfo_t* ckptinfo) xce_run_hooks(&(c->hooksys), XCE_CONTROLLER_HOOK_JOB, HOOK_BEFORE_EVENT, HOOK_DETAIL_JOB_CKPT, c, j); - if (j->job.ckptinfo != NULL) { - obj_deref(j->job.ckptinfo); + if (j->job->ckptinfo != NULL) { + obj_deref(j->job->ckptinfo); } - j->job.ckptinfo = create_obj_by_typename(&(c->objmgr), "xstring", info); + j->job->ckptinfo = makeString(info); + xce_run_hooks(&(c->hooksys), XCE_CONTROLLER_HOOK_JOB, HOOK_AFTER_EVENT, HOOK_DETAIL_JOB_CKPT, c, j); @@ -788,28 +788,28 @@ int do_jobcontrol_op(cluster_t* c, endpoint_t* ep, xce_request_t* request) int update_job_rusages(cluster_t* c, endpoint_t* ep, xce_request_t* request) { xce_job_rusages_t* rusages = request->body.updatemsg->data.jobrusages; - job_t* j; - worker_t* w; - char* host = NULL; + job_t* j = NULL; + worker_t* w = NULL; + char* host = NULL; TRACE("%s trying to update job(%ld) rusage", __func__, rusages->jobid); xce_run_hooks(&(c->hooksys), XCE_CONTROLLER_HOOK_JOB, HOOK_BEFORE_EVENT, HOOK_DETAIL_JOB_RUSAGE_UPDATE, c, rusages); - j = jobmgr_lockjob(&(c->jobmgr), rusages->jobid, OBJREF_UPDATE); + key_find(c->jobmgr, (void*)rusages->jobid, (void**)&j); if (j == NULL) { PERROR("jobmgr_lockjob"); return -errno; } - w = get_ep_worker(c, ep, OBJREF_READ); + w = get_ep_worker(c, ep); if (w == NULL) { obj_deref(j); return errno; } - host = create_obj_by_typename(&(c->objmgr), "xstring", w->host.name); + host = makeString(w->host->name); obj_deref(w); if (host == NULL) { @@ -821,12 +821,12 @@ int update_job_rusages(cluster_t* c, endpoint_t* ep, xce_request_t* request) xce_run_hooks(&(c->hooksys), XCE_CONTROLLER_HOOK_JOB, HOOK_BEFORE_EVENT, HOOK_DETAIL_JOB_UPDATE, c, j); - update_host_runusage(&(j->job.run_usage), host, rusages->count, + update_host_runusage(&(j->job->run_usage), host, rusages->count, rusages->usages); - update_pids(&(j->job.pidinfo), rusages->npids, rusages->pids); + update_pids(&(j->job->pidinfo), rusages->npids, rusages->pids); - update_pgids(&(j->job.pidinfo), rusages->npgids, rusages->pgids); + update_pgids(&(j->job->pidinfo), rusages->npgids, rusages->pgids); /* FIXME * update other fields of job rusage later @@ -843,12 +843,12 @@ int update_job_rusages(cluster_t* c, endpoint_t* ep, xce_request_t* request) static int set_preason(cluster_t* c, xce_pendreason_t* reasons) { - job_t* j; - xce_job_t* job; + job_t* j = NULL; + xce_job_t* job = NULL; TRACE("%s jobid %ld", __func__, reasons->jobid); - j = jobmgr_lockjob(&(c->jobmgr), reasons->jobid, OBJREF_UPDATE); + key_find(c->jobmgr, (void*)reasons->jobid, (void**)&j); if (j == NULL) { PERROR("jobmgr_lockjob"); return -ENOENT; @@ -856,7 +856,7 @@ static int set_preason(cluster_t* c, xce_pendreason_t* reasons) xce_run_hooks(&(c->hooksys), XCE_CONTROLLER_HOOK_JOB, HOOK_BEFORE_EVENT, HOOK_DETAIL_SETPREASON, c, j); - job = &(j->job); + job = j->job; if (job->pend_reasons != NULL) { erase_job_preason(job->pend_reasons); FREEUP(job->pend_reasons); @@ -865,7 +865,6 @@ static int set_preason(cluster_t* c, xce_pendreason_t* reasons) MOVE_PTR(job->pend_reasons, reasons->reasons); xce_run_hooks(&(c->hooksys), XCE_CONTROLLER_HOOK_JOB, HOOK_AFTER_EVENT, HOOK_DETAIL_SETPREASON, c, j); - obj_deref(j); return 0; } @@ -915,7 +914,7 @@ int do_clr_preason(cluster_t* c, endpoint_t* ep, xce_request_t* request) job_t* j; xce_job_t* job; - j = jobmgr_lockjob(&(c->jobmgr), jobid, OBJREF_UPDATE); + key_find(c->jobmgr, (void*)jobid, (void**)&j); if (j == NULL) { PERROR("jobmgr_lockjob"); continue; @@ -924,7 +923,7 @@ int do_clr_preason(cluster_t* c, endpoint_t* ep, xce_request_t* request) xce_run_hooks(&(c->hooksys), XCE_CONTROLLER_HOOK_JOB, HOOK_BEFORE_EVENT, HOOK_DETAIL_CLRPREASON, c, j); - job = &(j->job); + job = j->job; if (job->pend_reasons != NULL) { erase_job_preason(job->pend_reasons); FREEUP(job->pend_reasons); diff --git a/src/controller/meson.build b/src/controller/meson.build index f625c6ad..09b8116e 100644 --- a/src/controller/meson.build +++ b/src/controller/meson.build @@ -14,7 +14,6 @@ controller_src = [ 'sched.c', 'task.c', 'worker.c', - 'xceobjs.c', 'apiserver.c', 'myconf.c', ] diff --git a/src/controller/misc.c b/src/controller/misc.c index a13f695f..800f20e1 100644 --- a/src/controller/misc.c +++ b/src/controller/misc.c @@ -47,10 +47,11 @@ int get_ep_role(endpoint_t* ep) return priv->role; } -worker_t* get_ep_worker(cluster_t* c, endpoint_t* ep, int op) +worker_t* get_ep_worker(cluster_t* c, endpoint_t* ep) { int role, idx; - worker_t* w = NULL; + worker_t* w = NULL; + int rc = 0; role = get_ep_role(ep); if (role != HostRole_worker) { @@ -64,7 +65,11 @@ worker_t* get_ep_worker(cluster_t* c, endpoint_t* ep, int op) return NULL; } - w = workermgr_lock_byid(&(c->workermgr), idx, op); + rc = key_find(c->workermgr, (void*)idx, (void**)&w); + if (rc < 0) { + return NULL; + } + if (w == NULL) { ERROR("can not find worker with id (%d)", idx); } diff --git a/src/controller/myconf.c b/src/controller/myconf.c index b6a18053..f17cb72c 100644 --- a/src/controller/myconf.c +++ b/src/controller/myconf.c @@ -6,6 +6,7 @@ #include "controller.capnp.h" #include "myconf.h" +#include "configobj.h" #include "objmgr.h" #include "utils.h" #include "xce/cluster_def.h" @@ -17,7 +18,7 @@ int add_config(void* c, char* name, char* value) xce_config_t cvar = { .name = name, .value = value }; xce_config_t* cv = NULL; - cv = create_obj_by_typename(&(cls->objmgr), "xconfig", &cvar); + cv = makeConfig(&cvar); if (cv == NULL) { return -errno; } diff --git a/src/controller/opget.c b/src/controller/opget.c index 90e928c1..1408abc1 100644 --- a/src/controller/opget.c +++ b/src/controller/opget.c @@ -148,16 +148,16 @@ static int do_reply_joblist(cluster_t* c, endpoint_t* ep, init_reply_by_req(&reply, request); if (match->type == MatchCondition_condition_matchjid) { - job_t* j; + job_t* j = NULL; jobdata.n_total = 0; jobdata.jobs = NULL; - j = jobmgr_lockjob(&(c->jobmgr), match->condition.jobid, OBJREF_READ); - if (j != NULL) { + rc = key_find(c->jobmgr, (void*)match->condition.jobid, (void**)&j); + if (rc > 0) { jobdata.jobs = (xce_job_t**)calloc(1, sizeof(xce_job_t*)); if (jobdata.jobs != NULL) { - jobdata.jobs[0] = &(j->job); + jobdata.jobs[0] = j->job; jobdata.n_total = 1; } } diff --git a/src/controller/opupd.c b/src/controller/opupd.c index 4e814019..75e28b90 100644 --- a/src/controller/opupd.c +++ b/src/controller/opupd.c @@ -23,9 +23,9 @@ static int do_update_resvals(cluster_t* c, endpoint_t* ep, int idx = priv->u.idx; if ((priv->role == HostRole_worker) && (idx >= 0)) { - worker_t* w; + worker_t* w = NULL; - w = workermgr_lock_byid(&(c->workermgr), idx, OBJREF_UPDATE); + rc = vget(c->workermgr, idx, (void**)&w); if (w == NULL) { rc = -E_XCE_BAD_WORKER; } else { diff --git a/src/controller/queue.c b/src/controller/queue.c index a8811b2a..7021484b 100644 --- a/src/controller/queue.c +++ b/src/controller/queue.c @@ -3,8 +3,10 @@ #include #include "cluster.h" +#include "qobj.h" #include "xce/cluster_def.h" #include "xce/types.h" +#include "xstring.h" void queue_fini(queue_t* q) { @@ -15,12 +17,14 @@ void queue_fini(queue_t* q) queue_t* create_queue(cluster_t* c, xce_queue_t* p) { - queue_t q1; queue_t* q; - memcpy(&(q1.queue), p, sizeof(q1.queue)); + q = calloc(1, sizeof(*q)); + if (q == NULL) { + return NULL; + } - q = create_obj_by_typename(&(c->objmgr), "xqueue", &q1); + q->queue = makeQueue(p); return q; } @@ -56,7 +60,11 @@ int queue_ctrl(cluster_t* c, xce_queuectrl_t* ctrl) return -EINVAL; } TRACE("%s queue_ctrl queue %s", __func__, ctrl->queue); - q = qmgr_lockq(&(c->qmgr), ctrl->queue, OBJREF_UPDATE); + rc = key_find(c->qmgr, (void*)ctrl->queue, (void**)&q); + if (rc < 0) { + return rc; + } + if (q == NULL) { PERROR("qmgr_lockq"); return -ENOENT; @@ -64,28 +72,28 @@ int queue_ctrl(cluster_t* c, xce_queuectrl_t* ctrl) switch (ctrl->action) { case QUEUE_OPEN: - if (!(q->queue.status & QUEUE_STAT_CLOSED)) { + if (!(q->queue->status & QUEUE_STAT_CLOSED)) { goto clean; } - q->queue.status &= ~QUEUE_STAT_CLOSED; + q->queue->status &= ~QUEUE_STAT_CLOSED; break; case QUEUE_CLOSE: - if (q->queue.status & QUEUE_STAT_CLOSED) { + if (q->queue->status & QUEUE_STAT_CLOSED) { goto clean; } - q->queue.status |= QUEUE_STAT_CLOSED; + q->queue->status |= QUEUE_STAT_CLOSED; break; case QUEUE_INACTIVE: - if (q->queue.status & QUEUE_STAT_INACT_ADMIN) { + if (q->queue->status & QUEUE_STAT_INACT_ADMIN) { goto clean; } - q->queue.status |= QUEUE_STAT_INACT_ADMIN; + q->queue->status |= QUEUE_STAT_INACT_ADMIN; break; case QUEUE_ACTIVE: - if (!(q->queue.status & QUEUE_STAT_INACT_ADMIN)) { + if (!(q->queue->status & QUEUE_STAT_INACT_ADMIN)) { goto clean; } - q->queue.status &= ~QUEUE_STAT_INACT_ADMIN; + q->queue->status &= ~QUEUE_STAT_INACT_ADMIN; break; default: rc = -1; @@ -117,7 +125,8 @@ int do_queuecontrol_op(cluster_t* c, endpoint_t* ep, xce_request_t* request) int get_queue_exec(cluster_t* c, char* queue, char** pre_exec, char** post_exec) { - queue_t* q = NULL; + queue_t* q = NULL; + int rc = 0; TRACE("entering %s", __func__); @@ -128,22 +137,24 @@ int get_queue_exec(cluster_t* c, char* queue, char** pre_exec, char** post_exec) TRACE("%s queue %s", __func__, queue); - q = qmgr_lockq(&(c->qmgr), queue, OBJREF_READ); + rc = key_find(c->qmgr, (void*)queue, (void**)&q); + if (rc < 0) { + return rc; + } + if (q == NULL) { PERROR("qmgr_lockq"); return -ENOENT; } - if (q->queue.pre_exec != NULL) { - *pre_exec = create_obj_by_typename(&(c->objmgr), "xstring", - q->queue.pre_exec); + if (q->queue->pre_exec != NULL) { + *pre_exec = makeString(q->queue->pre_exec); } else { *pre_exec = NULL; } - if (q->queue.post_exec != NULL) { - *post_exec = create_obj_by_typename(&(c->objmgr), "xstring", - q->queue.post_exec); + if (q->queue->post_exec != NULL) { + *post_exec = makeString(q->queue->post_exec); } else { *post_exec = NULL; } diff --git a/src/controller/sched.c b/src/controller/sched.c index c9999017..9a77c017 100644 --- a/src/controller/sched.c +++ b/src/controller/sched.c @@ -114,8 +114,8 @@ static int xcesched_push_configs(cluster_t* c) configdata.data.conf4sched->n_hgroups = c->myconf->cluster_config->nhgroups; configdata.data.conf4sched->hgroups = c->myconf->cluster_config->hgroups; #if 0 /* FIXME: we use builtin limit currently */ - configdata.data.conf4sched->nlimits = c->myconf->cluster_config->nlimits; - configdata.data.conf4sched->limits = c->myconf->cluster_config->limits; + configdata.data.conf4sched->nlimits = c->myconf->cluster_config->nlimits; + configdata.data.conf4sched->limits = c->myconf->cluster_config->limits; #else configdata.data.conf4sched->nlimits = nlimits; configdata.data.conf4sched->limits = &(limits[0]); @@ -204,7 +204,7 @@ static int xcesched_push_workers(cluster_t* c) 100); /* free up collected resource value which used - passed to scheduler + passed to scheduler */ for (i = 0; i < workers.n_total; i++) { xce_worker_t* w = workers.workers[i]; @@ -248,12 +248,12 @@ static int sched_job_start_fun(int type, int situation, void* data, va_list ap) job_pidinfo_t* info = va_arg(ap, job_pidinfo_t*); int rc = 0; /* clang-format off */ - xce_notify_data_t xdata = { - .event = NotifyData_data_schedStartJob, - .data = { - .sched_start_job = info->jobid - } - }; + xce_notify_data_t xdata = { + .event = NotifyData_data_schedStartJob, + .data = { + .sched_start_job = info->jobid + } + }; /* clang-format on */ mylock_lock(&(c->sched.lock)); @@ -278,12 +278,12 @@ static int sched_job_exit_fun(int type, int situation, void* data, va_list ap) xce_jobfinish_t* info = va_arg(ap, xce_jobfinish_t*); int rc = 0; /* clang-format off */ - xce_notify_data_t xdata = { - .event = NotifyData_data_schedExitJob, - .data = { - .sched_exit_job = info->jobid - } - }; + xce_notify_data_t xdata = { + .event = NotifyData_data_schedExitJob, + .data = { + .sched_exit_job = info->jobid + } + }; /* clang-format on */ mylock_lock(&(c->sched.lock)); @@ -308,12 +308,12 @@ static int sched_job_fail_fun(int type, int situation, void* data, va_list ap) job_failinfo_t* info = va_arg(ap, job_failinfo_t*); int rc = 0; /* clang-format off */ - xce_notify_data_t xdata = { - .event = NotifyData_data_schedFailJob, - .data = { - .sched_fail_job = info->jobid - } - }; + xce_notify_data_t xdata = { + .event = NotifyData_data_schedFailJob, + .data = { + .sched_fail_job = info->jobid + } + }; /* clang-format on */ mylock_lock(&(c->sched.lock)); @@ -338,12 +338,12 @@ static int sched_job_update_fun(int type, int situation, void* data, va_list ap) job_t* job = va_arg(ap, job_t*); int rc = 0; /* clang-format off */ - xce_notify_data_t xdata = { - .event = NotifyData_data_schedUpdateJob, - .data = { - .sched_update_job = &(job->job) - } - }; + xce_notify_data_t xdata = { + .event = NotifyData_data_schedUpdateJob, + .data = { + .sched_update_job = job->job + } + }; /* clang-format on */ mylock_lock(&(c->sched.lock)); @@ -369,12 +369,12 @@ static int sched_job_rusage_update_fun(int type, int situation, void* data, xce_job_rusages_t* rusages = va_arg(ap, xce_job_rusages_t*); int rc = 0; /* clang-format off */ - xce_notify_data_t xdata = { - .event = NotifyData_data_schedJobRusages, - .data = { - .sched_job_rusages = rusages - } - }; + xce_notify_data_t xdata = { + .event = NotifyData_data_schedJobRusages, + .data = { + .sched_job_rusages = rusages + } + }; /* clang-format on */ mylock_lock(&(c->sched.lock)); @@ -419,11 +419,11 @@ static int sched_worker_change(int type, int situation, void* data, int rc = 0; xlist_t wlist; - TRACE("%s worker %s idx %d situation %d", __func__, w->host.name, w->idx, + TRACE("%s worker %s idx %d situation %d", __func__, w->host->name, w->idx, situation); - collect_resval_with_idx(&(w->host.resvals), &(w->host.nresvals_to_sched), - &(w->host.resvals_to_sched)); + collect_resval_with_idx(&(w->host->resvals), &(w->host->nresvals_to_sched), + &(w->host->resvals_to_sched)); mylock_lock(&(c->sched.lock)); if (c->sched.ep != NULL) { @@ -440,8 +440,8 @@ static int sched_worker_change(int type, int situation, void* data, } mylock_unlock(&(c->sched.lock)); - free_resval_with_idx_list(&(w->host.resvals_to_sched), - w->host.nresvals_to_sched); + free_resval_with_idx_list(&(w->host->resvals_to_sched), + w->host->nresvals_to_sched); return rc; } @@ -458,7 +458,14 @@ static int sched_worker_join(int type, int situation, void* data, va_list ap) return 0; } - w = workermgr_lock(&(c->workermgr), name, OBJREF_READ); + rc = key_find(c->workermgr, (void *)name, (void **)&w); + if (rc < 0) { + return rc; + } + + if (rc == 0) { + return -ENOENT; + } rc = sched_worker_change(type, situation, data, c, w); @@ -551,7 +558,7 @@ static int sched_queue_update(int type, xce_notify_data_t xdata = { .event = NotifyData_data_schedUpdateQueue, .data = { - .sched_update_queue = &(q->queue) + .sched_update_queue = q->queue } }; /* clang-format on */ diff --git a/src/controller/task.c b/src/controller/task.c index bdcef8a8..8b782340 100644 --- a/src/controller/task.c +++ b/src/controller/task.c @@ -17,12 +17,16 @@ static int run_tasks_on_host(cluster_t* c, endpoint_t* ep, uint64_t jobid, .clientidx = ep->idx, .taskhosts = (xce_taskhost_t*[]) { info } }; - w = workermgr_lock(&(c->workermgr), info->host, OBJREF_READ); + rc = key_find(c->workermgr, (void*)info->host, (void**)&w); + if (rc < 0) { + return rc; + } + if (w == NULL) { return -ENOENT; } - if ((w->ep == NULL) || (IS_WORKER_UNAVAIL(w->host.status))) { + if ((w->ep == NULL) || (IS_WORKER_UNAVAIL(w->host->status))) { obj_deref(w); return -EINVAL; } @@ -40,19 +44,24 @@ static int check_task_hosts(cluster_t* c, xce_taskrun_t* runmsg) for (i = 0; i < runmsg->nhosts; i++) { worker_t* w; + int rc = 0; - w = workermgr_lock(&(c->workermgr), runmsg->taskhosts[i]->host, - OBJREF_READ); + rc = key_find(c->workermgr, (void*)runmsg->taskhosts[i]->host, + (void**)&w); + if (rc < 0) { + return rc; + } + + if (rc == 0) { + return -ENOENT; + } if (w == NULL) { return -ENOENT; } - if ((w->ep == NULL) || IS_WORKER_UNAVAIL(w->host.status)) { - obj_deref(w); + if ((w->ep == NULL) || IS_WORKER_UNAVAIL(w->host->status)) { return -ENOENT; } - - obj_deref(w); } return 0; diff --git a/src/controller/worker.c b/src/controller/worker.c index 0c21a2f9..5c015575 100644 --- a/src/controller/worker.c +++ b/src/controller/worker.c @@ -2,9 +2,11 @@ #include #include "cluster.h" +#include "wobj.h" #include "worker.h" #include "xce/cluster_def.h" #include "xce/errnox.h" +#include "xstring.h" static int hostmatched(const char* pattern, const char* name) { @@ -68,7 +70,7 @@ static int update_val_res(cluster_t* c, worker_t* w, xce_resource_t* r, array = &(c->sharedinst); } else { /* update host based resource */ - array = &(w->host.resvals); + array = &(w->host->resvals); } if (idx < array->caps) { @@ -95,11 +97,14 @@ static int update_val_res(cluster_t* c, worker_t* w, xce_resource_t* r, static int update_resval(cluster_t* c, worker_t* w, xce_resval_t* val) { - xce_resource_t* r; + xce_resource_t* r = NULL; xce_val_t* v = NULL; int rc; - r = resmgr_lockres(&(c->resmgr), val->name, OBJREF_READ); + rc = key_find(c->resmgr, (void*)val->name, (void**)&r); + if (rc < 0) { + return rc; + } if (r == NULL) { ERROR("resource `%s' can not be found", val->name); return -errno; @@ -114,8 +119,6 @@ static int update_resval(cluster_t* c, worker_t* w, xce_resval_t* val) rc = update_val_res(c, w, r, v); - obj_deref(r); - return rc; } @@ -151,14 +154,18 @@ int update_resval_list(cluster_t* c, worker_t* w, xce_resval_list_t* l) static int mark_host_res(cluster_t* c, worker_t* w, xce_config_t* config) { - xce_resource_t* r; + xce_resource_t* r = NULL; char* n = config->name; int rc; /* clang-format-off */ xce_val_t val; /* clang-format-on */ - r = resmgr_lockres(&(c->resmgr), n, OBJREF_READ); + rc = key_find(c->resmgr, (void*)n, (void**)&r); + if (rc < 0) { + return rc; + } + if (r == NULL) { ERROR("resource `%s' can not be found", n); return -ENOENT; @@ -199,7 +206,6 @@ static int mark_host_res(cluster_t* c, worker_t* w, xce_config_t* config) } rc = update_val_res(c, w, r, &val); - obj_deref(r); return rc; } @@ -207,16 +213,17 @@ static int add_hostattrs_resvals(cluster_t* c, worker_t* w) { #define N_HOST_ATTRS (8) xce_val_t values[N_HOST_ATTRS] = { - { .which = Value_u_svalue, .u = { .svalue = w->host.attrs->hosttype } }, { .which = Value_u_svalue, - .u = { .svalue = w->host.attrs->hostmodel } }, + .u = { .svalue = w->host->attrs->hosttype } }, + { .which = Value_u_svalue, + .u = { .svalue = w->host->attrs->hostmodel } }, { .which = Value_u_fvalue, - .u = { .fvalue = w->host.attrs->cpufactor } }, - { .which = Value_u_fvalue, .u = { .fvalue = w->host.attrs->maxcpus } }, - { .which = Value_u_fvalue, .u = { .fvalue = w->host.attrs->maxmem } }, - { .which = Value_u_fvalue, .u = { .fvalue = w->host.attrs->maxswap } }, - { .which = Value_u_fvalue, .u = { .fvalue = w->host.attrs->maxtmp } }, - { .which = Value_u_fvalue, .u = { .fvalue = w->host.attrs->ndisks } } + .u = { .fvalue = w->host->attrs->cpufactor } }, + { .which = Value_u_fvalue, .u = { .fvalue = w->host->attrs->maxcpus } }, + { .which = Value_u_fvalue, .u = { .fvalue = w->host->attrs->maxmem } }, + { .which = Value_u_fvalue, .u = { .fvalue = w->host->attrs->maxswap } }, + { .which = Value_u_fvalue, .u = { .fvalue = w->host->attrs->maxtmp } }, + { .which = Value_u_fvalue, .u = { .fvalue = w->host->attrs->ndisks } } }; xce_resval_t resvals[N_HOST_ATTRS] = { { .name = "type", .val = &values[0] }, @@ -259,7 +266,7 @@ int add_worker(void* cls, endpoint_t* ep, const char* host, hostattrs_t* attrs) cluster_t* c = (cluster_t*)cls; /* clang-format off */ worker_t worker = { - .host = { + .host = &(xce_worker_t){ .name = (char*)host, } }; @@ -273,35 +280,38 @@ int add_worker(void* cls, endpoint_t* ep, const char* host, hostattrs_t* attrs) return -EINVAL; } + w = calloc(1, sizeof(*w)); + if (w == NULL) { + return -ENOMEM; + } + hconfig = find_matched_hostconfig(c, host); if (hconfig == NULL) { return -errno; } - worker.host.attrs = attrs; + worker.host->attrs = attrs; - w = create_obj_by_typename(&(c->objmgr), "xworker", &worker); - if (w == NULL) { + w->host = makeWorker(worker.host); + if (w->host == NULL) { return -errno; } /* we should hold the update lock */ /* If admin makes the host in locked or closed, we need keep this */ - w->host.status &= ~XCE_WORKER_UNAVAIL; /* status OK */ + w->host->status &= ~XCE_WORKER_UNAVAIL; /* status OK */ w->ep = ep; /* override host type? */ if (strcmp(hconfig->hosttype, "!") != 0) { - obj_deref(w->host.attrs->hosttype); - w->host.attrs->hosttype = create_obj_by_typename( - &(c->objmgr), "xstring", hconfig->hosttype); + dereference(w->host->attrs->hosttype); + w->host->attrs->hosttype = makeString(hconfig->hosttype); } /* override host model */ if (strcmp(hconfig->hostmodel, "!") != 0) { - obj_deref(w->host.attrs->hostmodel); - w->host.attrs->hostmodel = create_obj_by_typename( - &(c->objmgr), "xstring", hconfig->hostmodel); + dereference(w->host->attrs->hostmodel); + w->host->attrs->hostmodel = makeString(hconfig->hostmodel); } add_hostattrs_resvals(c, w); idx = w->idx; @@ -309,31 +319,31 @@ int add_worker(void* cls, endpoint_t* ep, const char* host, hostattrs_t* attrs) /* using auto detected or pre configured MXJ? */ nslots = hconfig->mxj; if (nslots < 0) { - nslots = w->host.attrs->maxcpus; + nslots = w->host->attrs->maxcpus; } set_host_slots(c, w, nslots); - if (w->host.dispatch_window_config != NULL) { - free_timewindow_config(w->host.dispatch_window_config); - w->host.dispatch_window_config = NULL; + if (w->host->dispatch_window_config != NULL) { + free_timewindow_config(w->host->dispatch_window_config); + w->host->dispatch_window_config = NULL; } if (hconfig->dispatchwindow != NULL) { - w->host.dispatch_window_config + w->host->dispatch_window_config = dup_timewindow_config(hconfig->dispatchwindow); } - if (w->host.thresholds != NULL) { - free_resource_thresholds(w->host.thresholds, w->host.nthresholds); - w->host.nthresholds = 0; - w->host.thresholds = NULL; + if (w->host->thresholds != NULL) { + free_resource_thresholds(w->host->thresholds, w->host->nthresholds); + w->host->nthresholds = 0; + w->host->thresholds = NULL; } if (hconfig->thresholds != NULL) { - w->host.thresholds = dup_resource_thresholds(hconfig->thresholds, - hconfig->nthresholds); - w->host.nthresholds = hconfig->nthresholds; + w->host->thresholds = dup_resource_thresholds(hconfig->thresholds, + hconfig->nthresholds); + w->host->nthresholds = hconfig->nthresholds; } /* add bool resources to host */ @@ -354,20 +364,24 @@ int restore_worker(void* cls, xce_worker_t host) /* do work in add_worker() doing for normal worker join */ /* clang-format off */ worker_t worker = { - .host = { + .host = &(xce_worker_t){ .name = (char*)host.name, .status = host.status, }, }; /* clang-format on */ - w = create_obj_by_typename(&(c->objmgr), "xworker", &worker); + w = calloc(1, sizeof(*w)); if (w == NULL) { + return -ENOMEM; + } + w->host = makeWorker(worker.host); + if (w->host == NULL) { return -errno; } add_hostattrs_resvals(c, w); idx = w->idx; - w->host.status |= XCE_WORKER_UNAVAIL; + w->host->status |= XCE_WORKER_UNAVAIL; DEREF_OBJ(w); @@ -432,12 +446,17 @@ int on_worker_join(void* cls, endpoint_t* ep) int get_resval(cluster_t* c, char* resname, char* host, xce_val_t* val) { - xce_resource_t* r; + xce_resource_t* r = NULL; zarray_t* array = NULL; xce_val_t* v = NULL; worker_t* w = NULL; + int rc = 0; + + rc = key_find(c->resmgr, (void*)resname, (void**)&r); + if (rc < 0) { + return rc; + } - r = resmgr_lockres(&(c->resmgr), resname, OBJREF_READ); if (r == NULL) { return -ENOENT; } @@ -449,13 +468,15 @@ int get_resval(cluster_t* c, char* resname, char* host, xce_val_t* val) return -EINVAL; } - w = workermgr_lock(&(c->workermgr), host, OBJREF_READ); + rc = key_find(c->workermgr, (void*)host, (void**)&w); + if (rc < 0) { + return rc; + } if (w == NULL) { - DEREF_OBJ(r); return -ENOENT; } - array = &(w->host.resvals); + array = &(w->host->resvals); } else { array = &(c->sharedinst); } @@ -464,15 +485,11 @@ int get_resval(cluster_t* c, char* resname, char* host, xce_val_t* val) v = (xce_val_t*)array->data[r->idx]; } - obj_deref(r); - if (v == NULL) { - DEREF_OBJ(w); return -ENOENT; } memcpy(val, v, sizeof(*val)); - DEREF_OBJ(w); return 1; } @@ -480,7 +497,7 @@ int mark_worker_unavail(cluster_t* c, worker_t* w) { xce_run_hooks(&(c->hooksys), XCE_CONTROLLER_HOOK_WORKER, HOOK_BEFORE_EVENT, HOOK_DETAIL_WORKER_DEAD, c, w); - w->host.status |= XCE_WORKER_UNAVAIL; + w->host->status |= XCE_WORKER_UNAVAIL; xce_run_hooks(&(c->hooksys), XCE_CONTROLLER_HOOK_WORKER, HOOK_AFTER_EVENT, HOOK_DETAIL_WORKER_DEAD, c, w); @@ -491,7 +508,7 @@ int mark_worker_back(cluster_t* c, worker_t* w) { xce_run_hooks(&(c->hooksys), XCE_CONTROLLER_HOOK_WORKER, HOOK_BEFORE_EVENT, HOOK_DETAIL_WORKER_UPDATE, c, w); - w->host.status &= ~XCE_WORKER_UNAVAIL; + w->host->status &= ~XCE_WORKER_UNAVAIL; xce_run_hooks(&(c->hooksys), XCE_CONTROLLER_HOOK_WORKER, HOOK_AFTER_EVENT, HOOK_DETAIL_WORKER_UPDATE, c, w); @@ -501,6 +518,7 @@ int mark_worker_back(cluster_t* c, worker_t* w) int handle_worker_leave(cluster_t* c, int idx) { worker_t* w = NULL; + int rc; TRACE("%s worker %d broken connection", __func__, idx); @@ -514,7 +532,11 @@ int handle_worker_leave(cluster_t* c, int idx) return -errno; } - w = workermgr_lock_byid(&(c->workermgr), idx, OBJREF_UPDATE); + rc = vget(c->workermgr, idx, (void**)&w); + if (rc < 0) { + return rc; + } + if (w == NULL) { ERROR("fail to find worker by id %d", idx); SET_ERROR(E_XCE_BAD_WORKER); @@ -539,7 +561,12 @@ int worker_ctrl(cluster_t* c, xce_hostctrl_t* ctrl) return -EINVAL; } TRACE("%s worker_ctrl worker %s", __func__, ctrl->hostname); - w = workermgr_lock(&(c->workermgr), ctrl->hostname, OBJREF_UPDATE); + + rc = key_find(c->workermgr, (void*)ctrl->hostname, (void**)&w); + if (rc < 0) { + return rc; + } + if (w == NULL) { PERROR("workermgr_lock"); return -ENOENT; @@ -547,16 +574,16 @@ int worker_ctrl(cluster_t* c, xce_hostctrl_t* ctrl) switch (ctrl->action) { case HOST_OPEN: - if (!(w->host.status & XCE_WORKER_CLOSED)) { + if (!(w->host->status & XCE_WORKER_CLOSED)) { goto clean; } - w->host.status &= ~XCE_WORKER_CLOSED; + w->host->status &= ~XCE_WORKER_CLOSED; break; case HOST_CLOSE: - if (w->host.status & XCE_WORKER_CLOSED) { + if (w->host->status & XCE_WORKER_CLOSED) { goto clean; } - w->host.status |= XCE_WORKER_CLOSED; + w->host->status |= XCE_WORKER_CLOSED; break; default: rc = -1; diff --git a/src/controller/xceobjs.c b/src/controller/xceobjs.c deleted file mode 100644 index dedb3c46..00000000 --- a/src/controller/xceobjs.c +++ /dev/null @@ -1,1011 +0,0 @@ -#include -#include -#include -#include - -#include "cluster.h" -#include "objmgr.h" -#include "preason.h" -#include "utils.h" -#include "xce/cluster_def.h" -#include "xstring.h" - -static void* xjob_create(objmgr_t*, objtype_t*, va_list); -static void xjob_fini(void*); -static void xjob_type_fini(objtype_t*); -static void* xres_create(objmgr_t*, objtype_t*, va_list); -static void xres_fini(void*); -static void xres_type_fini(objtype_t*); -static void* xworker_create(objmgr_t*, objtype_t*, va_list); -static void xworker_fini(void*); -static void xworker_type_fini(objtype_t*); -static void* xqueue_create(objmgr_t*, objtype_t*, va_list); -static void xqueue_fini(void*); -static void xqueue_type_fini(objtype_t*); -static void* xconfig_create(objmgr_t*, objtype_t*, va_list); -static void xconfig_fini(void*); -static void xconfig_type_fini(objtype_t*); -static void* xresval_create(objmgr_t*, objtype_t*, va_list); -static void xresval_fini(void*); -static void xresval_type_fini(objtype_t*); -static void* xgroup_create(objmgr_t*, objtype_t*, va_list); -static void xgroup_fini(void*); -static void xgroup_type_fini(objtype_t*); - -/* clang-format off */ -static objtype_t types[] = { - { - .type = "xjob", - .fn_create = (obj_create_fn_t)xjob_create, - .fn_fini = xjob_fini, - .fn_type_fini = (objtype_fini_fn_t)xjob_type_fini, - .typedata = NULL - }, - { - .type = "xresource", - .fn_create = (obj_create_fn_t)xres_create, - .fn_fini = xres_fini, - .fn_type_fini = (objtype_fini_fn_t)xres_type_fini, - .typedata = NULL, - }, - { - .type = "xworker", - .fn_create = (obj_create_fn_t)xworker_create, - .fn_fini = xworker_fini, - .fn_type_fini = (objtype_fini_fn_t)xworker_type_fini, - .typedata = NULL - }, - { - .type = "xqueue", - .fn_create = (obj_create_fn_t)xqueue_create, - .fn_fini = xqueue_fini, - .fn_type_fini = (objtype_fini_fn_t)xqueue_type_fini, - .typedata = NULL - }, - { - .type = "xconfig", - .fn_create = (obj_create_fn_t)xconfig_create, - .fn_fini = xconfig_fini, - .fn_type_fini = (objtype_fini_fn_t)xconfig_type_fini, - .typedata = NULL - }, - { - .type = "xresval", - .fn_create = (obj_create_fn_t)xresval_create, - .fn_fini = xresval_fini, - .fn_type_fini = (objtype_fini_fn_t)xresval_type_fini, - .typedata = NULL - - }, - { - .type = "xgroup", - .fn_create = (obj_create_fn_t)xgroup_create, - .fn_fini = xgroup_fini, - .fn_type_fini = (objtype_fini_fn_t)xgroup_type_fini, - .typedata = NULL - } -}; -/* clang-format on */ - -static void* xjob_create(objmgr_t* mgr, objtype_t* type, va_list ap) -{ - jobmgr_t* jobmgr = &(((cluster_t*)type->typedata)->jobmgr); - xce_job_t* submit = va_arg(ap, xce_job_t*); - job_t* job = NULL; - myobj_t* obj; - int32_t idx; - - if (submit == NULL) { - SET_ERROR(EINVAL); - return NULL; - } - - job = jobmgr_lockjob(jobmgr, submit->jobid, OBJREF_READ); - if (job != NULL) { - SET_ERROR(EEXIST); - obj_deref(job); - - return NULL; - } - - obj = obj_alloc(sizeof(*job)); - if (obj == NULL) { - return NULL; - } - - job = MYOBJ_TO_OBJ(job_t*, obj); - /* fill job data */ - job->job.jobid = submit->jobid; - job->job.submit = (job_submit_data_t*)calloc(1, sizeof(*(job->job.submit))); - if (job->job.submit == NULL) { - return NULL; - } - job->job.submit->queue - = create_obj_by_typename(mgr, "xstring", submit->submit->queue); - /* FIXME: */ - if (1) { - time_t now = time(NULL); - - job->job.sub_time = now; - job->job.queue_time = now; - } - - if (job->job.queue_time == 0) { - job->job.queue_time = job->job.sub_time; - } - job->job.state = submit->state; - job->job.submit->user - = create_obj_by_typename(mgr, "xstring", submit->submit->user); - job->job.start_time = submit->start_time; - job->job.finish_time = submit->finish_time; - job->job.submit->job_name - = create_obj_by_typename(mgr, "xstring", submit->submit->job_name); - job->job.submit->project_name - = create_obj_by_typename(mgr, "xstring", submit->submit->project_name); - job->job.submit->user_group - = create_obj_by_typename(mgr, "xstring", submit->submit->user_group); - job->job.submit->job_description = create_obj_by_typename( - mgr, "xstring", submit->submit->job_description); - job->job.submit->resreq - = create_obj_by_typename(mgr, "xstring", submit->submit->resreq); - job->job.run_time = submit->run_time; - job->job.submit->mintasks = submit->submit->mintasks; - job->job.submit->maxtasks = submit->submit->maxtasks; - job->job.pending_ctrl = submit->pending_ctrl; - - job->job.pidinfo = NULL; - - if (submit->pidinfo != NULL) { - job->job.pidinfo = (job_pidinfo_t*)calloc(1, sizeof(job_pidinfo_t)); - if (job->job.pidinfo == NULL) { - SET_ERROR(ENOMEM); - goto clean_job; - } - job->job.pidinfo->npids = copy_int_list( - (int**)&(job->job.pidinfo->pids), (int*)submit->pidinfo->pids, - submit->pidinfo->npids); - job->job.pidinfo->npgids = copy_int_list( - (int**)&(job->job.pidinfo->pgids), (int*)submit->pidinfo->pgids, - submit->pidinfo->npgids); - if (submit->pidinfo->exdata) { - job->job.pidinfo->exdata = create_obj_by_typename( - mgr, "xstring", submit->pidinfo->exdata); - } - } - - job->job.submit->start_info = NULL; - - if (submit->submit->start_info != NULL) { - job->job.submit->start_info - = (job_startinfo_t*)calloc(1, sizeof(job_startinfo_t)); - if (job->job.submit->start_info == NULL) { - SET_ERROR(ENOMEM); - goto clean_job; - } - job->job.submit->start_info->cmdline = create_obj_by_typename( - mgr, "xstring", submit->submit->start_info->cmdline); - job->job.submit->start_info->exdata = create_obj_by_typename( - mgr, "xstring", submit->submit->start_info->exdata); - job->job.submit->start_info->execcwd = create_obj_by_typename( - mgr, "xstring", submit->submit->start_info->execcwd); - job->job.submit->start_info->exechome = create_obj_by_typename( - mgr, "xstring", submit->submit->start_info->exechome); - job->job.submit->start_info->execuser = create_obj_by_typename( - mgr, "xstring", submit->submit->start_info->execuser); - job->job.submit->start_info->launch_type = create_obj_by_typename( - mgr, "xstring", submit->submit->start_info->launch_type); - if (submit->submit->start_info->job_pre_exec != NULL) { - job->job.submit->start_info->job_pre_exec = create_obj_by_typename( - mgr, "xstring", submit->submit->start_info->job_pre_exec); - } - - if (submit->submit->start_info->job_post_exec != NULL) { - job->job.submit->start_info->job_post_exec = create_obj_by_typename( - mgr, "xstring", submit->submit->start_info->job_post_exec); - } - } - - job->job.allocs = NULL; - - if (submit->allocs) { - MOVE_PTR(job->job.allocs, submit->allocs); - } - - job->job.run_usage = NULL; - - if (submit->run_usage != NULL) { - MOVE_PTR(job->job.run_usage, submit->run_usage); - } - - if ((job->job.submit->queue == NULL) || (job->job.submit->user == NULL) - || (job->job.submit->job_name == NULL) - || (job->job.submit->start_info->cmdline == NULL) - || (job->job.submit->project_name == NULL) - || (job->job.submit->job_description == NULL) - || (job->job.submit->resreq == NULL)) { - - FREEUP(job->job.submit->start_info); - - job_obj_killer(job); - - SET_ERROR(ENOMEM); - return NULL; - } - idx = jobmgr_add_job(jobmgr, job); - - obj_init(mgr, type, idx, obj); - - return job; - -clean_job: - job_obj_killer(job); - return NULL; -} - -void job_obj_killer(job_t* job) -{ - myobj_t* obj; - - if (job == NULL) { - return; - } - - 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); - DEREF_OBJ(job->job.submit->project_name); - 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); - if (job->job.pidinfo->exdata != NULL) { - DEREF_OBJ(job->job.pidinfo->exdata); - } - - FREEUP(job->job.pidinfo); - } - - if (job->job.allocs != NULL) { - free_JobAlloc_ptr(&(job->job.allocs)); - } - - if (job->job.run_usage != NULL) { - for (int i = 0; i < job->job.run_usage->num_hosts; i++) { - DEREF_OBJ(job->job.run_usage->host_runusage[i]->host_name); - FREEUP(job->job.run_usage->host_runusage[i]); - } - FREEUP(job->job.run_usage->host_runusage); - FREEUP(job->job.run_usage); - } - - if (job->job.pend_reasons != NULL) { - erase_job_preason(job->job.pend_reasons); - FREEUP(job->job.pend_reasons); - } - - FREEUP(job->job.exit_info); - - memset(obj, 0x0, sizeof(*obj)); - - FREEUP(obj); -} - -static void xjob_fini(void* j) -{ - myobj_t* myobj; - objtype_t* typeval; - job_t* job; - jobmgr_t* jobmgr; - - if (j == NULL) { - return; - } - - job = (job_t*)j; - myobj = TO_MYOBJ(j); - typeval = myobj->type; - jobmgr = &(((cluster_t*)typeval->typedata)->jobmgr); - if (jobmgr == NULL) { - return; - } - - jobmgr_del_job(jobmgr, job); - - return; -} - -static void xjob_type_fini(objtype_t* typeval) { return; } - -int register_types(cluster_t* c) -{ - int i; - - for (i = 0; i < N_EL_ARRAY(types); i++) { - int rc; - - types[i].typedata = c; - rc = objmgr_register(&(c->objmgr), &(types[i])); - if (rc < 0) { - return rc; - } - } - - return 0; -} - -void resval_obj_killer(xce_resval_t* v) { return; } -static void* xres_create(objmgr_t* mgr, objtype_t* type, va_list ap) -{ - resmgr_t* resmgr = &(((cluster_t*)type->typedata)->resmgr); - xce_resource_t* r = va_arg(ap, xce_resource_t*); - xce_resource_t* r1 = NULL; - myobj_t* obj; - int32_t idx; - - xce_use(resmgr); - - if (r == NULL) { - SET_ERROR(EINVAL); - return NULL; - } - - r1 = resmgr_lockres(resmgr, r->name, OBJREF_READ); - if (r1 != NULL) { - SET_ERROR(EEXIST); - obj_deref(r1); - return NULL; - } - - obj = obj_alloc(sizeof(*r)); - if (obj == NULL) { - return NULL; - } - - r1 = MYOBJ_TO_OBJ(xce_resource_t*, obj); - - r1->name = create_obj_by_typename(mgr, "xstring", r->name); - r1->desc = create_obj_by_typename(mgr, "xstring", r->desc); - if ((r1->name == NULL) || (r->desc != NULL && r1->desc == NULL)) { - res_obj_killer(r1); - SET_ERROR(ENOMEM); - return NULL; - } - r1->valtype = r->valtype; - r1->ordtype = r->ordtype; - r1->flags = r->flags; - r1->interval = r->interval; - r1->last_report = r->last_report; - - r1->ndistributions = r->ndistributions; - if (r->distributions) { - MOVE_PTR(r1->distributions, r->distributions); - } - MOVE_PTR(r1->hbased_defined, r->hbased_defined); - idx = resmgr_add_res(resmgr, r1); - - obj_init(mgr, type, idx, obj); - - return r1; -} - -void res_obj_killer(xce_resource_t* r) -{ - myobj_t* obj; - - if (r == NULL) { - return; - } - - obj = TO_MYOBJ(r); - DEREF_OBJ(r->name); - DEREF_OBJ(r->desc); - if (r->hbased_defined) { - if (r->hbased_defined->which == Value_u_svalue) { - free(r->hbased_defined->u.svalue); - } - free(r->hbased_defined); - } - - if (r->distributions != NULL) { - for (int i = 0; i < r->ndistributions; i++) { - if (r->distributions[i] != NULL) { - res_distribution_t* dist = r->distributions[i]; - if (dist->hosts != NULL) { - for (int j = 0; j < dist->nhosts; j++) { - FREEUP(dist->hosts[j]); - } - FREEUP(dist->hosts); - } - if (dist->value != NULL) { - if (dist->value->which == Value_u_svalue) { - FREEUP(dist->value->u.svalue); - } - free(dist->value); - } - FREEUP(dist); - } - } - FREEUP(r->distributions); - } - memset(obj, 0x0, sizeof(*obj)); - FREEUP(obj); -} - -static void xres_fini(void* p) -{ - myobj_t* myobj; - objtype_t* typeval; - xce_resource_t* r; - resmgr_t* resmgr; - - if (p == NULL) { - return; - } - - r = (xce_resource_t*)p; - myobj = TO_MYOBJ(p); - typeval = myobj->type; - resmgr = &(((cluster_t*)typeval->typedata)->resmgr); - if (resmgr == NULL) { - return; - } - - resmgr_del_res(resmgr, r); - - return; -} - -static void xres_type_fini(objtype_t* typeval) { return; } - -void worker_obj_killer(worker_t* w) -{ - myobj_t* obj; - - if (w == NULL) { - return; - } - - obj = TO_MYOBJ(w); - - DEREF_OBJ(w->host.name); - - if ((w->host.thresholds != NULL) && (w->host.nthresholds > 0)) { - free_resource_thresholds(w->host.thresholds, w->host.nthresholds); - w->host.thresholds = NULL; - w->host.nthresholds = 0; - } - - if (w->host.dispatch_window_config != NULL) { - free_timewindow_config(w->host.dispatch_window_config); - w->host.dispatch_window_config = NULL; - } - - if (w->host.attrs != NULL) { - DEREF_OBJ(w->host.attrs->hosttype); - DEREF_OBJ(w->host.attrs->hostmodel); - FREEUP(w->host.attrs); - } - - zarray_fini(&(w->host.resvals)); - - memset(obj, 0x0, sizeof(*obj)); - FREEUP(obj); -} - -static void kill_resval(void* p) -{ - if (p == NULL) { - return; - } - - /* FIXME: improve resval free */ - free(p); -} - -static void* xworker_create(objmgr_t* mgr, objtype_t* typeval, va_list ap) -{ - workermgr_t* workermgr = &(((cluster_t*)typeval->typedata)->workermgr); - worker_t* w = va_arg(ap, worker_t*); - worker_t* w1 = NULL; - myobj_t* obj; - int32_t idx; - - if (w == NULL) { - SET_ERROR(EINVAL); - return NULL; - } - - w1 = workermgr_lock(workermgr, w->host.name, OBJREF_UPDATE); - if (w1 == NULL) { - obj = obj_alloc(sizeof(*w1)); - if (obj == NULL) { - return NULL; - } - - w1 = MYOBJ_TO_OBJ(worker_t*, obj); - memcpy(w1, w, sizeof(*w1)); - w1->host.attrs = (hostattrs_t*)calloc(1, sizeof(hostattrs_t)); - if (w1->host.attrs == NULL) { - free(obj); - - return NULL; - } - - w1->host.name = create_obj_by_typename(mgr, "xstring", w->host.name); - - idx = workermgr_add(workermgr, w1); - obj_init(mgr, typeval, idx, obj); - w1->idx = idx; - - /* gain update lock */ - w1 = obj_ref(w1, OBJREF_UPDATE); - w1->host.attrs->hosttype = NULL; - w1->host.attrs->hostmodel = NULL; - zarray_init(&(w1->host.resvals), 64, kill_resval); - } - - DEREF_OBJ(w1->host.attrs->hosttype); - DEREF_OBJ(w1->host.attrs->hostmodel); - - if (w->host.attrs) { - memcpy(w1->host.attrs, w->host.attrs, sizeof(*(w1->host.attrs))); - - w1->host.attrs->hosttype - = create_obj_by_typename(mgr, "xstring", w->host.attrs->hosttype); - w1->host.attrs->hostmodel - = create_obj_by_typename(mgr, "xstring", w->host.attrs->hostmodel); - } else { - w1->host.attrs->hosttype - = create_obj_by_typename(mgr, "xstring", "Unknown"); - w1->host.attrs->hostmodel - = create_obj_by_typename(mgr, "xstring", "Unknown"); - } - - /* clang-format off */ - if ((w1->host.name == NULL) || - (w1->host.attrs->hosttype == NULL) || - (w1->host.attrs->hostmodel == NULL)) { - /* clang-format on */ - - worker_obj_killer(w1); - SET_ERROR(ENOMEM); - return NULL; - } - - return w1; -} -static void xworker_fini(void* p) -{ - myobj_t* myobj; - objtype_t* typeval; - worker_t* w; - workermgr_t* mgr; - - if (p == NULL) { - return; - } - - w = (worker_t*)p; - myobj = TO_MYOBJ(p); - typeval = myobj->type; - mgr = &(((cluster_t*)typeval->typedata)->workermgr); - - if (mgr == NULL) { - return; - } - - workermgr_del(mgr, w); - return; -} - -static void xworker_type_fini(objtype_t* typeval) { return; } - -void queue_obj_killer(queue_t* q) -{ - myobj_t* obj; - - if (q == NULL) { - return; - } - - obj = TO_MYOBJ(q); - DEREF_OBJ(q->queue.queue); - if (q->queue.thresholds) { - for (int i = 0; i < q->queue.nthresholds; i++) { - if (q->queue.thresholds[i]) { - FREEUP(q->queue.thresholds[i]->name); - free(q->queue.thresholds[i]); - } - } - free(q->queue.thresholds); - } - q->queue.nthresholds = 0; - if (q->queue.runwindow) { - FREEUP(q->queue.runwindow->ranges); - q->queue.runwindow->nsegs = 0; - free(q->queue.runwindow); - } - - if (q->queue.dispatchwindow) { - FREEUP(q->queue.dispatchwindow->ranges); - q->queue.dispatchwindow->nsegs = 0; - free(q->queue.dispatchwindow); - } - DEREF_OBJ(q->queue.pre_exec); - DEREF_OBJ(q->queue.post_exec); - if (q->queue.users) { - DEREF_OBJ(q->queue.users->name); - for (int i = 0; i < q->queue.users->members.count; i++) { - DEREF_OBJ(q->queue.users->members.data[i]); - } - - FREEUP(q->queue.users->members.data); - - for (int i = 0; i < q->queue.users->ex_members.count; i++) { - DEREF_OBJ(q->queue.users->ex_members.data[i]); - } - - FREEUP(q->queue.users->ex_members.data); - - free(q->queue.users); - } - if (q->queue.hosts) { - DEREF_OBJ(q->queue.hosts->name); - for (int i = 0; i < q->queue.hosts->members.count; i++) { - DEREF_OBJ(q->queue.hosts->members.data[i]); - } - - FREEUP(q->queue.hosts->members.data); - - for (int i = 0; i < q->queue.hosts->ex_members.count; i++) { - DEREF_OBJ(q->queue.hosts->ex_members.data[i]); - } - - FREEUP(q->queue.hosts->ex_members.data); - - free(q->queue.hosts); - } - - if (q->queue.runwindow_config != NULL) { - free_timewindow_config(q->queue.runwindow_config); - q->queue.runwindow_config = NULL; - } - - if (q->queue.dispatchwindow_config != NULL) { - free_timewindow_config(q->queue.dispatchwindow_config); - q->queue.dispatchwindow_config = NULL; - } - - memset(obj, 0x0, sizeof(*obj)); - FREEUP(obj); -} - -static void* xqueue_create(objmgr_t* mgr, objtype_t* typeval, va_list ap) -{ - qmgr_t* qmgr = &(((cluster_t*)typeval->typedata)->qmgr); - queue_t* q = va_arg(ap, queue_t*); - queue_t* q1 = NULL; - myobj_t* obj; - int32_t idx; - - if (q == NULL) { - SET_ERROR(EINVAL); - return NULL; - } - - q1 = qmgr_lockq(qmgr, q->queue.queue, OBJREF_READ); - if (q1 != NULL) { - SET_ERROR(EEXIST); - DEREF_OBJ(q1); - - return NULL; - } - - obj = obj_alloc(sizeof(*q1)); - if (obj == NULL) { - SET_ERROR(ENOMEM); - return NULL; - } - - q1 = MYOBJ_TO_OBJ(queue_t*, obj); - q1->queue.queue = create_obj_by_typename(mgr, "xstring", q->queue.queue); - if (q1->queue.queue == NULL) { - queue_obj_killer(q1); - SET_ERROR(ENOMEM); - return NULL; - } - q1->queue.attrs = q->queue.attrs; - q1->queue.status = q->queue.status; - q1->queue.priority = q->queue.priority; - q1->queue.accept_interval = q->queue.accept_interval; - q1->queue.sched_delay = q->queue.sched_delay; - q1->queue.resreq = NULL; - q1->queue.pre_exec = NULL; - q1->queue.post_exec = NULL; - - if (q->queue.resreq != NULL) { - q1->queue.resreq - = create_obj_by_typename(mgr, "xstring", q->queue.resreq); - if (q1->queue.resreq == NULL) { - queue_obj_killer(q1); - SET_ERROR(ENOMEM); - return NULL; - } - } - - if (q->queue.pre_exec != NULL) { - q1->queue.pre_exec - = create_obj_by_typename(mgr, "xstring", q->queue.pre_exec); - if (q1->queue.pre_exec == NULL) { - queue_obj_killer(q1); - SET_ERROR(ENOMEM); - return NULL; - } - } - - if (q->queue.post_exec != NULL) { - q1->queue.post_exec - = create_obj_by_typename(mgr, "xstring", q->queue.post_exec); - if (q1->queue.post_exec == NULL) { - queue_obj_killer(q1); - SET_ERROR(ENOMEM); - return NULL; - } - } - q1->queue.pending_ctrl = q->queue.pending_ctrl; - - q1->queue.nthresholds = 0; - q1->queue.thresholds = NULL; - if ((q->queue.nthresholds > 0) && (q->queue.thresholds != NULL)) { - q1->queue.thresholds = dup_resource_thresholds(q->queue.thresholds, - q->queue.nthresholds); - if (q1->queue.thresholds != NULL) { - q1->queue.nthresholds = q->queue.nthresholds; - } - } - - if (q->queue.users != NULL) { - q1->queue.users - = (xce_group_config_t*)calloc(1, sizeof(xce_group_config_t)); - if (q1->queue.users == NULL) { - queue_obj_killer(q1); - SET_ERROR(ENOMEM); - return NULL; - } - if (q->queue.users->name) { - q1->queue.users->name - = create_obj_by_typename(mgr, "xstring", q->queue.users->name); - } - q1->queue.users->members.count = q->queue.users->members.count; - q1->queue.users->members.data - = (char**)calloc(q1->queue.users->members.count, sizeof(char*)); - if (q1->queue.users->members.data == NULL) { - queue_obj_killer(q1); - SET_ERROR(ENOMEM); - return NULL; - } - for (int i = 0; i < q->queue.users->members.count; i++) { - if (q->queue.users->members.data[i] == NULL) { - continue; - } - q1->queue.users->members.data[i] = create_obj_by_typename( - mgr, "xstring", q->queue.users->members.data[i]); - } - q1->queue.users->ex_members.count = q->queue.users->ex_members.count; - q1->queue.users->ex_members.data - = (char**)calloc(q1->queue.users->ex_members.count, sizeof(char*)); - if (q1->queue.users->ex_members.data == NULL) { - queue_obj_killer(q1); - SET_ERROR(ENOMEM); - return NULL; - } - for (int i = 0; i < q->queue.users->ex_members.count; i++) { - if (q->queue.users->ex_members.data[i] == NULL) { - continue; - } - q1->queue.users->ex_members.data[i] = create_obj_by_typename( - mgr, "xstring", q->queue.users->ex_members.data[i]); - } - } - if (q->queue.hosts != NULL) { - q1->queue.hosts - = (xce_group_config_t*)calloc(1, sizeof(xce_group_config_t)); - if (q1->queue.hosts == NULL) { - queue_obj_killer(q1); - SET_ERROR(ENOMEM); - return NULL; - } - if (q->queue.hosts->name) { - q1->queue.hosts->name - = create_obj_by_typename(mgr, "xstring", q->queue.hosts->name); - } - q1->queue.hosts->members.count = q->queue.hosts->members.count; - q1->queue.hosts->members.data - = (char**)calloc(q1->queue.hosts->members.count, sizeof(char*)); - if (q1->queue.hosts->members.data == NULL) { - queue_obj_killer(q1); - SET_ERROR(ENOMEM); - return NULL; - } - for (int i = 0; i < q->queue.hosts->members.count; i++) { - if (q->queue.hosts->members.data[i] == NULL) { - continue; - } - q1->queue.hosts->members.data[i] = create_obj_by_typename( - mgr, "xstring", q->queue.hosts->members.data[i]); - } - q1->queue.hosts->ex_members.count = q->queue.hosts->ex_members.count; - q1->queue.hosts->ex_members.data - = (char**)calloc(q1->queue.hosts->ex_members.count, sizeof(char*)); - if (q1->queue.hosts->ex_members.data == NULL) { - queue_obj_killer(q1); - SET_ERROR(ENOMEM); - return NULL; - } - for (int i = 0; i < q->queue.hosts->ex_members.count; i++) { - if (q->queue.hosts->ex_members.data[i] == NULL) { - continue; - } - q1->queue.hosts->ex_members.data[i] = create_obj_by_typename( - mgr, "xstring", q->queue.hosts->ex_members.data[i]); - } - } - - q1->queue.runwindow_config = NULL; - if (q->queue.runwindow_config != NULL) { - q1->queue.runwindow_config - = dup_timewindow_config(q->queue.runwindow_config); - } - - q1->queue.dispatchwindow_config = NULL; - if (q->queue.dispatchwindow_config != NULL) { - q1->queue.dispatchwindow_config - = dup_timewindow_config(q->queue.dispatchwindow_config); - } - - /* leave run windows parse & dispatch parse later */ - idx = qmgr_add(qmgr, q1); - obj_init(mgr, typeval, idx, obj); - - return q1; -} -static void xqueue_fini(void* p) -{ - myobj_t* myobj; - objtype_t* typeval; - queue_t* q; - qmgr_t* mgr; - - if (p == NULL) { - return; - } - - q = (queue_t*)p; - myobj = TO_MYOBJ(q); - typeval = myobj->type; - mgr = &(((cluster_t*)typeval->typedata)->qmgr); - - if (mgr == NULL) { - return; - } - - qmgr_delq(mgr, q); - - return; -} -static void xqueue_type_fini(objtype_t* typeval) { return; } - -static void* xresval_create(objmgr_t* mgr, objtype_t* typeval, va_list ap) -{ - return NULL; -} -static void xresval_fini(void* r) { return; } -static void xresval_type_fini(objtype_t* typeval) { return; } - -void config_obj_killer(xce_config_t* c) -{ - myobj_t* obj; - - if (c == NULL) { - return; - } - - obj = TO_MYOBJ(c); - DEREF_OBJ(c->name); - DEREF_OBJ(c->value); - memset(obj, 0x0, sizeof(*obj)); - FREEUP(obj); -} - -static void* xconfig_create(objmgr_t* mgr, objtype_t* typeval, va_list ap) -{ - cluster_t* c = (cluster_t*)typeval->typedata; - xce_config_t* kv = va_arg(ap, xce_config_t*); - myobj_t* obj; - xce_config_t* kv1 = NULL; - kvmgr_t* kvmgr = NULL; - uint32_t idx; - - if (kv == NULL) { - SET_ERROR(EINVAL); - return NULL; - } - - kvmgr = &(c->configmgr); - - kv1 = kvmgr_lock(kvmgr, kv->name, OBJREF_READ); - if (kv1 != NULL) { - SET_ERROR(EEXIST); - DEREF_OBJ(kv1); - - return NULL; - } - - obj = obj_alloc(sizeof(*kv1)); - if (obj == NULL) { - SET_ERROR(ENOMEM); - return NULL; - } - - kv1 = MYOBJ_TO_OBJ(xce_config_t*, obj); - kv1->name = create_obj_by_typename(mgr, "xstring", kv->name); - kv1->value = create_obj_by_typename(mgr, "xstring", kv->value); - if ((kv1->name == NULL) || (kv1->value == NULL)) { - config_obj_killer(kv1); - SET_ERROR(ENOMEM); - return NULL; - } - - idx = kvmgr_add(kvmgr, kv1->name, kv1); - obj_init(mgr, typeval, idx, obj); - - return kv1; -} -static void xconfig_fini(void* p) -{ - myobj_t* myobj; - objtype_t* typeval; - xce_config_t* config; - kvmgr_t* kvmgr; - - if (p == NULL) { - return; - } - - config = (xce_config_t*)p; - myobj = TO_MYOBJ(p); - typeval = myobj->type; - kvmgr = &(((cluster_t*)typeval->typedata)->configmgr); - - kvmgr_del(kvmgr, config->name); - - return; -} -static void xconfig_type_fini(objtype_t* typeval) { return; } - -static void* xgroup_create(objmgr_t* mgr, objtype_t* typeval, va_list ap) -{ - return NULL; -} -static void xgroup_fini(void* g) { return; } -static void xgroup_type_fini(objtype_t* typeval) { return; } - diff --git a/src/include/configobj.h b/src/include/configobj.h index e69de29b..3a4014c1 100644 --- a/src/include/configobj.h +++ b/src/include/configobj.h @@ -0,0 +1,11 @@ +#if !defined(_CONFIGOBJ_H_) + +#define _CONFIGOBJ_H_ 1 + +#include + +#include "xce/types.h" + +extern xce_config_t *makeConfig(xce_config_t *); + +#endif diff --git a/src/include/group.h b/src/include/group.h index 63c9e840..6395c68c 100644 --- a/src/include/group.h +++ b/src/include/group.h @@ -2,6 +2,8 @@ #define _GROUP_H_ 1 +#include + #include "kvmgr.h" #include "xce/types.h" #include "xlist.h" @@ -11,15 +13,16 @@ typedef struct { kvmgr_t groups; } groupmgr_t; -extern int groupmgr_init(groupmgr_t*, int, int); -extern void groupmgr_fini(groupmgr_t*); -extern int groupmgr_add(groupmgr_t*, xce_group_t*); -extern xce_group_t* groupmgr_lock(groupmgr_t*, char*, int); -extern void groupmgr_del(groupmgr_t*, xce_group_t*); -extern int groupmgr_iter(groupmgr_t*, xlist_t*, void*); -extern xce_group_t* build_group(groupmgr_t*, xce_group_config_t*, char*); +extern xce_group_t* makeGroup(var, xce_group_config_t*, char*); +extern int groupmgr_init(var*, int, int); +extern void groupmgr_fini(var); +extern int groupmgr_add(var, xce_group_t*); +extern xce_group_t* groupmgr_lock(var, char*, int); +extern void groupmgr_del(var, xce_group_t*); +extern int groupmgr_iter(var, xlist_t*, void*); +extern xce_group_t* build_group(var, xce_group_config_t*, char*); extern int is_in_group(xce_group_t*, char*); -extern xce_group_t* get_group(groupmgr_t*, char*); +extern xce_group_t* get_group(var, char*); extern int fmt_group(char*, int, xce_group_t*); extern int is_group_all(xce_group_t*); diff --git a/src/include/resobj.h b/src/include/resobj.h index e69de29b..44de94a1 100644 --- a/src/include/resobj.h +++ b/src/include/resobj.h @@ -0,0 +1,11 @@ +#if !defined(_RESOBH_H_) + +#define _RESOBJ_H_ 1 + +#include + +#include "xce/types.h" + +extern xce_resource_t* makeResource(xce_resource_t*); + +#endif diff --git a/src/include/resreq.h b/src/include/resreq.h index eeee2028..5cecfbd4 100644 --- a/src/include/resreq.h +++ b/src/include/resreq.h @@ -127,9 +127,9 @@ extern int parse_resreq_primary(xce_primary_resreq_t*, char*, char**); extern int parse_resreq(xce_resreq_t*, char*, char**); extern void kill_resreq(xce_resreq_t*); extern int format_resreq(char**, xce_resreq_t*); -extern int calc_wanted_global_resvals(xvec_idval_t*, resmgr_t*, xlist_t*, +extern int calc_wanted_global_resvals(xvec_idval_t*, var, xlist_t*, rusage_per_type_t, int, int); -extern int calc_wanted_host_resvals(xvec_idval_t*, resmgr_t*, xlist_t*, +extern int calc_wanted_host_resvals(xvec_idval_t*, var, xlist_t*, rusage_per_type_t, int, int); #endif diff --git a/src/include/xce/cluster_def.h b/src/include/xce/cluster_def.h index e77b8df9..94a0ecf1 100644 --- a/src/include/xce/cluster_def.h +++ b/src/include/xce/cluster_def.h @@ -4,6 +4,7 @@ #include "config.h" #include +#include #include #include "delay.h" @@ -105,11 +106,11 @@ typedef struct { int ncontrollers; delaymgr_t delaymgr; scheduler_t sched; - jobmgr_t jobmgr; - resmgr_t resmgr; - workermgr_t workermgr; - qmgr_t qmgr; - kvmgr_t configmgr; + var jobmgr; + var resmgr; + var workermgr; + var qmgr; + var configmgr; kvmgr_t ugmgr; kvmgr_t hgmgr; vtaskmgr_t vtaskmgr; diff --git a/src/include/xce/types.h b/src/include/xce/types.h index 8611a9e4..a853d645 100644 --- a/src/include/xce/types.h +++ b/src/include/xce/types.h @@ -274,11 +274,11 @@ typedef struct { } xce_res_account_t; typedef struct { - xce_worker_t host; - char hostkey[XCE_MAXKEY_LEN]; - endpoint_t* ep; - int idx; - zarray_t usages; + xce_worker_t* host; + char hostkey[XCE_MAXKEY_LEN]; + endpoint_t* ep; + int idx; + zarray_t usages; } worker_t; typedef struct { @@ -470,7 +470,7 @@ typedef struct { } xce_job_t; typedef struct { - xce_job_t job; + xce_job_t* job; } job_t; typedef struct { @@ -517,7 +517,7 @@ typedef struct { } xce_queue_t; typedef struct { - xce_queue_t queue; + xce_queue_t* queue; } queue_t; typedef struct { diff --git a/src/include/xcelimit.h b/src/include/xcelimit.h index 67e40216..0fa8cfb9 100644 --- a/src/include/xcelimit.h +++ b/src/include/xcelimit.h @@ -2,6 +2,7 @@ #define _XCELIMIT_H_ 1 +#include #include #include #include @@ -17,13 +18,13 @@ extern int build_limit(xce_limit_t**, groupmgr_t*, groupmgr_t*, groupmgr_t*, groupmgr_t*, xce_limit_config_t*); extern int match_limit(xce_limit_t*, int, ...); extern int build_vres_name(char**, xce_limit_t*, char*, char*, char*); -extern int is_host_based_limit(resmgr_t*, xce_limit_t*); +extern int is_host_based_limit(var, xce_limit_t*); extern int fmt_consumer(char*, int, xce_consumer_t*); extern int fmt_limit(char*, int, xce_limit_t*); extern void kill_limit(xce_limit_t*); -extern int instantiate_limit(xce_vres_t**, resmgr_t*, xce_limit_t*, char*, - char*, char*); +extern int instantiate_limit(xce_vres_t**, var, xce_limit_t*, char*, char*, + char*); extern void kill_vres(xce_vres_t*); -extern int add_vres(xce_resource_t**, resmgr_t*, char*, int); +extern int add_vres(xce_resource_t**, var, char*, int); #endif diff --git a/src/lib/configobj.c b/src/lib/configobj.c index 52b84c34..ca77bc4c 100644 --- a/src/lib/configobj.c +++ b/src/lib/configobj.c @@ -4,8 +4,53 @@ #include #include +#include "configobj.h" #include "mylock.h" -#include "qobj.h" #include "utils.h" +#include "xce/types.h" #include "xstring.h" +static size_t xconfig_datasize(va_list ap) +{ + size_t sz = sizeof(xce_config_t); + + return sz; +} + +static int xconfig_init(meta_obj_t* obj, va_list ap) +{ + xce_config_t* dst = RTTI_OBJ_TO_DATA(xce_config_t, obj); + xce_config_t* src = va_arg(ap, xce_config_t*); + + if (src == NULL) { + return -EINVAL; + } + + dst->name = makeString(src->name); + dst->value = makeString(src->value); + + return 1; +} + +static void xconfig_destroy(meta_obj_t* obj) +{ + xce_config_t* c = RTTI_OBJ_TO_DATA(xce_config_t, obj); + + dereference(c->name); + dereference(c->value); +} + +static typeinfo_t xconfig_type = { + .name = "xce config item", + .privateSize = 0, + .dataSize = (datasize_fn_t)xconfig_datasize, + .init = (obj_init_fn_t)xconfig_init, + .destroy = (obj_destroy_fn_t)xconfig_destroy, +}; + +xce_config_t* makeConfig(xce_config_t* c) +{ + xce_config_t* c1 = makeInstance(&xconfig_type, c); + + return c1; +} diff --git a/src/lib/group.c b/src/lib/group.c index 206503af..79376759 100644 --- a/src/lib/group.c +++ b/src/lib/group.c @@ -1,4 +1,5 @@ #include +#include #include #include @@ -7,6 +8,11 @@ #include "objmgr.h" #include "utils.h" #include "xce/types.h" +#include "xstring.h" + +typedef struct { + +} group_private_t; static void group_killer(xce_group_t* g) { @@ -20,7 +26,7 @@ static void group_killer(xce_group_t* g) xce_g_member_t* m = (xce_g_member_t*)xlist_get(&(g->members), i); if (!m->is_group) { - FREEUP(m->u.name); + dereference(m->u.name); } FREEUP(m); } @@ -29,7 +35,7 @@ static void group_killer(xce_group_t* g) xce_g_member_t* m = (xce_g_member_t*)xlist_get(&(g->ex_members), i); if (!m->is_group) { - FREEUP(m->u.name); + dereference(m->u.name); } FREEUP(m); } @@ -45,76 +51,10 @@ static void group_killer(xce_group_t* g) xlist_fini(&(g->ex_members)); xlist_fini(&(g->affecteds)); - FREEUP(g->name); - FREEUP(g); + dereference(g->name); } -int groupmgr_init(groupmgr_t* mgr, int nslots, int delta) -{ - int rc = 0; - xce_group_config_t all = { .name = "all" }; - xce_group_config_t empty = { .name = "empty" }; - xce_group_t* g = NULL; - - memset(mgr, 0x0, sizeof(*mgr)); - - rc = kvmgr_init(&(mgr->groups), string_hash_key, nslots, delta, - (zarray_item_killer_t)group_killer); - - if (rc < 0) { - return rc; - } - - /* create builtin all group */ - g = build_group(mgr, &all, NULL); - if (g == NULL) { - return -ENOMEM; - } - - /* create builtin empty group */ - g = build_group(mgr, &empty, NULL); - if (g == NULL) { - return -ENOMEM; - } - - return 1; -} - -void groupmgr_fini(groupmgr_t* mgr) { kvmgr_fini(&(mgr->groups)); } - -int groupmgr_add(groupmgr_t* mgr, xce_group_t* g) -{ - return kvmgr_add(&(mgr->groups), (void*)g->name, g); -} - -xce_group_t* groupmgr_lock(groupmgr_t* mgr, char* name, int op) -{ - return (xce_group_t*)kvmgr_lock(&(mgr->groups), (void*)name, op); -} - -void groupmgr_del(groupmgr_t* mgr, xce_group_t* g) -{ - kvmgr_del(&(mgr->groups), (void*)g->name); -} - -int groupmgr_iter(groupmgr_t* mgr, xlist_t* l, void* arg) -{ - return kvmgr_iter(&(mgr->groups), NULL, l, arg); -} - -xce_group_t* get_group(groupmgr_t* mgr, char* name) -{ - xce_group_t* g = NULL; - - if ((mgr == NULL) || (name == NULL)) { - return NULL; - } - - g = groupmgr_lock(mgr, name, OBJREF_NOP); - return g; -} - -xce_g_member_t* make_g_member(groupmgr_t* mgr, char* name) +xce_g_member_t* make_g_member(var mgr, char* name) { xce_g_member_t* m = NULL; xce_group_t* g = NULL; @@ -135,7 +75,7 @@ xce_g_member_t* make_g_member(groupmgr_t* mgr, char* name) m->u.g = g; } else { m->is_group = 0; - m->u.name = strdup(name); + m->u.name = makeString(name); } return m; @@ -162,6 +102,238 @@ static int update_group_dirty(xce_group_t* g) return count; } +static int init_group_by_config(xce_group_t* g, var mgr, + xce_group_config_t* g_config) +{ + int i; + + for (i = 0; i < g_config->members.count; i++) { + char* g_name = g_config->members.data[i]; + xce_g_member_t* m = make_g_member(mgr, g_name); + + if (m == NULL) { + continue; + } + + xlist_store(&(g->members), m); + if (m->is_group) { + xlist_store(&(m->u.g->affecteds), g); + } + } + + for (i = 0; i < g_config->ex_members.count; i++) { + char* g_name = g_config->ex_members.data[i]; + xce_g_member_t* m = make_g_member(mgr, g_name); + + if (m == NULL) { + continue; + } + + xlist_store(&(g->ex_members), m); + if (m->is_group) { + xlist_store(&(m->u.g->affecteds), g); + } + } + + return 0; +} + +static size_t group_datasize(va_list ap) +{ + size_t sz = sizeof(xce_group_t); + + return sz; +} + +static int group_init(meta_obj_t* obj, va_list ap) +{ + xce_group_t* g = RTTI_OBJ_TO_DATA(xce_group_t, obj); + var mgr = va_arg(ap, var); + xce_group_config_t* config = va_arg(ap, xce_group_config_t*); + char* g_name = va_arg(ap, char*); + int rc; + + if ((mgr == NULL) || (config == NULL)) { + return -EINVAL; + } + + rc = key_add(mgr, (void*)g_name, (void*)g); + if (rc < 0) { + return rc; + } + + xlist_init(&(g->affecteds), 4); + xlist_init(&(g->members), 4); + xlist_init(&(g->ex_members), 4); + + g->name = makeString(g_name); + g->dirty = 0; + + init_group_by_config(g, mgr, config); + + return 1; +} + +static void group_destroy(meta_obj_t* obj) +{ + xce_group_t* g = RTTI_OBJ_TO_DATA(xce_group_t, obj); + + group_killer(g); +} + +static typeinfo_t group_type = { .name = "group", + .privateSize = sizeof(group_private_t), + .dataSize = (datasize_fn_t)group_datasize, + .init = (obj_init_fn_t)group_init, + .destroy = (obj_destroy_fn_t)group_destroy, + .interfaces = {} }; + +xce_group_t* makeGroup(var mgr, xce_group_config_t* config, + char* default_g_name) +{ + xce_group_t* g = NULL; + char* g_name = NULL; + int rc = 0; + + if ((mgr == NULL) || (config == NULL)) { + errno = EINVAL; + + return NULL; + } + + g_name = config->name; + if ((g_name == NULL) || (strlen(g_name) == 0)) { + g_name = default_g_name; + } + + if (g_name == NULL) { + errno = EINVAL; + return NULL; + } + + rc = key_find(mgr, (void*)g_name, (void**)&g); + if ((rc < 0) && (rc != -ENOENT)) { + errno = -rc; + return NULL; + } + + if (g != NULL) { + int i; + + for (i = 0; i < g->members.count; i++) { + xce_g_member_t* m = (xce_g_member_t*)xlist_get(&(g->members), i); + if (m == NULL) { + continue; + } + if (m->is_group == 0) { + FREEUP(m->u.name); + } + + FREEUP(m); + } + g->members.count = 0; + + for (i = 0; i < g->ex_members.count; i++) { + xce_g_member_t* m = (xce_g_member_t*)xlist_get(&(g->ex_members), i); + if (m == NULL) { + continue; + } + if (m->is_group == 0) { + FREEUP(m->u.name); + } + + FREEUP(m); + } + g->ex_members.count = 0; + g->dirty = 1; + + init_group_by_config(g, mgr, config); + + return g; + } + + g = makeInstance(&group_type, mgr, config, g_name); + + return g; +} + +int groupmgr_init(var* mgr, int nslots, int delta) +{ + xce_group_config_t all = { .name = "all" }; + xce_group_config_t empty = { .name = "empty" }; + xce_group_t* g = NULL; + kvmgr_params_t params = { .key_type = KVMGR_KEY_STRING, + .dynamic = 1, + .nslots = nslots, + .delta = delta, + .datakiller = destroy }; + + *mgr = makeInstance(&xkvmgr_type, ¶ms); + if ((*mgr) == NULL) { + return -errno; + } + + /* create builtin all group */ + g = makeGroup(*mgr, &all, NULL); + if (g == NULL) { + return -errno; + } + + /* create builtin empty group */ + g = makeGroup(*mgr, &empty, NULL); + if (g == NULL) { + return -ENOMEM; + } + + return 1; +} + +int groupmgr_add(var mgr, xce_group_t* g) +{ + int rc = 0; + + rc = key_add(mgr, (void*)g->name, (void*)g); + + return rc; +} + +xce_group_t* groupmgr_lock(var mgr, char* name, int op) +{ + int rc; + xce_group_t* g = NULL; + + rc = key_find(mgr, (void*)name, (void**)&g); + if (rc <= 0) { + return NULL; + } + + return g; +} + +void groupmgr_del(var mgr, xce_group_t* g) +{ + key_del(mgr, (void*)g->name); + + return; +} + +xce_group_t* get_group(var mgr, char* name) +{ + xce_group_t* g = NULL; + int rc = 0; + + if ((mgr == NULL) || (name == NULL)) { + return NULL; + } + + rc = key_find(mgr, (void*)name, (void**)&g); + if (rc <= 0) { + return NULL; + } + + return g; +} + int fmt_group(char* buf, int len, xce_group_t* g) { int i, pos; @@ -210,7 +382,7 @@ int fmt_group(char* buf, int len, xce_group_t* g) return strlen(buf); } -xce_group_t* build_group(groupmgr_t* mgr, xce_group_config_t* g_config, +xce_group_t* build_group(var mgr, xce_group_config_t* g_config, char* default_group_name) { xce_group_t* g = NULL; @@ -268,7 +440,7 @@ xce_group_t* build_group(groupmgr_t* mgr, xce_group_config_t* g_config, xlist_init(&(g->affecteds), 4); xlist_init(&(g->members), 4); xlist_init(&(g->ex_members), 4); - g->name = strdup(g_name); + g->name = makeString(g_name); g->dirty = 0; } diff --git a/src/lib/kvmgr.c b/src/lib/kvmgr.c index 76d2f591..618b0513 100644 --- a/src/lib/kvmgr.c +++ b/src/lib/kvmgr.c @@ -238,164 +238,6 @@ int kvmgr_iter(kvmgr_t* mgr, zarray_iter_skip_fn_t skipfn, xlist_t* l, return rc; } -int resmgr_init(resmgr_t* mgr, int nslots, int delta, - zarray_item_killer_t killer) -{ - int rc = 0; - - rc = kvmgr_init(&(mgr->resdef), string_hash_key, nslots, delta, killer); - if (rc < 0) { - return rc; - } - - mgr->nshared = 0; - mgr->nunshared = 0; - - return 0; -} - -void resmgr_fini(resmgr_t* mgr) -{ - kvmgr_fini(&(mgr->resdef)); - mgr->nshared = 0; - mgr->nunshared = 0; -} - -int32_t resmgr_add_res(resmgr_t* mgr, xce_resource_t* res) -{ - int rc = 0; - - rc = kvmgr_add(&(mgr->resdef), (void*)res->name, (void*)res); - if (rc < 0) { - return rc; - } - - if (res->flags & XCE_RESF_SHARED) { - res->idx = mgr->nshared; - mgr->nshared++; - } else { - res->idx = mgr->nunshared; - mgr->nunshared++; - } - - return rc; -} - -xce_resource_t* resmgr_lockres(resmgr_t* mgr, char* resname, int op) -{ - xce_resource_t* r = NULL; - r = (xce_resource_t*)kvmgr_lock(&(mgr->resdef), (void*)resname, op); - - return r; -} - -xce_resource_t* resmgr_lock_byid(resmgr_t* mgr, int idx, int op) -{ - xce_resource_t* r = NULL; - - r = (xce_resource_t*)kvmgr_lock_byid(&(mgr->resdef), idx, op); - - return r; -} - -void resmgr_del_res(resmgr_t* mgr, xce_resource_t* r) -{ - kvmgr_del(&(mgr->resdef), (void*)r->name); -} - -int resmgr_iter(resmgr_t* mgr, xlist_t* l, void* arg) -{ - return kvmgr_iter(&(mgr->resdef), NULL, l, arg); -} - -int qmgr_init(qmgr_t* mgr, int nslots, int delta, zarray_item_killer_t killer) -{ - return kvmgr_init(&(mgr->queues), string_hash_key, nslots, delta, killer); -} - -void qmgr_fini(qmgr_t* mgr) { kvmgr_fini(&(mgr->queues)); } - -int qmgr_add(qmgr_t* mgr, queue_t* q) -{ - return kvmgr_add(&(mgr->queues), (void*)q->queue.queue, q); -} - -queue_t* qmgr_lockq(qmgr_t* mgr, char* name, int op) -{ - return (queue_t*)kvmgr_lock(&(mgr->queues), (void*)name, op); -} - -void qmgr_delq(qmgr_t* mgr, queue_t* q) -{ - kvmgr_del(&(mgr->queues), (void*)q->queue.queue); -} - -int qmgr_iter(qmgr_t* mgr, xlist_t* l, void* arg) -{ - return kvmgr_iter(&(mgr->queues), NULL, l, arg); -} - -int workermgr_init(workermgr_t* mgr, int nslots, int delta, - zarray_item_killer_t killer) -{ - return kvmgr_init(&(mgr->workers), string_hash_key, nslots, delta, killer); -} - -void workermgr_fini(workermgr_t* mgr) { kvmgr_fini(&(mgr->workers)); } - -int workermgr_add(workermgr_t* mgr, worker_t* w) -{ - return kvmgr_add(&(mgr->workers), (void*)w->host.name, w); -} - -worker_t* workermgr_lock(workermgr_t* mgr, char* name, int op) -{ - return (worker_t*)kvmgr_lock(&(mgr->workers), (void*)name, op); -} - -worker_t* workermgr_lock_byid(workermgr_t* mgr, int idx, int op) -{ - return (worker_t*)kvmgr_lock_byid(&(mgr->workers), idx, op); -} - -void workermgr_del(workermgr_t* mgr, worker_t* w) -{ - kvmgr_del(&(mgr->workers), (void*)w->host.name); -} - -int workermgr_iter(workermgr_t* mgr, xlist_t* l, void* arg) -{ - return kvmgr_iter(&(mgr->workers), NULL, l, arg); -} - -int jobmgr_init(jobmgr_t* mgr, int nslots, int delta, - zarray_item_killer_t killer) -{ - return kvmgr_init(&(mgr->jobs), int_hash_key, nslots, delta, killer); -} - -void jobmgr_fini(jobmgr_t* mgr) { kvmgr_fini(&(mgr->jobs)); } - -int jobmgr_add_job(jobmgr_t* mgr, job_t* j) -{ - return kvmgr_add(&(mgr->jobs), (void*)j->job.jobid, j); -} - -job_t* jobmgr_lockjob(jobmgr_t* mgr, uint64_t jobid, int op) -{ - return (job_t*)kvmgr_lock(&(mgr->jobs), (void*)jobid, op); -} - -void jobmgr_del_job(jobmgr_t* mgr, job_t* j) -{ - kvmgr_del(&(mgr->jobs), (void*)j->job.jobid); -} - -int jobmgr_iter(jobmgr_t* mgr, xlist_t* l, void* arg) -{ - return kvmgr_iter(&(mgr->jobs), NULL, l, arg); -} - typedef struct { my_rwlock_t lock; } xkvmgr_private_t; diff --git a/src/lib/resreq.c b/src/lib/resreq.c index 39e50d42..fbbacd89 100644 --- a/src/lib/resreq.c +++ b/src/lib/resreq.c @@ -435,7 +435,7 @@ int format_resreq(char** buf, xce_resreq_t* resreq) return rc; } -int calc_wanted_global_resvals(xvec_idval_t* resvals, resmgr_t* resmgr, +int calc_wanted_global_resvals(xvec_idval_t* resvals, var resmgr, xlist_t* rusages, rusage_per_type_t perflag, int nhosts, int nslots) { @@ -446,12 +446,17 @@ int calc_wanted_global_resvals(xvec_idval_t* resvals, resmgr_t* resmgr, xce_resource_t* r = NULL; float val; rusage_per_type_t perflag1; + int rc = 0; if (v == NULL) { continue; } - r = resmgr_lockres(resmgr, v->res, OBJREF_NOP); + rc = key_find(resmgr, (void*)v->res, (void**)&r); + if (rc <= 0) { + continue; + } + if (r == NULL) { continue; } @@ -486,7 +491,7 @@ int calc_wanted_global_resvals(xvec_idval_t* resvals, resmgr_t* resmgr, return 0; } -int calc_wanted_host_resvals(xvec_idval_t* resvals, resmgr_t* resmgr, +int calc_wanted_host_resvals(xvec_idval_t* resvals, var resmgr, xlist_t* rusages, rusage_per_type_t perflag, int nhosts, int nslots) { @@ -497,12 +502,17 @@ int calc_wanted_host_resvals(xvec_idval_t* resvals, resmgr_t* resmgr, xce_resource_t* r = NULL; float val; rusage_per_type_t perflag1; + int rc = 0; if (v == NULL) { continue; } - r = resmgr_lockres(resmgr, v->res, OBJREF_NOP); + rc = key_find(resmgr, (void*)v->res, (void**)&r); + if (rc <= 0) { + continue; + } + if (r == NULL) { continue; } diff --git a/src/lib/testsuite/test_group.c b/src/lib/testsuite/test_group.c index e935ad24..0943835a 100644 --- a/src/lib/testsuite/test_group.c +++ b/src/lib/testsuite/test_group.c @@ -5,16 +5,17 @@ #include "group.h" #include "utils.h" +#include "xstring.h" static void test_all(void) { - groupmgr_t mgr; + var mgr; xce_group_t* all = NULL; int rc = 0; groupmgr_init(&mgr, 16, 16); - all = get_group(&mgr, "all"); + all = get_group(mgr, "all"); TEST_ASSERT_TRUE(all != NULL); @@ -22,18 +23,18 @@ static void test_all(void) TEST_ASSERT_TRUE(rc > 0); - groupmgr_fini(&mgr); + destroy(mgr); } static void test_empty(void) { - groupmgr_t mgr; + var mgr; xce_group_t* empty = NULL; int rc = 0; groupmgr_init(&mgr, 16, 16); - empty = get_group(&mgr, "empty"); + empty = get_group(mgr, "empty"); TEST_ASSERT_TRUE(empty != NULL); @@ -41,12 +42,12 @@ static void test_empty(void) TEST_ASSERT_TRUE(rc == 0); - groupmgr_fini(&mgr); + destroy(mgr); } static void test_all_1(void) { - groupmgr_t mgr; + var mgr; xce_group_config_t gdata = { .name = "g1", .members = { .count = 1, .data = (char*[]) { "all" } } @@ -57,7 +58,7 @@ static void test_all_1(void) groupmgr_init(&mgr, 16, 16); - g = build_group(&mgr, &gdata, NULL); + g = makeGroup(mgr, &gdata, NULL); TEST_ASSERT_TRUE(g != NULL); @@ -65,12 +66,12 @@ static void test_all_1(void) TEST_ASSERT_TRUE(rc > 0); - groupmgr_fini(&mgr); + destroy(mgr); } static void test_all_2(void) { - groupmgr_t mgr; + var mgr; xce_group_config_t gdata = { .name = "g1", .members = { .count = 2, .data = (char*[]) { "g2", "all" } } @@ -81,7 +82,7 @@ static void test_all_2(void) groupmgr_init(&mgr, 16, 16); - g = build_group(&mgr, &gdata, NULL); + g = makeGroup(mgr, &gdata, NULL); TEST_ASSERT_TRUE(g != NULL); @@ -89,12 +90,12 @@ static void test_all_2(void) TEST_ASSERT_TRUE(rc > 0); - groupmgr_fini(&mgr); + destroy(mgr); } static void test_empty_1(void) { - groupmgr_t mgr; + var mgr; xce_group_config_t gdata = { .name = "g1", .ex_members = { .count = 1, .data = (char*[]) { "all" } } @@ -105,7 +106,7 @@ static void test_empty_1(void) groupmgr_init(&mgr, 16, 16); - g = build_group(&mgr, &gdata, NULL); + g = makeGroup(mgr, &gdata, NULL); TEST_ASSERT_TRUE(g != NULL); @@ -113,12 +114,12 @@ static void test_empty_1(void) TEST_ASSERT_TRUE(rc == 0); - groupmgr_fini(&mgr); + destroy(mgr); } static void test_empty_2(void) { - groupmgr_t mgr; + var mgr; xce_group_config_t gdata = { .name = "g1", .members = { .count = 1, .data = (char*[]) { "empty" } } @@ -129,7 +130,7 @@ static void test_empty_2(void) groupmgr_init(&mgr, 16, 16); - g = build_group(&mgr, &gdata, NULL); + g = makeGroup(mgr, &gdata, NULL); TEST_ASSERT_TRUE(g != NULL); @@ -137,12 +138,12 @@ static void test_empty_2(void) TEST_ASSERT_TRUE(rc == 0); - groupmgr_fini(&mgr); + destroy(mgr); } static void test_include(void) { - groupmgr_t mgr; + var mgr; xce_group_config_t gdata = { .name = "g1", .members = { .count = 1, .data = (char*[]) { "rshen" } } @@ -153,7 +154,7 @@ static void test_include(void) groupmgr_init(&mgr, 16, 16); - g = build_group(&mgr, &gdata, NULL); + g = makeGroup(mgr, &gdata, NULL); TEST_ASSERT_TRUE(g != NULL); @@ -161,12 +162,12 @@ static void test_include(void) TEST_ASSERT_TRUE(rc > 0); - groupmgr_fini(&mgr); + destroy(mgr); } static void test_exclude(void) { - groupmgr_t mgr; + var mgr; xce_group_config_t gdata = { .name = "g1", .members = { .count = 1, .data = (char*[]) { "all" } }, @@ -178,7 +179,7 @@ static void test_exclude(void) groupmgr_init(&mgr, 16, 16); - g = build_group(&mgr, &gdata, NULL); + g = makeGroup(mgr, &gdata, NULL); TEST_ASSERT_TRUE(g != NULL); @@ -186,12 +187,12 @@ static void test_exclude(void) TEST_ASSERT_TRUE(rc == 0); - groupmgr_fini(&mgr); + destroy(mgr); } static void test_nest(void) { - groupmgr_t mgr; + var mgr; xce_group_config_t gdata1 = { .name = "g1", .members = { .count = 1, .data = (char*[]) { "rshen" } } @@ -206,11 +207,11 @@ static void test_nest(void) groupmgr_init(&mgr, 16, 16); - g = build_group(&mgr, &gdata1, NULL); + g = makeGroup(mgr, &gdata1, NULL); TEST_ASSERT_TRUE(g != NULL); - g = build_group(&mgr, &gdata2, NULL); + g = makeGroup(mgr, &gdata2, NULL); TEST_ASSERT_TRUE(g != NULL); @@ -218,12 +219,12 @@ static void test_nest(void) TEST_ASSERT_TRUE(rc != 0); - groupmgr_fini(&mgr); + destroy(mgr); } static void test_nest2(void) { - groupmgr_t mgr; + var mgr; xce_group_config_t gdata1 = { .name = "g1", .members = { .count = 1, .data = (char*[]) { "rshen" } } @@ -239,11 +240,11 @@ static void test_nest2(void) groupmgr_init(&mgr, 16, 16); - g = build_group(&mgr, &gdata1, NULL); + g = makeGroup(mgr, &gdata1, NULL); TEST_ASSERT_TRUE(g != NULL); - g = build_group(&mgr, &gdata2, NULL); + g = makeGroup(mgr, &gdata2, NULL); TEST_ASSERT_TRUE(g != NULL); @@ -251,13 +252,15 @@ static void test_nest2(void) TEST_ASSERT_TRUE(rc == 0); - groupmgr_fini(&mgr); + destroy(mgr); } void test_group(void) { printf("\n>> group test\n\n"); + xstring_table_init(139); + RUN_TEST(test_all); RUN_TEST(test_empty); RUN_TEST(test_all_1); @@ -268,4 +271,6 @@ void test_group(void) RUN_TEST(test_exclude); RUN_TEST(test_nest); RUN_TEST(test_nest2); + + xstring_table_fini(); } diff --git a/src/lib/testsuite/test_limit.c b/src/lib/testsuite/test_limit.c index e0983b4b..0238f25a 100644 --- a/src/lib/testsuite/test_limit.c +++ b/src/lib/testsuite/test_limit.c @@ -1,3 +1,4 @@ +#include #include #include #include @@ -6,11 +7,12 @@ #include "group.h" #include "xce/types.h" #include "xcelimit.h" +#include "xstring.h" static void test_build_consumer1(void) { xce_consumer_t* c = NULL; - groupmgr_t mgr; + var mgr; xce_group_config_t gdata = { .members = { .count = 2, .data = (char*[]) { "rshen", "jsxing" } } }; @@ -18,7 +20,7 @@ static void test_build_consumer1(void) char buf[1024]; groupmgr_init(&mgr, 4, 4); - rc = build_consumer(&c, &mgr, CONSUMER_USER, 1, &gdata, "user_group1"); + rc = build_consumer(&c, mgr, CONSUMER_USER, 1, &gdata, "user_group1"); TEST_ASSERT_TRUE(rc == 1); @@ -29,14 +31,15 @@ static void test_build_consumer1(void) kill_consumer(c); - groupmgr_fini(&mgr); + destroy(mgr); + return; } static void test_build_consumer2(void) { xce_consumer_t* c = NULL; - groupmgr_t mgr; + var mgr; xce_group_config_t gdata = { .members = { .count = 1, .data = (char*[]) { "all" } }, .ex_members = { .count = 2, .data = (char*[]) { "rshen", "jsxing" } } @@ -45,7 +48,7 @@ static void test_build_consumer2(void) char buf[1024]; groupmgr_init(&mgr, 4, 4); - rc = build_consumer(&c, &mgr, CONSUMER_USER, 1, &gdata, "user_group1"); + rc = build_consumer(&c, mgr, CONSUMER_USER, 1, &gdata, "user_group1"); TEST_ASSERT_TRUE(rc == 1); @@ -57,13 +60,17 @@ static void test_build_consumer2(void) kill_consumer(c); - groupmgr_fini(&mgr); + destroy(mgr); + return; } static void test_build_limit_ok1(void) { - groupmgr_t umgr, qmgr, hmgr, pmgr; + var umgr; + var qmgr; + var hmgr; + var pmgr; xce_limit_t* limit; int rc; xce_limit_config_t limit_config = { @@ -88,7 +95,7 @@ static void test_build_limit_ok1(void) groupmgr_init(&hmgr, 4, 4); groupmgr_init(&pmgr, 4, 4); - rc = build_limit(&limit, &umgr, &qmgr, &hmgr, &pmgr, &limit_config); + rc = build_limit(&limit, umgr, qmgr, hmgr, pmgr, &limit_config); TEST_ASSERT_TRUE(rc == 1); memset(buf, 0x0, sizeof(buf)); @@ -100,15 +107,18 @@ static void test_build_limit_ok1(void) kill_limit(limit); - groupmgr_fini(&pmgr); - groupmgr_fini(&hmgr); - groupmgr_fini(&qmgr); - groupmgr_fini(&umgr); + destroy(pmgr); + destroy(hmgr); + destroy(qmgr); + destroy(umgr); } static void test_match_limit_ok1(void) { - groupmgr_t umgr, qmgr, hmgr, pmgr; + var umgr; + var qmgr; + var hmgr; + var pmgr; xce_limit_t* limit; int rc; xce_limit_config_t limit_config = { @@ -137,7 +147,7 @@ static void test_match_limit_ok1(void) groupmgr_init(&hmgr, 4, 4); groupmgr_init(&pmgr, 4, 4); - rc = build_limit(&limit, &umgr, &qmgr, &hmgr, &pmgr, &limit_config); + rc = build_limit(&limit, umgr, qmgr, hmgr, pmgr, &limit_config); TEST_ASSERT_TRUE(rc == 1); memset(buf, 0x0, sizeof(buf)); @@ -152,15 +162,18 @@ static void test_match_limit_ok1(void) kill_limit(limit); - groupmgr_fini(&pmgr); - groupmgr_fini(&hmgr); - groupmgr_fini(&qmgr); - groupmgr_fini(&umgr); + destroy(pmgr); + destroy(hmgr); + destroy(qmgr); + destroy(umgr); } static void test_match_limit_ok2(void) { - groupmgr_t umgr, qmgr, hmgr, pmgr; + var umgr; + var qmgr; + var hmgr; + var pmgr; xce_limit_t* limit; int rc; xce_limit_config_t limit_config = { @@ -183,7 +196,7 @@ static void test_match_limit_ok2(void) groupmgr_init(&hmgr, 4, 4); groupmgr_init(&pmgr, 4, 4); - rc = build_limit(&limit, &umgr, &qmgr, &hmgr, &pmgr, &limit_config); + rc = build_limit(&limit, umgr, qmgr, hmgr, pmgr, &limit_config); TEST_ASSERT_TRUE(rc == 1); memset(buf, 0x0, sizeof(buf)); @@ -198,15 +211,18 @@ static void test_match_limit_ok2(void) kill_limit(limit); - groupmgr_fini(&pmgr); - groupmgr_fini(&hmgr); - groupmgr_fini(&qmgr); - groupmgr_fini(&umgr); + destroy(pmgr); + destroy(hmgr); + destroy(qmgr); + destroy(umgr); } static void test_match_limit1(void) { - groupmgr_t umgr, qmgr, hmgr, pmgr; + var umgr; + var qmgr; + var hmgr; + var pmgr; xce_limit_t* limit; int rc; xce_limit_config_t limit_config = { @@ -238,7 +254,7 @@ static void test_match_limit1(void) groupmgr_init(&hmgr, 4, 4); groupmgr_init(&pmgr, 4, 4); - rc = build_limit(&limit, &umgr, &qmgr, &hmgr, &pmgr, &limit_config); + rc = build_limit(&limit, umgr, qmgr, hmgr, pmgr, &limit_config); TEST_ASSERT_TRUE(rc == 1); memset(buf, 0x0, sizeof(buf)); @@ -253,15 +269,18 @@ static void test_match_limit1(void) kill_limit(limit); - groupmgr_fini(&pmgr); - groupmgr_fini(&hmgr); - groupmgr_fini(&qmgr); - groupmgr_fini(&umgr); + destroy(pmgr); + destroy(hmgr); + destroy(qmgr); + destroy(umgr); } static void test_match_limit2(void) { - groupmgr_t umgr, qmgr, hmgr, pmgr; + var umgr; + var qmgr; + var hmgr; + var pmgr; xce_limit_t* limit; int rc; xce_limit_config_t limit_config = { @@ -289,7 +308,7 @@ static void test_match_limit2(void) groupmgr_init(&hmgr, 4, 4); groupmgr_init(&pmgr, 4, 4); - rc = build_limit(&limit, &umgr, &qmgr, &hmgr, &pmgr, &limit_config); + rc = build_limit(&limit, umgr, qmgr, hmgr, pmgr, &limit_config); TEST_ASSERT_TRUE(rc == 1); memset(buf, 0x0, sizeof(buf)); @@ -304,15 +323,18 @@ static void test_match_limit2(void) kill_limit(limit); - groupmgr_fini(&pmgr); - groupmgr_fini(&hmgr); - groupmgr_fini(&qmgr); - groupmgr_fini(&umgr); + destroy(pmgr); + destroy(hmgr); + destroy(qmgr); + destroy(umgr); } void test_limit(void) { printf("\n>> limit test\n\n"); + + xstring_table_init(139); + RUN_TEST(test_build_consumer1); RUN_TEST(test_build_consumer2); RUN_TEST(test_build_limit_ok1); @@ -320,5 +342,6 @@ void test_limit(void) RUN_TEST(test_match_limit_ok2); RUN_TEST(test_match_limit1); RUN_TEST(test_match_limit2); -} + xstring_table_fini(); +} diff --git a/src/lib/xcelimit.c b/src/lib/xcelimit.c index 2b0c5d8b..c50355f4 100644 --- a/src/lib/xcelimit.c +++ b/src/lib/xcelimit.c @@ -1,4 +1,5 @@ #include +#include #include #include #include @@ -104,12 +105,11 @@ int build_consumer(xce_consumer_t** pconsumer, groupmgr_t* mgr, sprintf(consumer_group_name, "%s-%s-group", default_name_prefix, suffix); default_g_name = consumer_group_name; - } - else { + } else { default_g_name = g_config->name; } - g = build_group(mgr, g_config, default_g_name); + g = makeGroup(mgr, g_config, default_g_name); if (g == NULL) { return -ENOMEM; } @@ -369,16 +369,21 @@ int build_vres_name(char** vname, xce_limit_t* limit, char* user, char* queue, return -ENOMEM; } -int is_host_based_limit(resmgr_t* mgr, xce_limit_t* limit) +int is_host_based_limit(var resmgr, xce_limit_t* limit) { - xce_consumer_t* c = NULL; - xce_resource_t* r = NULL; + int rc = 0; + xce_consumer_t* c = NULL; + xce_resource_t* r = NULL; if (limit == NULL) { return -EINVAL; } - r = resmgr_lockres(mgr, limit->val.resname, OBJREF_NOP); + rc = key_find(resmgr, (void*)limit->val.resname, (void**)&r); + if (rc <= 0) { + return -ENOENT; + } + if ((r->flags & (XCE_RESF_GLOBAL | XCE_RESF_SHARED)) == 0) { if (limit->val.percent != 0) { return 1; @@ -393,7 +398,7 @@ int is_host_based_limit(resmgr_t* mgr, xce_limit_t* limit) return c->per_consumer; } -int add_vres(xce_resource_t** pvres, resmgr_t* mgr, char* name, int global) +int add_vres(xce_resource_t** pvres, var resmgr, char* name, int global) { xce_resource_t* vres = NULL; int rc; @@ -417,7 +422,7 @@ int add_vres(xce_resource_t** pvres, resmgr_t* mgr, char* name, int global) vres->flags |= XCE_RESF_DEFAULT_HOST; } - rc = resmgr_add_res(mgr, vres); + rc = key_add(resmgr, (void*)vres->name, (void*)vres); if (rc < 0) { return rc; } @@ -426,7 +431,7 @@ int add_vres(xce_resource_t** pvres, resmgr_t* mgr, char* name, int global) return rc; } -int instantiate_limit(xce_vres_t** pvres, resmgr_t* mgr, xce_limit_t* limit, +int instantiate_limit(xce_vres_t** pvres, var resmgr, xce_limit_t* limit, char* user, char* queue, char* project) { xce_vres_t* vres = NULL; @@ -434,7 +439,7 @@ int instantiate_limit(xce_vres_t** pvres, resmgr_t* mgr, xce_limit_t* limit, char* vresname = NULL; int shared = 1; - if ((pvres == NULL) || (mgr == NULL) || (limit == NULL) || (user == NULL) + if ((pvres == NULL) || (resmgr == NULL) || (limit == NULL) || (user == NULL) || (queue == NULL) || (project == NULL)) { return -EINVAL; } @@ -448,7 +453,7 @@ int instantiate_limit(xce_vres_t** pvres, resmgr_t* mgr, xce_limit_t* limit, vres->limit = limit; - if (is_host_based_limit(mgr, limit)) { + if (is_host_based_limit(resmgr, limit)) { shared = 0; } @@ -457,9 +462,13 @@ int instantiate_limit(xce_vres_t** pvres, resmgr_t* mgr, xce_limit_t* limit, return rc; } - vres->vres = resmgr_lockres(mgr, vresname, OBJREF_NOP); - if (vres->vres == NULL) { - rc = add_vres(&(vres->vres), mgr, vresname, shared); + rc = key_find(resmgr, (void*)vresname, (void**)&(vres->vres)); + if (rc < 0) { + return rc; + } + + if (rc == 0) { + rc = add_vres(&(vres->vres), resmgr, vresname, shared); if (rc < 0) { FREEUP(vresname); return rc; @@ -468,8 +477,12 @@ int instantiate_limit(xce_vres_t** pvres, resmgr_t* mgr, xce_limit_t* limit, FREEUP(vresname); - vres->res = resmgr_lockres(mgr, limit->val.resname, OBJREF_NOP); - if (vres->res == NULL) { + rc = key_find(resmgr, (void*)limit->val.resname, (void**)&(vres->res)); + if (rc < 0) { + return rc; + } + + if (rc == 0) { return -ENOENT; } diff --git a/src/lib/xstring.c b/src/lib/xstring.c index 5997f8fa..2a7b4060 100644 --- a/src/lib/xstring.c +++ b/src/lib/xstring.c @@ -10,139 +10,6 @@ #include "utils.h" #include "xstring.h" -static void* xstring_create(objmgr_t*, objtype_t*, va_list); -static void xstring_fini(void*); -static void xstring_type_fini(objtype_t*); - -static xstring_typedata_t xstring_typedata; - -static objtype_t xstring - = { .type = "xstring", - .fn_create = (obj_create_fn_t)xstring_create, - .fn_fini = xstring_fini, - .fn_type_fini = (objtype_fini_fn_t)xstring_type_fini, - .typedata = &xstring_typedata }; - -static void xstring_obj_killer(myobj_t* obj) -{ - if (obj == NULL) { - return; - } - - memset(obj, 0x0, sizeof(*obj)); - free(obj); -} - -int register_xstring(objmgr_t* mgr, int nslots, int delta) -{ - ht_init(&(xstring_typedata.tab), nslots, string_hash_key); - zarray_init(&(xstring_typedata.strings), delta, - (zarray_item_killer_t)xstring_obj_killer); - - return objmgr_register(mgr, &xstring); -} - -static void* xstring_create(objmgr_t* mgr, objtype_t* type, va_list ap) -{ - char* s = va_arg(ap, char*); - char* p = NULL; - myobj_t* obj = NULL; - hent_t* e = NULL; - xstring_typedata_t* typedata = NULL; - int32_t idx; - - if (s == NULL) { - SET_ERROR(EINVAL); - return NULL; - } - - typedata = (xstring_typedata_t*)type->typedata; - - e = ht_get((htab_t*)&(typedata->tab), (void*)s); - if (e != NULL) { - idx = e->data; - obj = (myobj_t*)zarray_get(&(typedata->strings), idx); - - if (obj != NULL) { - p = MYOBJ_TO_OBJ(char*, obj); - return obj_ref(p, OBJREF_NOP); - } - - SET_ERROR(EINVAL); - return NULL; - } - - obj = (myobj_t*)calloc(1, sizeof(*obj) + strlen(s) + 1); - if (obj == NULL) { - return NULL; - } - - idx = zarray_store(&(typedata->strings), obj); - if (idx < 0) { - free(obj); - SET_ERROR(-idx); - return NULL; - } - - obj_init(mgr, type, idx, obj); - - p = MYOBJ_TO_OBJ(char*, obj); - - strcpy(p, s); - - e = ht_add((htab_t*)&(typedata->tab), (void*)s); - if (e == NULL) { - obj_deref(p); - return NULL; - } - - e->data = idx; - - return p; -} - -/* this will ONLY be called by obj_deref() */ -static void xstring_fini(void* s) -{ - myobj_t* myobj; - objtype_t* typeval; - xstring_typedata_t* typedata; - int32_t idx; - - if (s == NULL) { - return; - } - - myobj = TO_MYOBJ(s); - typeval = myobj->type; - typedata = (xstring_typedata_t*)typeval->typedata; - - if (typedata == NULL) { - return; - } - - ht_del(&(typedata->tab), (void*)s); - - idx = (int32_t)myobj->exdata; - if (idx >= 0) { - zarray_del(&(typedata->strings), idx); - } - - return; -} - -static void xstring_type_fini(objtype_t* typeval) -{ - xstring_typedata_t* typedata = (xstring_typedata_t*)typeval->typedata; - - if (typedata == NULL) { - return; - } - - ht_fini(&(typedata->tab)); - zarray_fini(&(typedata->strings)); -} - static struct { mylock_t lock; var xstr_table; diff --git a/src/scheduler/include/scheduler.h b/src/scheduler/include/scheduler.h index 09ea5713..10655aae 100644 --- a/src/scheduler/include/scheduler.h +++ b/src/scheduler/include/scheduler.h @@ -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; diff --git a/src/scheduler/src/plugins/limit.c b/src/scheduler/src/plugins/limit.c index 394a7c66..2e00f043 100644 --- a/src/scheduler/src/plugins/limit.c +++ b/src/scheduler/src/plugins/limit.c @@ -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; } diff --git a/src/scheduler/src/plugins/seqjob_allocator.c b/src/scheduler/src/plugins/seqjob_allocator.c index c99ce784..164d8fac 100644 --- a/src/scheduler/src/plugins/seqjob_allocator.c +++ b/src/scheduler/src/plugins/seqjob_allocator.c @@ -1,5 +1,6 @@ #include #include +#include #include #include #include @@ -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); } diff --git a/src/scheduler/src/resource.c b/src/scheduler/src/resource.c index d4cbd623..632885f9 100644 --- a/src/scheduler/src/resource.c +++ b/src/scheduler/src/resource.c @@ -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); diff --git a/src/scheduler/src/scheduler.c b/src/scheduler/src/scheduler.c index b6588946..41b796c3 100644 --- a/src/scheduler/src/scheduler.c +++ b/src/scheduler/src/scheduler.c @@ -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) {