static int depthfirst_map_one (flux_t *h, const char *key, int dirskip, restart_map_f cb, void *arg) { flux_jobid_t id; flux_future_t *f; const char *eventlog; struct job *job = NULL; char path[64]; int rc = -1; if (strlen (key) <= dirskip) { errno = EINVAL; return -1; } if (fluid_decode (key + dirskip + 1, &id, FLUID_STRING_DOTHEX) < 0) return -1; if (flux_job_kvs_key (path, sizeof (path), id, "eventlog") < 0) { errno = EINVAL; return -1; } if (!(f = flux_kvs_lookup (h, NULL, 0, path))) goto done; if (flux_kvs_lookup_get (f, &eventlog) < 0) goto done; if (!(job = job_create_from_eventlog (id, eventlog))) goto done; if (cb (job, arg) < 0) goto done; rc = 1; done: flux_future_destroy (f); job_decref (job); return rc; }
static void close_cb(uv_handle_t *handle) { job_decref(handle_get_job(handle)); }
int main (int argc, char *argv[]) { struct queue *q; struct job *job[3]; struct job *njob[2]; struct job *j, *j_prev; plan (NO_PLAN); q = queue_create (true); if (!q) BAIL_OUT ("could not create queue"); ok (queue_size (q) == 0, "queue_size returns 0"); /* insert 1,2,3 */ job[0] = job_create_test (1, FLUX_JOB_PRIORITY_DEFAULT); job[1] = job_create_test (2, FLUX_JOB_PRIORITY_DEFAULT); job[2] = job_create_test (3, FLUX_JOB_PRIORITY_DEFAULT); ok (queue_insert (q, job[0], &job[0]->queue_handle) == 0, "queue_insert 1 pri=def"); ok (queue_insert (q, job[1], &job[1]->queue_handle) == 0, "queue_insert 2 pri=def"); ok (queue_insert (q, job[2], &job[2]->queue_handle) == 0, "queue_insert 3 pri=def"); errno = 0; ok (queue_insert (q, job[2], &job[2]->queue_handle) < 0 && errno == EEXIST, "queue_insert 3 again fails with EEXIST"); /* queue size, refcounts */ ok (queue_size (q) == 3, "queue_size returns 3"); ok (job[0]->refcount == 2 && job[1]->refcount == 2 && job[2]->refcount == 2, "queue took reference on inserted jobs"); /* iterators */ ok (queue_first (q) == job[0] && queue_next (q) == job[1] && queue_next (q) == job[2] && queue_next (q) == NULL, "queue iterators return job 1,2,3,NULL"); /* lookup_by_id */ ok (queue_lookup_by_id (q, 1) == job[0] && queue_lookup_by_id (q, 2) == job[1] && queue_lookup_by_id (q, 3) == job[2], "queue_lookup_by_id works for all three jobs"); errno = 0; ok (queue_lookup_by_id (q, 42) == NULL && errno == ENOENT, "queue_lookupby_id 42 fails with ENOENT"); /* insert high priority */ njob[0] = job_create_test (100, FLUX_JOB_PRIORITY_MAX); ok (queue_insert (q, njob[0], &njob[0]->queue_handle) == 0, "queue_insert 100 pri=max"); ok (queue_first (q) == njob[0], "queue_first returns high priority job"); /* insert low priority */ njob[1] = job_create_test (101, FLUX_JOB_PRIORITY_MIN); ok (queue_insert (q, njob[1], &njob[1]->queue_handle) == 0, "queue_insert 101 pri=min"); j_prev = NULL; j = queue_first (q); while (j) { j_prev = j; j = queue_next (q); } ok (j_prev == njob[1], "iterators find low priority job last"); /* set high priority and reorder * review: queue contains 100,1,2,3,101 */ job[2]->priority = FLUX_JOB_PRIORITY_MAX; // job 3 queue_reorder (q, job[2], job[2]->queue_handle); ok (queue_first (q) == job[2], "reorder job 3 pri=max moves that job first"); /* queue_delete */ queue_delete (q, njob[0], njob[0]->queue_handle); queue_delete (q, njob[1], njob[1]->queue_handle); ok (njob[0]->refcount == 1 && njob[1]->refcount == 1, "queue_delete dropped reference on jobs"); errno = 0; ok (queue_lookup_by_id (q, 100) == NULL && errno == ENOENT, "queue_lookup_by_id on deleted job fails with ENOENT"); /* destroy */ queue_destroy (q); ok (job[0]->refcount == 1 && job[1]->refcount == 1 && job[2]->refcount == 1, "queue dropped reference on jobs at destruction"); job_decref (job[0]); job_decref (job[1]); job_decref (job[2]); job_decref (njob[0]); job_decref (njob[1]); done_testing (); }