improve resmgr/jobmgr/qmgr/workermgr
This commit is contained in:
parent
2362b32825
commit
8d78f0cbeb
12 changed files with 161 additions and 575 deletions
|
|
@ -497,7 +497,8 @@ int cluster_init(cluster_t* c)
|
||||||
|
|
||||||
objmgr_init(&(c->objmgr));
|
objmgr_init(&(c->objmgr));
|
||||||
jobmgr_init(&(c->jobmgr), c->myconf->cluster_config->jobmgr->nhash_slots,
|
jobmgr_init(&(c->jobmgr), c->myconf->cluster_config->jobmgr->nhash_slots,
|
||||||
c->myconf->cluster_config->jobmgr->delta);
|
c->myconf->cluster_config->jobmgr->delta,
|
||||||
|
(zarray_item_killer_t)job_obj_killer);
|
||||||
resmgr_init(&(c->resmgr), c->myconf->cluster_config->resmgr->nhash_slots,
|
resmgr_init(&(c->resmgr), c->myconf->cluster_config->resmgr->nhash_slots,
|
||||||
c->myconf->cluster_config->resmgr->delta,
|
c->myconf->cluster_config->resmgr->delta,
|
||||||
(zarray_item_killer_t)res_obj_killer);
|
(zarray_item_killer_t)res_obj_killer);
|
||||||
|
|
@ -505,9 +506,11 @@ int cluster_init(cluster_t* c)
|
||||||
(zarray_item_killer_t)resval_obj_killer);
|
(zarray_item_killer_t)resval_obj_killer);
|
||||||
workermgr_init(&(c->workermgr),
|
workermgr_init(&(c->workermgr),
|
||||||
c->myconf->cluster_config->workermgr->nhash_slots,
|
c->myconf->cluster_config->workermgr->nhash_slots,
|
||||||
c->myconf->cluster_config->workermgr->delta);
|
c->myconf->cluster_config->workermgr->delta,
|
||||||
|
(zarray_item_killer_t)worker_obj_killer);
|
||||||
qmgr_init(&(c->qmgr), c->myconf->cluster_config->qmgr->nhash_slots,
|
qmgr_init(&(c->qmgr), c->myconf->cluster_config->qmgr->nhash_slots,
|
||||||
c->myconf->cluster_config->qmgr->delta);
|
c->myconf->cluster_config->qmgr->delta,
|
||||||
|
(zarray_item_killer_t)queue_obj_killer);
|
||||||
iomgr_init(&(c->iomgr));
|
iomgr_init(&(c->iomgr));
|
||||||
|
|
||||||
iomgr_set_ssl_ctx(&(c->iomgr), ssl_ctx);
|
iomgr_set_ssl_ctx(&(c->iomgr), ssl_ctx);
|
||||||
|
|
|
||||||
|
|
@ -22,33 +22,19 @@
|
||||||
|
|
||||||
typedef int (*collect_check_fn_t)(void*);
|
typedef int (*collect_check_fn_t)(void*);
|
||||||
|
|
||||||
extern int check_controller(void*);
|
extern int check_controller(void*);
|
||||||
extern int cluster_init(cluster_t*);
|
extern int cluster_init(cluster_t*);
|
||||||
extern int cluster_start(cluster_t*);
|
extern int cluster_start(cluster_t*);
|
||||||
extern int cluster_run(cluster_t*);
|
extern int cluster_run(cluster_t*);
|
||||||
extern void cluster_fini(cluster_t*);
|
extern void cluster_fini(cluster_t*);
|
||||||
extern int register_types(cluster_t*);
|
extern int register_types(cluster_t*);
|
||||||
extern int jobmgr_init(jobmgr_t*, int, int);
|
extern int worker_ctrl(cluster_t*, xce_hostctrl_t*);
|
||||||
extern void jobmgr_fini(jobmgr_t*);
|
|
||||||
extern int workermgr_init(workermgr_t*, int, int);
|
|
||||||
extern void workermgr_fini(workermgr_t*);
|
|
||||||
extern int workermgr_add(workermgr_t*, worker_t*);
|
|
||||||
extern worker_t* workermgr_lock(workermgr_t*, char*, int);
|
|
||||||
extern worker_t* workermgr_lock_byid(workermgr_t*, int, int);
|
|
||||||
extern void workermgr_del(workermgr_t*, worker_t*);
|
|
||||||
extern int worker_ctrl(cluster_t*, xce_hostctrl_t*);
|
|
||||||
extern void qmgr_fini(qmgr_t*);
|
|
||||||
extern int qmgr_init(qmgr_t*, int, int);
|
|
||||||
extern int qmgr_add(qmgr_t*, queue_t*);
|
|
||||||
extern queue_t* qmgr_lockq(qmgr_t*, char*, int);
|
|
||||||
extern void qmgr_delq(qmgr_t*, queue_t*);
|
|
||||||
extern int qmgr_iter(qmgr_t*, xlist_t*, void*);
|
|
||||||
|
|
||||||
extern xce_resource_t* get_resource(cluster_t*, char*);
|
extern xce_resource_t* get_resource(cluster_t*, char*);
|
||||||
extern int add_to_xlist(xlist_t*, void*);
|
extern int add_to_xlist(xlist_t*, void*);
|
||||||
extern int add_worker_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_queue_to_xlist(xlist_t*, void*);
|
||||||
extern int add_job_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 res_obj_killer(xce_resource_t*);
|
||||||
extern void resval_obj_killer(xce_resval_t*);
|
extern void resval_obj_killer(xce_resval_t*);
|
||||||
extern void resource_killer(void*);
|
extern void resource_killer(void*);
|
||||||
|
|
@ -83,6 +69,7 @@ extern job_t* jobmgr_lockjob(jobmgr_t*, uint64_t, int);
|
||||||
extern int32_t jobmgr_add_job(jobmgr_t*, job_t*);
|
extern int32_t jobmgr_add_job(jobmgr_t*, job_t*);
|
||||||
extern void jobmgr_del_job(jobmgr_t*, job_t*);
|
extern void jobmgr_del_job(jobmgr_t*, job_t*);
|
||||||
extern void job_obj_killer(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 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_get_op(cluster_t*, endpoint_t*, xce_request_t*);
|
||||||
extern int do_update_op(cluster_t*, endpoint_t*, xce_request_t*);
|
extern int do_update_op(cluster_t*, endpoint_t*, xce_request_t*);
|
||||||
|
|
|
||||||
|
|
@ -7,20 +7,6 @@
|
||||||
#include "xce/types.h"
|
#include "xce/types.h"
|
||||||
#include "zarray.h"
|
#include "zarray.h"
|
||||||
|
|
||||||
typedef struct {
|
|
||||||
uint64_t jobid;
|
|
||||||
xce_alloc_t alloc;
|
|
||||||
double used;
|
|
||||||
} res_usage_t;
|
|
||||||
|
|
||||||
typedef struct {
|
|
||||||
xce_worker_t host;
|
|
||||||
char hostkey[XCE_MAXKEY_LEN];
|
|
||||||
endpoint_t* ep;
|
|
||||||
int idx;
|
|
||||||
zarray_t usages;
|
|
||||||
} worker_t;
|
|
||||||
|
|
||||||
extern int add_worker(void*, endpoint_t*, const char*, hostattrs_t*);
|
extern int add_worker(void*, endpoint_t*, const char*, hostattrs_t*);
|
||||||
extern int restore_worker(void*, xce_worker_t);
|
extern int restore_worker(void*, xce_worker_t);
|
||||||
#endif
|
#endif
|
||||||
|
|
|
||||||
|
|
@ -1,155 +0,0 @@
|
||||||
#include <errno.h>
|
|
||||||
#include <stdarg.h>
|
|
||||||
#include <stdlib.h>
|
|
||||||
#include <string.h>
|
|
||||||
|
|
||||||
#include "cluster.h"
|
|
||||||
#include "htab.h"
|
|
||||||
#include "xce/cluster_def.h"
|
|
||||||
#include "xce/errnox.h"
|
|
||||||
#include "xstring.h"
|
|
||||||
|
|
||||||
int jobmgr_init(jobmgr_t* mgr, int nhslots, int delta)
|
|
||||||
{
|
|
||||||
ht_init(&(mgr->htab), nhslots, int_hash_key);
|
|
||||||
zarray_init(&(mgr->jobs), delta, (zarray_item_killer_t)job_obj_killer);
|
|
||||||
mylock_init(&(mgr->lock));
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
void jobmgr_fini(jobmgr_t* mgr)
|
|
||||||
{
|
|
||||||
ht_fini(&(mgr->htab));
|
|
||||||
zarray_fini(&(mgr->jobs));
|
|
||||||
mylock_fini(&(mgr->lock));
|
|
||||||
}
|
|
||||||
|
|
||||||
job_t* jobmgr_lockjob_(jobmgr_t* mgr, uint64_t jobid, int op)
|
|
||||||
{
|
|
||||||
hent_t* e = NULL;
|
|
||||||
int idx;
|
|
||||||
job_t* job = NULL;
|
|
||||||
|
|
||||||
e = ht_get(&(mgr->htab), (void*)jobid);
|
|
||||||
if (e == NULL) {
|
|
||||||
SET_ERROR(E_XCE_BAD_JOB);
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
idx = e->data;
|
|
||||||
|
|
||||||
if (idx < 0) {
|
|
||||||
SET_ERROR(E_XCE_BAD_JOB);
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
job = (job_t*)zarray_get(&(mgr->jobs), idx);
|
|
||||||
|
|
||||||
return obj_ref(job, op);
|
|
||||||
}
|
|
||||||
|
|
||||||
job_t* jobmgr_lockjob(jobmgr_t* mgr, uint64_t jobid, int op)
|
|
||||||
{
|
|
||||||
job_t* job = NULL;
|
|
||||||
|
|
||||||
if (mgr == NULL) {
|
|
||||||
SET_ERROR(EINVAL);
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* clang-format off */
|
|
||||||
if ((op != OBJREF_NOP) &&
|
|
||||||
(op != OBJREF_READ) &&
|
|
||||||
(op != OBJREF_UPDATE)) {
|
|
||||||
SET_ERROR(EINVAL);
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
/* clang-format on */
|
|
||||||
|
|
||||||
mylock_lock(&(mgr->lock));
|
|
||||||
job = jobmgr_lockjob_(mgr, jobid, op);
|
|
||||||
mylock_unlock(&(mgr->lock));
|
|
||||||
|
|
||||||
return job;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int32_t jobmgr_add_job_(jobmgr_t* mgr, job_t* job)
|
|
||||||
{
|
|
||||||
hent_t* e = NULL;
|
|
||||||
int idx;
|
|
||||||
|
|
||||||
e = ht_get(&(mgr->htab), (void*)job->job.jobid);
|
|
||||||
if (e != NULL) {
|
|
||||||
return -EEXIST;
|
|
||||||
}
|
|
||||||
|
|
||||||
idx = zarray_store(&(mgr->jobs), job);
|
|
||||||
if (idx < 0) {
|
|
||||||
return idx;
|
|
||||||
}
|
|
||||||
|
|
||||||
e = ht_add(&(mgr->htab), (void*)job->job.jobid);
|
|
||||||
if (e == NULL) {
|
|
||||||
zarray_del(&(mgr->jobs), idx);
|
|
||||||
return -errno;
|
|
||||||
}
|
|
||||||
|
|
||||||
e->data = idx;
|
|
||||||
return idx;
|
|
||||||
}
|
|
||||||
|
|
||||||
int32_t jobmgr_add_job(jobmgr_t* mgr, job_t* job)
|
|
||||||
{
|
|
||||||
int32_t idx;
|
|
||||||
|
|
||||||
if ((mgr == NULL) || (job == NULL)) {
|
|
||||||
return -EINVAL;
|
|
||||||
}
|
|
||||||
|
|
||||||
mylock_lock(&(mgr->lock));
|
|
||||||
idx = jobmgr_add_job_(mgr, job);
|
|
||||||
mylock_unlock(&(mgr->lock));
|
|
||||||
|
|
||||||
return idx;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void jobmgr_del_job_(jobmgr_t* mgr, job_t* job)
|
|
||||||
{
|
|
||||||
hent_t* e = NULL;
|
|
||||||
int idx;
|
|
||||||
|
|
||||||
e = ht_get(&(mgr->htab), (void*)job->job.jobid);
|
|
||||||
if (e == NULL) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
idx = e->data;
|
|
||||||
if (idx < 0) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
zarray_del(&(mgr->jobs), idx);
|
|
||||||
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
void jobmgr_del_job(jobmgr_t* mgr, job_t* job)
|
|
||||||
{
|
|
||||||
if ((mgr == NULL) || (job == NULL)) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
mylock_lock(&(mgr->lock));
|
|
||||||
jobmgr_del_job_(mgr, job);
|
|
||||||
mylock_unlock(&(mgr->lock));
|
|
||||||
}
|
|
||||||
|
|
||||||
int jobmgr_iter(jobmgr_t* mgr, xlist_t* l, void* arg)
|
|
||||||
{
|
|
||||||
int rc = 0;
|
|
||||||
|
|
||||||
mylock_lock(&(mgr->lock));
|
|
||||||
rc = zarray_iter_ex(&(mgr->jobs), NULL, l, arg);
|
|
||||||
mylock_unlock(&(mgr->lock));
|
|
||||||
|
|
||||||
return rc;
|
|
||||||
}
|
|
||||||
|
|
@ -2,21 +2,18 @@ controller_src = [
|
||||||
'cluster.c',
|
'cluster.c',
|
||||||
'dataex.c',
|
'dataex.c',
|
||||||
'job.c',
|
'job.c',
|
||||||
'jobmgr.c',
|
|
||||||
'join.c',
|
'join.c',
|
||||||
'main.c',
|
'main.c',
|
||||||
'misc.c',
|
'misc.c',
|
||||||
'myapp.c',
|
'myapp.c',
|
||||||
'opget.c',
|
'opget.c',
|
||||||
'opupd.c',
|
'opupd.c',
|
||||||
'qmgr.c',
|
|
||||||
'queue.c',
|
'queue.c',
|
||||||
'reply.c',
|
'reply.c',
|
||||||
'resources.c',
|
'resources.c',
|
||||||
'sched.c',
|
'sched.c',
|
||||||
'task.c',
|
'task.c',
|
||||||
'worker.c',
|
'worker.c',
|
||||||
'workermgr.c',
|
|
||||||
'xceobjs.c',
|
'xceobjs.c',
|
||||||
'myconf.c'
|
'myconf.c'
|
||||||
]
|
]
|
||||||
|
|
|
||||||
|
|
@ -1,156 +0,0 @@
|
||||||
#include <errno.h>
|
|
||||||
#include <stdlib.h>
|
|
||||||
#include <string.h>
|
|
||||||
|
|
||||||
#include "cluster.h"
|
|
||||||
#include "htab.h"
|
|
||||||
#include "xce/cluster_def.h"
|
|
||||||
#include "xstring.h"
|
|
||||||
|
|
||||||
extern void queue_obj_killer(queue_t*);
|
|
||||||
|
|
||||||
int qmgr_init(qmgr_t* mgr, int nslots, int delta)
|
|
||||||
{
|
|
||||||
mylock_init(&(mgr->lock));
|
|
||||||
ht_init(&(mgr->htab), nslots, string_hash_key);
|
|
||||||
zarray_init(&(mgr->queues), delta, (zarray_item_killer_t)queue_obj_killer);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
void qmgr_fini(qmgr_t* mgr)
|
|
||||||
{
|
|
||||||
zarray_fini(&(mgr->queues));
|
|
||||||
ht_fini(&(mgr->htab));
|
|
||||||
mylock_fini(&(mgr->lock));
|
|
||||||
}
|
|
||||||
|
|
||||||
static int qmgr_add_(qmgr_t* mgr, queue_t* q)
|
|
||||||
{
|
|
||||||
hent_t* e = NULL;
|
|
||||||
int idx;
|
|
||||||
|
|
||||||
e = ht_get(&(mgr->htab), (void*)q->queue.queue);
|
|
||||||
if (e != NULL) {
|
|
||||||
return -EEXIST;
|
|
||||||
}
|
|
||||||
|
|
||||||
idx = zarray_store(&(mgr->queues), q);
|
|
||||||
if (idx < 0) {
|
|
||||||
return idx;
|
|
||||||
}
|
|
||||||
|
|
||||||
e = ht_add(&(mgr->htab), (void*)q->queue.queue);
|
|
||||||
if (e == NULL) {
|
|
||||||
zarray_del(&(mgr->queues), idx);
|
|
||||||
return -errno;
|
|
||||||
}
|
|
||||||
|
|
||||||
e->data = idx;
|
|
||||||
return idx;
|
|
||||||
}
|
|
||||||
|
|
||||||
int qmgr_add(qmgr_t* mgr, queue_t* q)
|
|
||||||
{
|
|
||||||
int idx;
|
|
||||||
|
|
||||||
if ((mgr == NULL) || (q == NULL)) {
|
|
||||||
return -EINVAL;
|
|
||||||
}
|
|
||||||
|
|
||||||
mylock_lock(&(mgr->lock));
|
|
||||||
idx = qmgr_add_(mgr, q);
|
|
||||||
mylock_unlock(&(mgr->lock));
|
|
||||||
|
|
||||||
return idx;
|
|
||||||
}
|
|
||||||
static queue_t* qmgr_lockq_(qmgr_t* mgr, char* name, int op)
|
|
||||||
{
|
|
||||||
hent_t* e = NULL;
|
|
||||||
int idx;
|
|
||||||
queue_t* q = NULL;
|
|
||||||
|
|
||||||
e = ht_get(&(mgr->htab), (void*)name);
|
|
||||||
if (e == NULL) {
|
|
||||||
SET_ERROR(ENOENT);
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
idx = e->data;
|
|
||||||
if (idx < 0) {
|
|
||||||
SET_ERROR(ENOENT);
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
q = (queue_t*)zarray_get(&(mgr->queues), idx);
|
|
||||||
|
|
||||||
return obj_ref(q, op);
|
|
||||||
}
|
|
||||||
queue_t* qmgr_lockq(qmgr_t* mgr, char* name, int op)
|
|
||||||
{
|
|
||||||
queue_t* q = NULL;
|
|
||||||
|
|
||||||
if (mgr == NULL) {
|
|
||||||
SET_ERROR(EINVAL);
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (name == NULL) {
|
|
||||||
SET_ERROR(EINVAL);
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* clang-format off */
|
|
||||||
if ((op != OBJREF_NOP) &&
|
|
||||||
(op != OBJREF_READ) &&
|
|
||||||
(op != OBJREF_UPDATE)) {
|
|
||||||
SET_ERROR(EINVAL);
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
/* clang-format on */
|
|
||||||
|
|
||||||
mylock_lock(&(mgr->lock));
|
|
||||||
q = qmgr_lockq_(mgr, name, op);
|
|
||||||
mylock_unlock(&(mgr->lock));
|
|
||||||
|
|
||||||
return q;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void qmgr_delq_(qmgr_t* mgr, queue_t* q)
|
|
||||||
{
|
|
||||||
hent_t* e = NULL;
|
|
||||||
int idx;
|
|
||||||
|
|
||||||
e = ht_get(&(mgr->htab), (void*)q->queue.queue);
|
|
||||||
if (e == NULL) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
idx = e->data;
|
|
||||||
if (idx < 0) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
zarray_del(&(mgr->queues), idx);
|
|
||||||
}
|
|
||||||
|
|
||||||
void qmgr_delq(qmgr_t* mgr, queue_t* q)
|
|
||||||
{
|
|
||||||
if ((mgr == NULL) || (q == NULL)) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
mylock_lock(&(mgr->lock));
|
|
||||||
qmgr_delq_(mgr, q);
|
|
||||||
mylock_unlock(&(mgr->lock));
|
|
||||||
}
|
|
||||||
|
|
||||||
int qmgr_iter(qmgr_t* mgr, xlist_t* l, void* arg)
|
|
||||||
{
|
|
||||||
int rc = 0;
|
|
||||||
|
|
||||||
mylock_lock(&(mgr->lock));
|
|
||||||
rc = zarray_iter_ex(&(mgr->queues), NULL, l, arg);
|
|
||||||
mylock_unlock(&(mgr->lock));
|
|
||||||
|
|
||||||
return rc;
|
|
||||||
}
|
|
||||||
|
|
@ -1,190 +0,0 @@
|
||||||
#include <errno.h>
|
|
||||||
#include <stdlib.h>
|
|
||||||
#include <string.h>
|
|
||||||
|
|
||||||
#include "cluster.h"
|
|
||||||
#include "htab.h"
|
|
||||||
#include "mylock.h"
|
|
||||||
#include "xce/cluster_def.h"
|
|
||||||
#include "xce/errnox.h"
|
|
||||||
#include "xstring.h"
|
|
||||||
|
|
||||||
extern void worker_obj_killer(worker_t*);
|
|
||||||
|
|
||||||
int workermgr_init(workermgr_t* mgr, int nslots, int delta)
|
|
||||||
{
|
|
||||||
TRACE("%s nslots %d delta %d", __func__, nslots, delta);
|
|
||||||
|
|
||||||
mylock_init(&(mgr->lock));
|
|
||||||
ht_init(&(mgr->htab), nslots, string_hash_key);
|
|
||||||
zarray_init(&(mgr->workers), delta,
|
|
||||||
(zarray_item_killer_t)worker_obj_killer);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
void workermgr_fini(workermgr_t* mgr)
|
|
||||||
{
|
|
||||||
zarray_fini(&(mgr->workers));
|
|
||||||
ht_fini(&(mgr->htab));
|
|
||||||
mylock_fini(&(mgr->lock));
|
|
||||||
}
|
|
||||||
|
|
||||||
static int32_t workermgr_add_(workermgr_t* mgr, worker_t* w)
|
|
||||||
{
|
|
||||||
hent_t* e = NULL;
|
|
||||||
int idx;
|
|
||||||
|
|
||||||
e = ht_get(&(mgr->htab), (void*)w->host.name);
|
|
||||||
if (e != NULL) {
|
|
||||||
return (int)e->data;
|
|
||||||
}
|
|
||||||
|
|
||||||
idx = zarray_store(&(mgr->workers), w);
|
|
||||||
if (idx < 0) {
|
|
||||||
return idx;
|
|
||||||
}
|
|
||||||
|
|
||||||
e = ht_add(&(mgr->htab), (void*)w->host.name);
|
|
||||||
if (e == NULL) {
|
|
||||||
zarray_del(&(mgr->workers), idx);
|
|
||||||
return -errno;
|
|
||||||
}
|
|
||||||
|
|
||||||
e->data = idx;
|
|
||||||
|
|
||||||
return idx;
|
|
||||||
}
|
|
||||||
|
|
||||||
int32_t workermgr_add(workermgr_t* mgr, worker_t* w)
|
|
||||||
{
|
|
||||||
int idx;
|
|
||||||
|
|
||||||
if ((mgr == NULL) || (w == NULL)) {
|
|
||||||
return -EINVAL;
|
|
||||||
}
|
|
||||||
|
|
||||||
mylock_lock(&(mgr->lock));
|
|
||||||
idx = workermgr_add_(mgr, w);
|
|
||||||
mylock_unlock(&(mgr->lock));
|
|
||||||
|
|
||||||
return idx;
|
|
||||||
}
|
|
||||||
|
|
||||||
static worker_t* workermgr_lock_(workermgr_t* mgr, char* name, int op)
|
|
||||||
{
|
|
||||||
hent_t* e = NULL;
|
|
||||||
int idx;
|
|
||||||
worker_t* w = NULL;
|
|
||||||
|
|
||||||
e = ht_get(&(mgr->htab), (void*)name);
|
|
||||||
if (e == NULL) {
|
|
||||||
SET_ERROR(E_XCE_BAD_WORKER);
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
idx = e->data;
|
|
||||||
if (idx < 0) {
|
|
||||||
SET_ERROR(E_XCE_BAD_WORKER);
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
w = zarray_get(&(mgr->workers), idx);
|
|
||||||
|
|
||||||
return obj_ref(w, op);
|
|
||||||
}
|
|
||||||
|
|
||||||
worker_t* workermgr_lock(workermgr_t* mgr, char* name, int op)
|
|
||||||
{
|
|
||||||
worker_t* w = NULL;
|
|
||||||
|
|
||||||
if (mgr == NULL) {
|
|
||||||
SET_ERROR(EINVAL);
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (name == NULL) {
|
|
||||||
SET_ERROR(EINVAL);
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
if ((op != OBJREF_NOP) && (op != OBJREF_READ) && (op != OBJREF_UPDATE)) {
|
|
||||||
SET_ERROR(EINVAL);
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
mylock_lock(&(mgr->lock));
|
|
||||||
w = workermgr_lock_(mgr, name, op);
|
|
||||||
mylock_unlock(&(mgr->lock));
|
|
||||||
|
|
||||||
return w;
|
|
||||||
}
|
|
||||||
|
|
||||||
worker_t* workermgr_lock_byid(workermgr_t* mgr, int idx, int op)
|
|
||||||
{
|
|
||||||
worker_t* w = NULL;
|
|
||||||
|
|
||||||
if (mgr == NULL) {
|
|
||||||
SET_ERROR(EINVAL);
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
if ((idx < 0) || (idx >= mgr->workers.caps)) {
|
|
||||||
SET_ERROR(EINVAL);
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
if ((op != OBJREF_NOP) && (op != OBJREF_READ) && (op != OBJREF_UPDATE)) {
|
|
||||||
SET_ERROR(EINVAL);
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
mylock_lock(&(mgr->lock));
|
|
||||||
w = (worker_t*)zarray_get(&(mgr->workers), idx);
|
|
||||||
if (w != NULL) {
|
|
||||||
w = obj_ref(w, op);
|
|
||||||
}
|
|
||||||
mylock_unlock(&(mgr->lock));
|
|
||||||
|
|
||||||
return w;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void workermgr_del_(workermgr_t* mgr, worker_t* w)
|
|
||||||
{
|
|
||||||
hent_t* e = NULL;
|
|
||||||
int idx;
|
|
||||||
|
|
||||||
e = ht_get(&(mgr->htab), (void*)w->host.name);
|
|
||||||
if (e == NULL) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
idx = e->data;
|
|
||||||
if (idx < 0) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
zarray_del(&(mgr->workers), idx);
|
|
||||||
}
|
|
||||||
|
|
||||||
void workermgr_del(workermgr_t* mgr, worker_t* w)
|
|
||||||
{
|
|
||||||
if ((mgr == NULL) || (w == NULL)) {
|
|
||||||
SET_ERROR(EINVAL);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
mylock_lock(&(mgr->lock));
|
|
||||||
workermgr_del_(mgr, w);
|
|
||||||
mylock_unlock(&(mgr->lock));
|
|
||||||
}
|
|
||||||
|
|
||||||
int workermgr_iter(workermgr_t* mgr, xlist_t* l, void* arg)
|
|
||||||
{
|
|
||||||
int rc = 0;
|
|
||||||
|
|
||||||
mylock_lock(&(mgr->lock));
|
|
||||||
rc = zarray_iter_ex(&(mgr->workers), NULL, l, arg);
|
|
||||||
mylock_unlock(&(mgr->lock));
|
|
||||||
|
|
||||||
return rc;
|
|
||||||
}
|
|
||||||
|
|
@ -20,6 +20,18 @@ typedef struct {
|
||||||
int nunshared;
|
int nunshared;
|
||||||
} resmgr_t;
|
} resmgr_t;
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
kvmgr_t queues;
|
||||||
|
} qmgr_t;
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
kvmgr_t jobs;
|
||||||
|
} jobmgr_t;
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
kvmgr_t workers;
|
||||||
|
} workermgr_t;
|
||||||
|
|
||||||
extern int kvmgr_init(kvmgr_t*, hash_key_fn_t, int, int, zarray_item_killer_t);
|
extern int kvmgr_init(kvmgr_t*, hash_key_fn_t, int, int, zarray_item_killer_t);
|
||||||
extern void kvmgr_fini(kvmgr_t*);
|
extern void kvmgr_fini(kvmgr_t*);
|
||||||
extern void* kvmgr_lock(kvmgr_t*, void*, int);
|
extern void* kvmgr_lock(kvmgr_t*, void*, int);
|
||||||
|
|
@ -35,4 +47,20 @@ extern xce_resource_t* resmgr_lockres(resmgr_t*, char*, int);
|
||||||
extern void resmgr_del_res(resmgr_t*, xce_resource_t*);
|
extern void resmgr_del_res(resmgr_t*, xce_resource_t*);
|
||||||
extern int resmgr_iter(resmgr_t*, xlist_t*, void*);
|
extern int resmgr_iter(resmgr_t*, xlist_t*, void*);
|
||||||
|
|
||||||
|
extern void qmgr_fini(qmgr_t*);
|
||||||
|
extern int qmgr_init(qmgr_t*, int, int, zarray_item_killer_t);
|
||||||
|
extern int qmgr_add(qmgr_t*, queue_t*);
|
||||||
|
extern queue_t* qmgr_lockq(qmgr_t*, char*, int);
|
||||||
|
extern void qmgr_delq(qmgr_t*, queue_t*);
|
||||||
|
extern int qmgr_iter(qmgr_t*, xlist_t*, void*);
|
||||||
|
|
||||||
|
extern int jobmgr_init(jobmgr_t*, int, int, zarray_item_killer_t);
|
||||||
|
extern void jobmgr_fini(jobmgr_t*);
|
||||||
|
extern int workermgr_init(workermgr_t*, int, int, zarray_item_killer_t);
|
||||||
|
extern void workermgr_fini(workermgr_t*);
|
||||||
|
extern int workermgr_add(workermgr_t*, worker_t*);
|
||||||
|
extern worker_t* workermgr_lock(workermgr_t*, char*, int);
|
||||||
|
extern worker_t* workermgr_lock_byid(workermgr_t*, int, int);
|
||||||
|
extern void workermgr_del(workermgr_t*, worker_t*);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
||||||
|
|
@ -11,12 +11,16 @@
|
||||||
|
|
||||||
#include "dataq.h"
|
#include "dataq.h"
|
||||||
#include "mylock.h"
|
#include "mylock.h"
|
||||||
#include "xce/types.h"
|
|
||||||
|
|
||||||
typedef int (*conn_handler_t)(struct epoll_event*);
|
typedef int (*conn_handler_t)(struct epoll_event*);
|
||||||
typedef int (*msg_handler_t)(void*);
|
typedef int (*msg_handler_t)(void*);
|
||||||
typedef int (*err_handler_t)(void*);
|
typedef int (*err_handler_t)(void*);
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
char* name;
|
||||||
|
char* key;
|
||||||
|
} xce_peerinfo_t;
|
||||||
|
|
||||||
#define IO_MON_INPUT (0x01)
|
#define IO_MON_INPUT (0x01)
|
||||||
#define IO_MON_OUTPUT (0x02)
|
#define IO_MON_OUTPUT (0x02)
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -76,32 +76,6 @@ typedef struct {
|
||||||
typedef struct {
|
typedef struct {
|
||||||
} metrics_t;
|
} metrics_t;
|
||||||
|
|
||||||
typedef struct {
|
|
||||||
xce_queue_t queue;
|
|
||||||
} queue_t;
|
|
||||||
|
|
||||||
typedef struct {
|
|
||||||
xce_job_t job;
|
|
||||||
} job_t;
|
|
||||||
|
|
||||||
typedef struct {
|
|
||||||
mylock_t lock;
|
|
||||||
htab_t htab;
|
|
||||||
zarray_t jobs;
|
|
||||||
} jobmgr_t;
|
|
||||||
|
|
||||||
typedef struct {
|
|
||||||
mylock_t lock;
|
|
||||||
htab_t htab;
|
|
||||||
zarray_t workers;
|
|
||||||
} workermgr_t;
|
|
||||||
|
|
||||||
typedef struct {
|
|
||||||
mylock_t lock;
|
|
||||||
htab_t htab;
|
|
||||||
zarray_t queues;
|
|
||||||
} qmgr_t;
|
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
mylock_t lock;
|
mylock_t lock;
|
||||||
endpoint_t* ep;
|
endpoint_t* ep;
|
||||||
|
|
|
||||||
|
|
@ -10,6 +10,7 @@
|
||||||
|
|
||||||
#include "xlist.h"
|
#include "xlist.h"
|
||||||
#include "zarray.h"
|
#include "zarray.h"
|
||||||
|
#include "netio.h"
|
||||||
|
|
||||||
#define XCE_VAL_STRING (0)
|
#define XCE_VAL_STRING (0)
|
||||||
#define XCE_VAL_NUMERIC (1)
|
#define XCE_VAL_NUMERIC (1)
|
||||||
|
|
@ -96,11 +97,6 @@ typedef struct {
|
||||||
char** data;
|
char** data;
|
||||||
} xce_strlist_t;
|
} xce_strlist_t;
|
||||||
|
|
||||||
typedef struct {
|
|
||||||
char* name;
|
|
||||||
char* key;
|
|
||||||
} xce_peerinfo_t;
|
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
char* name;
|
char* name;
|
||||||
char* value;
|
char* value;
|
||||||
|
|
@ -267,6 +263,21 @@ typedef struct {
|
||||||
int64_t duration;
|
int64_t duration;
|
||||||
} xce_alloc_t;
|
} xce_alloc_t;
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
uint64_t jobid;
|
||||||
|
xce_alloc_t alloc;
|
||||||
|
double used;
|
||||||
|
} res_usage_t;
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
xce_worker_t host;
|
||||||
|
char hostkey[XCE_MAXKEY_LEN];
|
||||||
|
endpoint_t* ep;
|
||||||
|
int idx;
|
||||||
|
zarray_t usages;
|
||||||
|
} worker_t;
|
||||||
|
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
char* host;
|
char* host;
|
||||||
int nallocs;
|
int nallocs;
|
||||||
|
|
@ -431,6 +442,11 @@ typedef struct {
|
||||||
xce_job_preason_t* pend_reasons;
|
xce_job_preason_t* pend_reasons;
|
||||||
} xce_job_t;
|
} xce_job_t;
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
xce_job_t job;
|
||||||
|
} job_t;
|
||||||
|
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
int count;
|
int count;
|
||||||
xce_job_t** data;
|
xce_job_t** data;
|
||||||
|
|
@ -474,6 +490,10 @@ typedef struct {
|
||||||
char* autopscaler;
|
char* autopscaler;
|
||||||
} xce_queue_t;
|
} xce_queue_t;
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
xce_queue_t queue;
|
||||||
|
} queue_t;
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
int count;
|
int count;
|
||||||
xce_queue_t** queues;
|
xce_queue_t** queues;
|
||||||
|
|
|
||||||
|
|
@ -246,3 +246,91 @@ int resmgr_iter(resmgr_t* mgr, xlist_t* l, void* arg)
|
||||||
{
|
{
|
||||||
return kvmgr_iter(&(mgr->resdef), NULL, l, 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);
|
||||||
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue