save works
This commit is contained in:
parent
b1faeb94b6
commit
b748e30d20
35 changed files with 1247 additions and 2149 deletions
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,5 +1,6 @@
|
|||
#include <errno.h>
|
||||
#include <pthread.h>
|
||||
#include <rtti.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
|
|
@ -50,6 +51,7 @@ static int seqjob_prepare_allocation(void* arg, xce_sched_ctx_t* ctx)
|
|||
xce_sched_obj_t* obj = NULL;
|
||||
xce_resource_t* r = NULL;
|
||||
xce_primary_resreq_t* primary = NULL;
|
||||
int rc = 0;
|
||||
|
||||
if ((plugin == NULL) || (ctx == NULL) || (sched == NULL)) {
|
||||
return -EINVAL;
|
||||
|
|
@ -73,15 +75,23 @@ static int seqjob_prepare_allocation(void* arg, xce_sched_ctx_t* ctx)
|
|||
if (ctx->worker == NULL) {
|
||||
ctx->nhosts = 1;
|
||||
ctx->nslots = 1;
|
||||
calc_wanted_global_resvals(&(ctx->alloc_req.shared), &(sched->resmgr),
|
||||
calc_wanted_global_resvals(&(ctx->alloc_req.shared), sched->resmgr,
|
||||
&(primary->rusages), PER_TASK, 1, 1);
|
||||
} else {
|
||||
calc_wanted_host_resvals(&(ctx->alloc_req.host), &(sched->resmgr),
|
||||
calc_wanted_host_resvals(&(ctx->alloc_req.host), sched->resmgr,
|
||||
&(primary->rusages), PER_TASK, 1, 1);
|
||||
}
|
||||
|
||||
/* add slots into requested resources */
|
||||
r = resmgr_lockres(&(sched->resmgr), "slots", OBJREF_NOP);
|
||||
rc = key_find(sched->resmgr, (void*)"slots", (void**)&r);
|
||||
if (rc < 0) {
|
||||
return rc;
|
||||
}
|
||||
|
||||
if (rc == 0) {
|
||||
return -ENOENT;
|
||||
}
|
||||
|
||||
if (r == NULL) {
|
||||
return -EINVAL;
|
||||
}
|
||||
|
|
@ -123,8 +133,14 @@ static int my_alloc(xce_sched_plugin_t* plugin, xce_sched_ctx_t* ctx)
|
|||
int i;
|
||||
|
||||
for (i = 0; i < ctx->alloc_req.shared.count; i++) {
|
||||
xce_resource_t* r = resmgr_lock_byid(
|
||||
&(sched->resmgr), ((int*)ctx->unmeet.idxs.data)[i], OBJREF_NOP);
|
||||
xce_resource_t* r = NULL;
|
||||
|
||||
rc = vget(sched->resmgr, ((int*)ctx->unmeet.idxs.data)[i],
|
||||
(void**)&r);
|
||||
if (rc <= 0) {
|
||||
continue;
|
||||
}
|
||||
|
||||
add_job_preason(reason->reasons, PREASON_NO_RESOURCE, NULL,
|
||||
r->name);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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) {
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue