controller will pass resource <name, value> pair than <idx, value> pair

This commit is contained in:
Rongsong Shen 2026-05-13 07:18:03 +00:00
parent 9f6741c2c4
commit d47b3375e7
16 changed files with 183 additions and 86 deletions

View file

@ -48,7 +48,7 @@ static int xce_apiserver_push_workers(cluster_t* c, endpoint_t* ep)
for (i = 0; i < workers.n_total; i++) {
xce_worker_t* w = workers.workers[i];
free_resval_with_idx_list(&(w->resvals_to_sched), w->nresvals_to_sched);
free_name_val_list(&(w->resvals_to_sched), w->nresvals_to_sched);
}
unlock_collect_workers(&wlist);
@ -364,9 +364,9 @@ static int apiserver_worker_change(int type, int situation, void* data,
situation);
xlist_init(&resvalist, 256);
collect_resval_with_idx(&(w->host.resvals), &resvalist);
collect_resval(c->resmgr, &(w->host.resvals), &resvalist);
w->host.nresvals_to_sched = resvalist.count;
w->host.resvals_to_sched = (xce_val_with_idx_t**)resvalist.data;
w->host.resvals_to_sched = (xce_name_val_t**)resvalist.data;
switch (situation) {
case HOOK_AFTER_EVENT:

View file

@ -19,57 +19,66 @@ int check_controller(void* arg)
return 1;
}
static int collect_resval_with_idx_(zarray_t* array, xlist_t* l)
int collect_resval(var resmgr, zarray_t* array, xlist_t* l)
{
int i;
iterator_t it;
int rc;
for (i = 0; i < array->caps; i++) {
xce_val_with_idx_t* val;
xce_val_t* src = array->data[i];
lock(resmgr, RTTI_LOCK_READ);
rc = iter_make(&it, resmgr);
if (rc < 0) {
unlock(resmgr);
return rc;
}
if (array->data[i] == NULL) {
for (;;) {
xce_resource_t* r = NULL;
xce_val_t* src = NULL;
xce_name_val_t* nv = NULL;
rc = iter_next(&it, (void**)&r);
if ((rc < 0) || (rc == RTTI_ITER_NO_DATA)) {
break;
}
if (r == NULL) {
continue;
}
val = (xce_val_with_idx_t*)calloc(1, sizeof(*val));
if (val == NULL) {
return -ENOMEM;
src = (xce_val_t*)zarray_get(array, r->idx);
if (src == NULL) {
continue;
}
val->idx = i;
val->val = (xce_val_t*)calloc(1, sizeof(xce_val_t));
if (val->val == NULL) {
return -ENOMEM;
nv = (xce_name_val_t*)calloc(1, sizeof(*nv));
if (nv == NULL) {
rc = -ENOMEM;
break;
}
nv->name = strdup(r->name);
nv->val = (xce_val_t*)calloc(1, sizeof(xce_val_t));
if (nv->val == NULL) {
FREEUP(nv->name);
FREEUP(nv);
rc = -ENOMEM;
break;
}
if (src->which == Value_u_svalue) {
val->val->which = Value_u_svalue;
if (src->u.svalue != NULL) {
val->val->u.svalue = strdup(src->u.svalue);
} else {
val->val->u.svalue = strdup("-");
}
nv->val->which = Value_u_svalue;
nv->val->u.svalue = strdup(src->u.svalue ? src->u.svalue : "-");
} else {
memcpy(val->val, array->data[i], sizeof(xce_val_t));
memcpy(nv->val, src, sizeof(xce_val_t));
}
xlist_store(l, val);
xlist_store(l, nv);
}
return l->count;
}
iter_destroy(&it);
unlock(resmgr);
int collect_resval_with_idx(zarray_t* array, xlist_t* l)
{
int rc = 0;
mylock_lock(&(array->lock));
rc = collect_resval_with_idx_(array, l);
mylock_unlock(&(array->lock));
return rc;
return (rc == RTTI_ITER_NO_DATA || rc == 0) ? l->count : rc;
}
static void lock_objs(xlist_t* l, int op)
@ -138,7 +147,7 @@ static void lock_collect_jobs(xlist_t* l, int op)
}
}
static void collect_resvals_workers(xlist_t* l)
static void collect_resvals_workers(var resmgr, xlist_t* l)
{
int i;
@ -153,11 +162,11 @@ static void collect_resvals_workers(xlist_t* l)
xlist_init(&lst, 128);
collect_resval_with_idx(&(w->resvals), &lst);
collect_resval(resmgr, &(w->resvals), &lst);
w->nresvals_to_sched = lst.count;
MOVE_PTR(p, lst.data);
w->resvals_to_sched = (xce_val_with_idx_t**)p;
w->resvals_to_sched = (xce_name_val_t**)p;
xlist_fini(&lst);
}
@ -352,17 +361,14 @@ void collect_workers(cluster_t* c, collect_check_fn_t fn, xlist_t* l)
lock_collect_workers(l, RTTI_LOCK_WRITE);
collect_resvals_workers(l);
collect_resvals_workers(c->resmgr, l);
return;
}
void collect_shared_resvals(cluster_t* c, collect_check_fn_t fn, xlist_t* l)
{
collect_resval_with_idx(&(c->sharedinst), l);
return;
collect_resval(c->resmgr, &(c->sharedinst), l);
}
int notify(cluster_t* c, endpoint_t* ep, xce_notify_data_t* data)
@ -401,7 +407,7 @@ void unlock_collect_workers(xlist_t* l)
continue;
}
free_resval_with_idx_list(&(w->resvals_to_sched), w->nresvals_to_sched);
free_name_val_list(&(w->resvals_to_sched), w->nresvals_to_sched);
w1 = CONTAINER_OF(w, worker_t, host);
unlock(w1);

