working of scheduler to handle configuration
This commit is contained in:
parent
a46ea822c1
commit
ae658c4a23
11 changed files with 99 additions and 45 deletions
|
|
@ -20,10 +20,6 @@
|
||||||
#include "xce/errnox.h"
|
#include "xce/errnox.h"
|
||||||
#include "xstring.h"
|
#include "xstring.h"
|
||||||
|
|
||||||
static time_t last_print_time = 0;
|
|
||||||
static unsigned long npkts_old = 0;
|
|
||||||
static unsigned long npkts = 0;
|
|
||||||
|
|
||||||
static xce_peerinfo_t from_controller
|
static xce_peerinfo_t from_controller
|
||||||
= { .name = "controller", .key = "keepSecret" };
|
= { .name = "controller", .key = "keepSecret" };
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -358,10 +358,11 @@ typedef struct {
|
||||||
0x20 /**< Fairshare queue with null user share defined*/
|
0x20 /**< Fairshare queue with null user share defined*/
|
||||||
|
|
||||||
/* FIXME: improve following later */
|
/* FIXME: improve following later */
|
||||||
#define JOB_IS_PEND(j) ((j->state & JOB_STAT_PEND) != 0)
|
#define JOB_IS_PEND(state) (((state) & JOB_STAT_PEND) != 0)
|
||||||
#define JOB_IS_RUN(j) ((j->state & JOB_STAT_RUN) != 0)
|
#define JOB_IS_RUN(state) (((state) & JOB_STAT_RUN) != 0)
|
||||||
#define JOB_IS_EXIT(j) ((j->state & JOB_STAT_EXIT) != 0)
|
#define JOB_IS_EXIT(state) (((state) & JOB_STAT_EXIT) != 0)
|
||||||
#define JOB_IS_DONE(j) ((j->state & JOB_STAT_DONE) != 0)
|
#define JOB_IS_DONE(state) (((state) & JOB_STAT_DONE) != 0)
|
||||||
|
#define JOB_IS_FINISH(state) (JOB_IS_EXIT(state) || JOB_IS_DONE(state))
|
||||||
|
|
||||||
typedef enum {
|
typedef enum {
|
||||||
NORMAL = 0,
|
NORMAL = 0,
|
||||||
|
|
|
||||||
|
|
@ -11,8 +11,8 @@
|
||||||
typedef void* plugin_data_t;
|
typedef void* plugin_data_t;
|
||||||
|
|
||||||
/* hooker of plugin, the first parameter should be xce_sched_plugin_t */
|
/* hooker of plugin, the first parameter should be xce_sched_plugin_t */
|
||||||
typedef int (*plugin_update_config_hook_t)(void*, xce_conf4sched_t*,
|
typedef int (*plugin_update_config_hook_t)(void*, xce_sched_config_t*,
|
||||||
xce_conf4sched_t*);
|
xce_sched_config_t*);
|
||||||
typedef int (*plugin_update_queue_hook_t)(void*, xce_sched_queue_t*,
|
typedef int (*plugin_update_queue_hook_t)(void*, xce_sched_queue_t*,
|
||||||
xce_sched_queue_t*);
|
xce_sched_queue_t*);
|
||||||
typedef int (*plugin_update_job_hook_t)(void*, xce_sched_job_t*,
|
typedef int (*plugin_update_job_hook_t)(void*, xce_sched_job_t*,
|
||||||
|
|
@ -62,7 +62,7 @@ typedef struct {
|
||||||
|
|
||||||
extern int plugin_register(void*, void*);
|
extern int plugin_register(void*, void*);
|
||||||
extern void plugin_unregister(void*);
|
extern void plugin_unregister(void*);
|
||||||
extern int plugin_config_update(void*, xce_conf4sched_t*, xce_conf4sched_t*);
|
extern int plugin_config_update(void*, xce_sched_config_t*, xce_sched_config_t*);
|
||||||
extern int plugin_queue_update(void*, xce_sched_queue_t*, xce_sched_queue_t*);
|
extern int plugin_queue_update(void*, xce_sched_queue_t*, xce_sched_queue_t*);
|
||||||
extern int plugin_job_update(void*, xce_sched_job_t*, xce_sched_job_t*);
|
extern int plugin_job_update(void*, xce_sched_job_t*, xce_sched_job_t*);
|
||||||
extern int plugin_worker_update(void*, xce_sched_worker_t*,
|
extern int plugin_worker_update(void*, xce_sched_worker_t*,
|
||||||
|
|
|
||||||
|
|
@ -5,6 +5,7 @@
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
|
|
||||||
|
#include "kvmgr.h"
|
||||||
#include "typemap.h"
|
#include "typemap.h"
|
||||||
#include "xce/types.h"
|
#include "xce/types.h"
|
||||||
|
|
||||||
|
|
@ -54,15 +55,22 @@ typedef struct {
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
char* name;
|
char* name;
|
||||||
|
uint32_t status;
|
||||||
xce_val_t* res_avail; /* resources in worker */
|
xce_val_t* res_avail; /* resources in worker */
|
||||||
xce_val_t* res_in_use; /* used resources in worker */
|
xce_val_t* res_in_use; /* used resources in worker */
|
||||||
} xce_sched_worker_t;
|
} xce_sched_worker_t;
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
char* clustername;
|
||||||
|
resmgr_t resmgr;
|
||||||
|
} xce_sched_config_t;
|
||||||
|
|
||||||
extern xce_sched_job_t* make_sched_job(void*, xce_job_t*);
|
extern xce_sched_job_t* make_sched_job(void*, xce_job_t*);
|
||||||
extern xce_sched_queue_t* make_sched_queue(void*, xce_queue_t*);
|
extern xce_sched_queue_t* make_sched_queue(void*, xce_queue_t*);
|
||||||
extern xce_sched_worker_t* make_sched_worker(void*, xce_worker_t*);
|
extern xce_sched_worker_t* make_sched_worker(void*, xce_worker_t*);
|
||||||
extern xce_sched_user_t* make_sched_user(void*, char*);
|
extern xce_sched_user_t* make_sched_user(void*, char*);
|
||||||
extern xce_sched_project_t* make_sched_project(void*, char*);
|
extern xce_sched_project_t* make_sched_project(void*, char*);
|
||||||
|
extern xce_sched_config_t* make_sched_config(void*, xce_conf4sched_t*);
|
||||||
extern void kill_sched_job(void*);
|
extern void kill_sched_job(void*);
|
||||||
extern void kill_sched_queue(void*);
|
extern void kill_sched_queue(void*);
|
||||||
extern void kill_sched_worker(void*);
|
extern void kill_sched_worker(void*);
|
||||||
|
|
|
||||||
|
|
@ -49,22 +49,22 @@ typedef struct {
|
||||||
link)))
|
link)))
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
mylock_t lock;
|
mylock_t lock;
|
||||||
int stop;
|
int stop;
|
||||||
xcecli_ctx_t apictx;
|
xcecli_ctx_t apictx;
|
||||||
xce_conf4sched_t* config;
|
xce_sched_config_t* config;
|
||||||
kvmgr_t plugins;
|
kvmgr_t plugins;
|
||||||
dataq_t* pend_updates[2];
|
dataq_t* pend_updates[2];
|
||||||
kvmgr_t jobs;
|
kvmgr_t jobs;
|
||||||
kvmgr_t queues;
|
kvmgr_t queues;
|
||||||
kvmgr_t workers;
|
kvmgr_t workers;
|
||||||
kvmgr_t users;
|
kvmgr_t users;
|
||||||
kvmgr_t projects;
|
kvmgr_t projects;
|
||||||
pthread_t jobpicker;
|
pthread_t jobpicker;
|
||||||
pthread_t allocator;
|
pthread_t allocator;
|
||||||
cbuf_t wbuf; /* action to trigger scheduling */
|
cbuf_t wbuf; /* action to trigger scheduling */
|
||||||
cbuf_t jbuf; /* job picked for allocation */
|
cbuf_t jbuf; /* job picked for allocation */
|
||||||
cbuf_t decisions; /* scheduler decisions */
|
cbuf_t decisions; /* scheduler decisions */
|
||||||
} xce_scheduler_t;
|
} xce_scheduler_t;
|
||||||
|
|
||||||
extern int sched_init(xce_scheduler_t*, xce_client_config_t*,
|
extern int sched_init(xce_scheduler_t*, xce_client_config_t*,
|
||||||
|
|
|
||||||
|
|
@ -127,23 +127,23 @@ static int sched_handle_dataset(xce_scheduler_t* sched, dataset_t* dataset)
|
||||||
static int sched_job_state_change(xce_scheduler_t* sched, uint64_t jobid,
|
static int sched_job_state_change(xce_scheduler_t* sched, uint64_t jobid,
|
||||||
uint32_t state)
|
uint32_t state)
|
||||||
{
|
{
|
||||||
char jobidString[128];
|
char jobidString[128];
|
||||||
xce_sched_update_request_t *req = NULL;
|
xce_sched_update_request_t* req = NULL;
|
||||||
|
|
||||||
fmt_jobid(jobidString, sizeof(jobidString) - 1, jobid);
|
fmt_jobid(jobidString, sizeof(jobidString) - 1, jobid);
|
||||||
TRACE("%s %s state %u ", __func__, jobidString, state);
|
TRACE("%s %s state %u ", __func__, jobidString, state);
|
||||||
|
|
||||||
req = (xce_sched_update_request_t *)calloc(1, sizeof(*req));
|
req = (xce_sched_update_request_t*)calloc(1, sizeof(*req));
|
||||||
if (req == NULL) {
|
if (req == NULL) {
|
||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
}
|
}
|
||||||
|
|
||||||
req->op = XCE_SCHED_OP_JSTATE_CHANGE;
|
req->op = XCE_SCHED_OP_JSTATE_CHANGE;
|
||||||
req->u.job_state_change.jobid = jobid;
|
req->u.job_state_change.jobid = jobid;
|
||||||
req->u.job_state_change.state = state;
|
req->u.job_state_change.state = state;
|
||||||
|
|
||||||
enq_pend_update(sched, req);
|
enq_pend_update(sched, req);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
int sched_handle_notify(xce_scheduler_t* sched, xce_notify_data_t* notify)
|
int sched_handle_notify(xce_scheduler_t* sched, xce_notify_data_t* notify)
|
||||||
|
|
@ -216,9 +216,6 @@ int scheduler_req_handler(xce_request_t* request, void* args)
|
||||||
case Request_body_datamsg:
|
case Request_body_datamsg:
|
||||||
rc = sched_handle_dataset(sched, request->body.datamsg);
|
rc = sched_handle_dataset(sched, request->body.datamsg);
|
||||||
break;
|
break;
|
||||||
case Request_body_notifymsg:
|
|
||||||
rc = sched_handle_notify(sched, request->body.notifymsg);
|
|
||||||
break;
|
|
||||||
default:
|
default:
|
||||||
rc = -EINVAL;
|
rc = -EINVAL;
|
||||||
break;
|
break;
|
||||||
|
|
|
||||||
|
|
@ -72,8 +72,8 @@ static int plugin_config_update_(void* arg1, void* arg2)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int plugin_config_update(void* arg, xce_conf4sched_t* old,
|
int plugin_config_update(void* arg, xce_sched_config_t* old,
|
||||||
xce_conf4sched_t* config)
|
xce_sched_config_t* config)
|
||||||
{
|
{
|
||||||
xce_scheduler_t* sched = (xce_scheduler_t*)arg;
|
xce_scheduler_t* sched = (xce_scheduler_t*)arg;
|
||||||
xlist_t lst;
|
xlist_t lst;
|
||||||
|
|
|
||||||
|
|
@ -86,8 +86,9 @@ static int fcfs_priv_data_init(fcfs_plugin_data_t* data)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int fcfs_update_config(xce_sched_plugin_t* plugin, xce_conf4sched_t* old,
|
static int fcfs_update_config(xce_sched_plugin_t* plugin,
|
||||||
xce_conf4sched_t* config)
|
xce_sched_config_t* old,
|
||||||
|
xce_sched_config_t* config)
|
||||||
{
|
{
|
||||||
fcfs_plugin_data_t* privdata = NULL;
|
fcfs_plugin_data_t* privdata = NULL;
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -33,11 +33,11 @@ static int my_update_job(xce_sched_plugin_t* plugin, xce_sched_job_t* jold,
|
||||||
j->allocator = plugin;
|
j->allocator = plugin;
|
||||||
|
|
||||||
if (jold == NULL) {
|
if (jold == NULL) {
|
||||||
if (JOB_IS_RUN(j)) {
|
if (JOB_IS_RUN(j->state)) {
|
||||||
slotsInUse++;
|
slotsInUse++;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
if (JOB_IS_RUN(jold) && (JOB_IS_EXIT(j) || (JOB_IS_DONE(j)))) {
|
if (JOB_IS_RUN(jold->state) && JOB_IS_FINISH(j->state)) {
|
||||||
slotsInUse--;
|
slotsInUse--;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -103,8 +103,7 @@ static int my_commit(xce_sched_plugin_t* plugin, xce_decision_t* decision)
|
||||||
static int my_jstate_changed(xce_sched_plugin_t* plugin, xce_sched_job_t* job,
|
static int my_jstate_changed(xce_sched_plugin_t* plugin, xce_sched_job_t* job,
|
||||||
uint32_t state)
|
uint32_t state)
|
||||||
{
|
{
|
||||||
if (JOB_IS_RUN(job)
|
if (JOB_IS_RUN(job->state) && JOB_IS_FINISH(state)) {
|
||||||
&& ((state == JOB_STAT_EXIT) || (state == JOB_STAT_DONE))) {
|
|
||||||
slotsInUse--;
|
slotsInUse--;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -89,7 +89,8 @@ xce_sched_worker_t* make_sched_worker(void* arg, xce_worker_t* w)
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
worker->name = strdup(w->name);
|
worker->name = strdup(w->name);
|
||||||
|
worker->status = w->status;
|
||||||
/* FIXME: */
|
/* FIXME: */
|
||||||
|
|
||||||
return worker;
|
return worker;
|
||||||
|
|
@ -124,3 +125,42 @@ xce_sched_project_t* make_sched_project(void* arg, char* name)
|
||||||
|
|
||||||
return project;
|
return project;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
xce_sched_config_t* make_sched_config(void* arg, xce_conf4sched_t* c)
|
||||||
|
{
|
||||||
|
xce_scheduler_t* sched = (xce_scheduler_t*)arg;
|
||||||
|
xce_sched_config_t* config = NULL;
|
||||||
|
int i;
|
||||||
|
|
||||||
|
if ((sched == NULL) || (c == NULL)) {
|
||||||
|
errno = EINVAL;
|
||||||
|
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
config = (xce_sched_config_t *)calloc(1, sizeof(*config));
|
||||||
|
if (config == NULL) {
|
||||||
|
errno = ENOMEM;
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* FIXME: */
|
||||||
|
resmgr_init(&(config->resmgr), /* slots */128, /* delta */ 128, NULL);
|
||||||
|
config->clustername = strdup(c->clustername);
|
||||||
|
|
||||||
|
for(i = 0; i < c->n_resources; i ++) {
|
||||||
|
xce_resource_t *r = NULL;
|
||||||
|
|
||||||
|
MOVE_PTR(r, c->resources[i]);
|
||||||
|
resmgr_add_res(&(config->resmgr), r);
|
||||||
|
}
|
||||||
|
|
||||||
|
return config;
|
||||||
|
}
|
||||||
|
|
||||||
|
void kill_sched_config(void* arg)
|
||||||
|
{
|
||||||
|
if (arg == NULL) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
||||||
|
|
@ -239,11 +239,23 @@ void sched_fini(xce_scheduler_t* sched)
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int sched_merge_config(xce_scheduler_t *sched, xce_sched_config_t *config) {
|
||||||
|
if (sched->config == NULL) {
|
||||||
|
sched->config = config;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* FIXME: merge sched->config and config and free unused */
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
static int sched_update_config(xce_scheduler_t* sched, xce_conf4sched_t* config)
|
static int sched_update_config(xce_scheduler_t* sched, xce_conf4sched_t* config)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
|
xce_sched_config_t *config2 = make_sched_config(sched, config);
|
||||||
|
|
||||||
plugin_config_update(sched, sched->config, config);
|
plugin_config_update(sched, sched->config, config2);
|
||||||
|
|
||||||
|
sched_merge_config(sched, config2);
|
||||||
|
|
||||||
for (i = 0; i < config->n_queues; i++) {
|
for (i = 0; i < config->n_queues; i++) {
|
||||||
xce_sched_queue_t* qold
|
xce_sched_queue_t* qold
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue