static void _process_start(List job_list, char *f[], int lc, int show_full, int len) { filetxt_job_rec_t *job = NULL; filetxt_job_rec_t *temp = NULL; _parse_line(f, (void **)&temp, len); job = _find_job_record(job_list, temp->header, JOB_START); if (job) { /* in slurm we can get 2 start records one for submit * and one for start, so look at the last one */ xfree(job->jobname); job->jobname = xstrdup(temp->jobname); job->track_steps = temp->track_steps; job->priority = temp->priority; job->ncpus = temp->ncpus; xfree(job->nodes); job->nodes = xstrdup(temp->nodes); xfree(job->account); job->account = xstrdup(temp->account); _destroy_filetxt_job_rec(temp); return; } job = temp; job->show_full = show_full; list_append(job_list, job); job->job_start_seen = 1; }
static void _process_terminated(List job_list, char *f[], int lc, int show_full, int len) { filetxt_job_rec_t *job = NULL; filetxt_job_rec_t *temp = NULL; _parse_line(f, (void **)&temp, len); if (temp == NULL) { error("Unknown proccess terminated"); return; } job = _find_job_record(job_list, temp->header, JOB_TERMINATED); if (!job) { /* fake it for now */ job = _create_filetxt_job_rec(temp->header); job->jobname = xstrdup("(unknown)"); debug("Note: JOB_TERMINATED record for job " "%u preceded " "other job records at line %d\n", temp->header.jobnum, lc); } else if (job->job_terminated_seen) { if (temp->status == JOB_NODE_FAIL) { /* multiple node failures - extra TERMINATED records */ debug("Note: Duplicate JOB_TERMINATED " "record (nf) for job %u at " "line %d\n", temp->header.jobnum, lc); /* JOB_TERMINATED/NF records may be preceded * by a JOB_TERMINATED/CA record; NF is much * more interesting. */ job->status = temp->status; goto finished; } fprintf(stderr, "Conflicting JOB_TERMINATED record (%s) for " "job %u at line %d -- ignoring it\n", job_state_string(temp->status), job->header.jobnum, lc); goto finished; } job->job_terminated_seen = 1; job->elapsed = temp->elapsed; job->end = temp->header.timestamp; job->status = temp->status; job->requid = temp->requid; job->exitcode = temp->exitcode; if (list_count(job->steps) > 1) job->track_steps = 1; job->show_full = show_full; finished: _destroy_filetxt_job_rec(temp); }
static void _process_suspend(List job_list, char *f[], int lc, int show_full, int len) { filetxt_job_rec_t *job = NULL; filetxt_job_rec_t *temp = NULL; _parse_line(f, (void **)&temp, len); job = _find_job_record(job_list, temp->header, JOB_SUSPEND); if (!job) { /* fake it for now */ job = _create_filetxt_job_rec(temp->header); job->jobname = xstrdup("(unknown)"); } job->show_full = show_full; if (job->status == JOB_SUSPENDED) job->elapsed -= temp->elapsed; //job->header.timestamp = temp->header.timestamp; job->status = temp->status; _destroy_filetxt_job_rec(temp); }
static filetxt_job_rec_t *_find_job_record(List job_list, filetxt_header_t header, int type) { filetxt_job_rec_t *job = NULL; ListIterator itr = list_iterator_create(job_list); while((job = (filetxt_job_rec_t *)list_next(itr)) != NULL) { if (job->header.jobnum == header.jobnum) { if (job->header.job_submit == 0 && type == JOB_START) { list_remove(itr); _destroy_filetxt_job_rec(job); job = NULL; break; } if (job->header.job_submit == BATCH_JOB_TIMESTAMP) { job->header.job_submit = header.job_submit; break; } if (job->header.job_submit == header.job_submit) break; else { /* If we're looking for a later * record with this job number, we * know that this one is an older, * duplicate record. * We assume that the newer record * will be created if it doesn't * already exist. */ job->jobnum_superseded = 1; } } } list_iterator_destroy(itr); return job; }