View file

@ -118,7 +118,7 @@ extern int on_task_finish(cluster_t*, xce_task_finish_t*);
extern int xce_controller_res_init(cluster_t*);
extern int map_resource_to_host(char*, cluster_t*);
extern int release_resource_from_worker(char*, cluster_t*);
extern int collect_resval_with_idx(zarray_t*, xlist_t*);
extern int collect_resval(var, zarray_t*, xlist_t*);
extern int do_set_preason(cluster_t*, endpoint_t*, xce_request_t*);
extern int do_clr_preason(cluster_t*, endpoint_t*, xce_request_t*);
extern int handle_apiserver_leave(cluster_t*, endpoint_t*);

View file

@ -125,7 +125,7 @@ static int do_reply_workerlist(cluster_t* c, endpoint_t* ep,
for (i = 0; i < workerdata.n_total; i++) {
xce_worker_t* w = workerdata.workers[i];
free_resval_with_idx_list(&(w->resvals_to_sched), w->nresvals_to_sched);
free_name_val_list(&(w->resvals_to_sched), w->nresvals_to_sched);
}
unlock_collect_workers(&wlist);

View file

@ -63,7 +63,7 @@ int handle_clusterconf(cluster_t* c, endpoint_t* ep, xce_request_t* request)
for (i = 0; i < clusterconf.wlist.count; i++) {
xce_worker_t* w = clusterconf.wlist.workers[i];
free_resval_with_idx_list(&(w->resvals_to_sched), w->nresvals_to_sched);
free_name_val_list(&(w->resvals_to_sched), w->nresvals_to_sched);
}
unlock_collect_queues(&qlist);

View file

@ -117,7 +117,7 @@ static int xcesched_push_configs(cluster_t* c)
configdata.data.conf4sched->resources = (xce_resource_t**)rlist.data;
collect_shared_resvals(c, NULL, &xreslist);
configdata.data.conf4sched->nresvals = xreslist.count;
configdata.data.conf4sched->resvals = (xce_val_with_idx_t**)xreslist.data;
configdata.data.conf4sched->resvals = (xce_name_val_t**)xreslist.data;
configdata.data.conf4sched->n_ugroups = c->myconf->cluster_config->nugroups;
configdata.data.conf4sched->ugroups = c->myconf->cluster_config->ugroups;
@ -142,8 +142,8 @@ static int xcesched_push_configs(cluster_t* c)
rc = xce_pushconfig_req(c->sched.ep, c->myhost, &configdata);
free_resval_with_idx_list(&(configdata.data.conf4sched->resvals),
configdata.data.conf4sched->nresvals);
free_name_val_list(&(configdata.data.conf4sched->resvals),
configdata.data.conf4sched->nresvals);
FREEUP(configdata.data.conf4sched);
@ -223,7 +223,7 @@ static int xcesched_push_workers(cluster_t* c)
for (i = 0; i < workers.n_total; i++) {
xce_worker_t* w = workers.workers[i];
free_resval_with_idx_list(&(w->resvals_to_sched), w->nresvals_to_sched);
free_name_val_list(&(w->resvals_to_sched), w->nresvals_to_sched);
}
unlock_collect_workers(&wlist);
@ -439,9 +439,9 @@ static int sched_worker_change(int type, int situation, void* data,
situation);
xlist_init(&resvalist, 256);
collect_resval_with_idx(&(w->host.resvals), &resvalist);
collect_resval(c->resmgr, &(w->host.resvals), &resvalist);
w->host.nresvals_to_sched = resvalist.count;
w->host.resvals_to_sched = (xce_val_with_idx_t**)resvalist.data;
w->host.resvals_to_sched = (xce_name_val_t**)resvalist.data;
mylock_lock(&(c->sched.lock));
if (c->sched.ep != NULL) {
@ -460,8 +460,8 @@ static int sched_worker_change(int type, int situation, void* data,
#if 0
/*FIXME*/
free_resval_with_idx_list(&(w->host.resvals_to_sched),
w->host.nresvals_to_sched);
free_name_val_list(&(w->host.resvals_to_sched),
w->host.nresvals_to_sched);
#endif
xlist_fini(&resvalist);