#if !defined(_SCHEDULER_H_) #define _SCHEDULER_H_ 1 #include #include #include #include "client.h" #include "dataq.h" #include "decision.h" #include "group.h" #include "kvmgr.h" #include "mylock.h" #include "plugin.h" #include "xce/types.h" #include "xlist.h" #include "xvec.h" typedef void* (*sched_group_worker_fn_t)(void*, xce_sched_worker_t*); typedef enum { XCE_SCHED_OP_NONE = 0, XCE_SCHED_OP_UPDATE_CONFIG, XCE_SCHED_OP_UPDATE_JOB, XCE_SCHED_OP_JSTATE_CHANGE, XCE_SCHED_OP_UPDATE_WORKER } xce_sched_op_t; typedef struct { data_item_t link; xce_sched_op_t op; union { xce_conf4sched_t* config; struct { int njobs; xce_job_t** jobs; } jobupdate; struct { int nworkers; xce_worker_t** workers; } workerupdate; struct { uint64_t jobid; uint32_t state; } job_state_change; } u; } xce_sched_update_request_t; #define ITPTR_TO_UPDATE_REQ(p) \ ((xce_sched_update_request_t*)(((char*)p) \ - offsetof(xce_sched_update_request_t, \ link))) typedef struct { mylock_t lock; int stop; xcecli_ctx_t apictx; uint64_t nextid; xce_conf4sched_t* config; kvmgr_t plugins; void* seqjob_allocator; void* parjob_allocator; 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; zarray_t sharedInst; zarray_t sharedInUse; kvmgr_t jobs; kvmgr_t queues; kvmgr_t workers; kvmgr_t users; kvmgr_t projects; pthread_t jobpicker; pthread_t allocator; cbuf_t wbuf; /* action to trigger scheduling */ cbuf_t jbuf; /* job picked for allocation */ cbuf_t decisions; /* scheduler decisions */ } xce_scheduler_t; extern int sched_init(xce_scheduler_t*, xce_client_config_t*, xce_request_handler_t); extern void sched_fini(xce_scheduler_t*); extern int sched_init_config(xce_scheduler_t* sched, xce_conf4sched_t*); extern int sched_update(xce_scheduler_t*); extern void sched_go(xce_scheduler_t*); extern void sched_begin_session(xce_scheduler_t*); extern void sched_end_session(xce_scheduler_t*); extern xce_sched_job_t* sched_get_job(xce_scheduler_t*, uint64_t); extern xce_sched_queue_t* sched_get_queue(xce_scheduler_t*, char*); extern xce_sched_worker_t* sched_get_worker(xce_scheduler_t*, char*); extern xce_sched_user_t* sched_get_user(xce_scheduler_t*, char*); extern xce_sched_project_t* sched_get_project(xce_scheduler_t*, char*); extern int sched_add_job(xce_scheduler_t*, xce_sched_job_t*); extern int sched_add_queue(xce_scheduler_t*, xce_sched_queue_t*); extern int sched_add_user(xce_scheduler_t*, xce_sched_user_t*); extern int sched_add_worker(xce_scheduler_t*, xce_sched_worker_t*); extern int sched_add_project(xce_scheduler_t*, xce_sched_project_t*); extern int sched_job_is_ready(xce_sched_job_t*); extern int sched_queue_is_ready(xce_sched_queue_t*); extern int sched_commit_decision(xce_scheduler_t*, xce_decision_t*); extern int sched_publish_pend_reason(xce_scheduler_t*, xce_preason_set_t*); extern int sched_publish_dispatch(xce_scheduler_t*, xce_job_dispatch_t*); extern int sched_meet_host_selection(xce_scheduler_t*, xce_sched_worker_t*, xce_select_t*); extern int sched_check_shared_satisfy(xce_scheduler_t*, xvec_t*, xvec_idval_t*, xvec_idval_t*); extern int sched_check_host_satisfy(xce_scheduler_t*, xce_sched_worker_t*, xvec_t*, xvec_idval_t*, xvec_idval_t*); extern int sched_collect_workers(xce_scheduler_t*, xlist_t*, zarray_iter_skip_fn_t, sched_group_worker_fn_t); extern int sched_charge_account(xce_scheduler_t*, xce_job_account_t*); extern int sched_uncharge_account(xce_scheduler_t*, xce_job_account_t*); extern int sched_commit_job_alloc(xce_scheduler_t*, xce_sched_job_t*); extern uint64_t sched_get_id(xce_scheduler_t*); extern xce_alloc_t** sched_make_allocs(xce_scheduler_t*, char*, int, int*, float*, int*); extern int sched_try_alloc_on_hosts(xce_worker_group_t*, va_list); extern int sched_ctx_fill_shared_requests(xce_scheduler_t*, xce_sched_ctx_t*); extern int sched_ctx_fill_host_requests(xce_scheduler_t*, xce_sched_ctx_t*); extern int get_resvals(zarray_t*, int, int*, float*); extern int put_resvals(zarray_t*, int, int*, float*); extern request_res_t* make_resource_request(char*, float); #endif