16 #include <scheduler.h>
56 FO_ASSERT_PTR_NULL(scheduler->
db_conn);
58 FO_ASSERT_PTR_NOT_NULL_FATAL(scheduler->
db_conn);
64 job = g_tree_lookup(scheduler->
job_list, &jq_pk);
65 FO_ASSERT_PTR_NOT_NULL_FATAL(job);
67 FO_ASSERT_EQUAL(job->
id, jq_pk);
71 params->second = jq_pk;
73 FO_ASSERT_EQUAL(job->
status, JB_PAUSED);
77 params->second = jq_pk;
79 FO_ASSERT_EQUAL(job->
status, JB_RESTART);
85 FO_ASSERT_EQUAL(job->
status, JB_RESTART);
88 FO_ASSERT_EQUAL(job->
status, JB_FAILED);
115 FO_ASSERT_PTR_NULL(scheduler->
db_conn);
117 FO_ASSERT_PTR_NOT_NULL(scheduler->
db_conn);
123 job = g_tree_lookup(scheduler->
job_list, &jq_pk);
124 FO_ASSERT_PTR_NOT_NULL_FATAL(job);
127 FO_ASSERT_PTR_NOT_NULL(res);
130 FO_ASSERT_PTR_NOT_NULL_FATAL(job);
132 FO_ASSERT_PTR_NOT_NULL_FATAL(job);
134 FO_ASSERT_EQUAL(result, 0);
144 #define STRESS_USERS 15
145 #define STRESS_UPLOADS 20
146 #define STRESS_N_JOBS (STRESS_USERS * STRESS_UPLOADS)
147 #define STRESS_BASE_ID 50000
159 int job_ids[STRESS_N_JOBS];
161 uint32_t saved_interval;
164 FO_ASSERT_PTR_NULL(scheduler->
db_conn);
166 FO_ASSERT_PTR_NOT_NULL_FATAL(scheduler->
db_conn);
172 saved_interval = CONF_agent_update_interval;
173 CONF_agent_update_interval = 0;
176 old_time = time(NULL) - 5;
177 for (i = 0; i < STRESS_N_JOBS; i++)
180 "stress_agent", NULL, STRESS_BASE_ID + i, 0, 1, 1, 0, NULL);
181 FO_ASSERT_PTR_NOT_NULL_FATAL(j);
183 job_ids[i] = STRESS_BASE_ID + i;
186 FO_ASSERT_EQUAL((
int)g_sequence_get_length(scheduler->
job_queue), STRESS_N_JOBS);
187 FO_ASSERT_EQUAL(g_tree_nnodes(scheduler->
job_list), STRESS_N_JOBS);
193 for (i = 0; i < STRESS_N_JOBS; i++)
195 if (g_tree_lookup(scheduler->
job_list, &job_ids[i]) != NULL)
198 FO_ASSERT_EQUAL(found, STRESS_N_JOBS);
199 FO_ASSERT_EQUAL((
int)g_sequence_get_length(scheduler->
job_queue), STRESS_N_JOBS);
201 CONF_agent_update_interval = saved_interval;
215 uint32_t saved_interval;
216 int id_hi = STRESS_BASE_ID + 2000;
217 int id_mid = STRESS_BASE_ID + 2001;
218 int id_low = STRESS_BASE_ID + 2002;
221 FO_ASSERT_PTR_NULL(scheduler->
db_conn);
223 FO_ASSERT_PTR_NOT_NULL_FATAL(scheduler->
db_conn);
227 saved_interval = CONF_agent_update_interval;
228 CONF_agent_update_interval = 0;
232 "prio_agent", NULL, id_low, 0, 1, 1, 10, NULL);
234 "prio_agent", NULL, id_hi, 0, 1, 1, -10, NULL);
236 "prio_agent", NULL, id_mid, 0, 1, 1, 0, NULL);
240 FO_ASSERT_PTR_NOT_NULL_FATAL(top);
241 FO_ASSERT_EQUAL(top->
id, id_hi);
245 int ids[3] = { id_hi, id_mid, id_low };
247 time_t old = time(NULL) - 5;
248 for (k = 0; k < 3; k++)
259 FO_ASSERT_PTR_NOT_NULL_FATAL(top);
260 FO_ASSERT_EQUAL(top->
id, id_hi);
263 FO_ASSERT_EQUAL(g_tree_nnodes(scheduler->
job_list), 3);
265 CONF_agent_update_interval = saved_interval;
275 memset(&fake, 0,
sizeof(fake));
282 FO_ASSERT_EQUAL(fake.
status, AG_FAILED);
298 FO_ASSERT_PTR_NOT_NULL_FATAL(ma);
301 for (i = 0; i < 5; i++)
321 CU_TestInfo tests_job[] =
void meta_agent_increase_count(meta_agent_t *ma)
meta_agent_t * meta_agent_init(char *name, char *cmd, int max, int spc)
Creates a new meta agent.
int add_meta_agent(GTree *meta_agents, char *name, char *cmd, int max, int spc)
void agent_transition(agent_t *agent, agent_status new_status)
void meta_agent_destroy(meta_agent_t *ma)
Header file with agent related operations.
void job_fail_event(scheduler_t *scheduler, job_t *job)
Events that causes a job to be marked a failed.
void job_restart_event(scheduler_t *scheduler, arg_int *params)
job_t * job_init(GTree *job_list, GSequence *job_queue, char *type, char *host, int id, int parent_id, int user_id, int group_id, int priority, char *jq_cmd_args)
Create a new job.
job_t * next_job(GSequence *job_queue)
Gets the next job from the job queue.
char * job_next(job_t *job)
job_t * peek_job(GSequence *job_queue)
Gets the job that is at the top of the queue if there is one.
void job_verbose_event(scheduler_t *scheduler, job_t *job)
void job_pause_event(scheduler_t *scheduler, arg_int *params)
Event to pause a job.
void job_priority_event(scheduler_t *scheduler, arg_int *params)
uint32_t active_jobs(GTree *job_list)
Gets the number of jobs that are not paused.
void database_init(scheduler_t *scheduler)
void database_update_event(scheduler_t *scheduler, void *unused)
Checks the job queue for any new entries.
void scheduler_update(scheduler_t *scheduler)
Update function called after every event.
scheduler_t * scheduler_init(gchar *sysconfigdir, log_t *log)
Create a new scheduler object.
void scheduler_destroy(scheduler_t *scheduler)
Free any memory associated with a scheduler_t.
int Prepare_Testing_Data(scheduler_t *scheduler)
agent_status status
the state of execution the agent is currently in
job_t * owner
the job that this agent is assigned to
int32_t id
The identifier for this job.
job_status status
The current status for the job.
time_t checkedout_at
Timestamp when job entered JB_CHECKEDOUT (for stale detection grace period)
GTree * job_list
List of jobs that have been created.
PGconn * db_conn
The database connection.
GTree * meta_agents
List of all meta agents available to the scheduler.
GSequence * job_queue
heap of jobs that still need to be started
void test_scheduler_priority_order_preserved(void)
Priority ordering must be preserved after a blocked-job skip.
void test_job_fun()
Test for job functions.
void test_job_event()
Test for job events.
void test_agent_transition_null_owner_safe(void)
agent_transition() must not crash when agent->owner is NULL.
void test_meta_agent_negative_max_run_is_unlimited(void)
Regression: max_run < 0 must mean unlimited, not "limit reached".
void test_scheduler_high_load_no_false_stale(void)
Jobs blocked at max_run must not be reaped as stale.
int Prepare_Testing_Data_Job(scheduler_t *scheduler)