extern List filetxt_jobacct_process_get_jobs(slurmdb_job_cond_t *job_cond) { char line[BUFFER_SIZE]; char *f[MAX_RECORD_FIELDS+1]; /* End list with null entry and, possibly, more data than we expected */ char *fptr = NULL, *filein = NULL; int i; FILE *fd = NULL; int lc = 0; int rec_type = -1; int job_id = 0, step_id = 0, uid = 0, gid = 0; filetxt_job_rec_t *filetxt_job = NULL; slurmdb_selected_step_t *selected_step = NULL; char *object = NULL; ListIterator itr = NULL, itr2 = NULL; int show_full = 0; int fdump_flag = 0; List ret_job_list = list_create(slurmdb_destroy_job_rec); List job_list = list_create(_destroy_filetxt_job_rec); filein = slurm_get_accounting_storage_loc(); /* we grab the fdump only for the filetxt plug through the FDUMP_FLAG on the job_cond->duplicates variable. We didn't add this extra field to the structure since it only applies to this plugin. */ if(job_cond) { fdump_flag = job_cond->duplicates & FDUMP_FLAG; job_cond->duplicates &= (~FDUMP_FLAG); if(!job_cond->duplicates) itr2 = list_iterator_create(ret_job_list); } fd = _open_log_file(filein); while (fgets(line, BUFFER_SIZE, fd)) { lc++; fptr = line; /* break the record into NULL- terminated strings */ for (i = 0; i < MAX_RECORD_FIELDS; i++) { f[i] = fptr; fptr = strstr(fptr, " "); if (fptr == NULL) { fptr = strstr(f[i], "\n"); if (fptr) *fptr = 0; break; } else { *fptr++ = 0; } } if (i < MAX_RECORD_FIELDS) i++; f[i] = 0; if (i < HEADER_LENGTH) { continue; } rec_type = atoi(f[F_RECTYPE]); job_id = atoi(f[F_JOB]); uid = atoi(f[F_UID]); gid = atoi(f[F_GID]); if(rec_type == JOB_STEP) step_id = atoi(f[F_JOBSTEP]); else step_id = NO_VAL; if(!job_cond) { show_full = 1; goto no_cond; } if (job_cond->userid_list && list_count(job_cond->userid_list)) { itr = list_iterator_create(job_cond->userid_list); while((object = list_next(itr))) { if (atoi(object) == uid) { list_iterator_destroy(itr); goto founduid; } } list_iterator_destroy(itr); continue; /* no match */ } founduid: if (job_cond->groupid_list && list_count(job_cond->groupid_list)) { itr = list_iterator_create(job_cond->groupid_list); while((object = list_next(itr))) { if (atoi(object) == gid) { list_iterator_destroy(itr); goto foundgid; } } list_iterator_destroy(itr); continue; /* no match */ } foundgid: if (job_cond->jobname_list && list_count(job_cond->jobname_list)) { itr = list_iterator_create(job_cond->jobname_list); while((object = list_next(itr))) { if (!strcasecmp(f[F_JOBNAME], object)) { list_iterator_destroy(itr); goto foundjobname; } } list_iterator_destroy(itr); continue; /* no match */ } foundjobname: if (job_cond->step_list && list_count(job_cond->step_list)) { itr = list_iterator_create(job_cond->step_list); while((selected_step = list_next(itr))) { if (selected_step->jobid != job_id) continue; /* job matches; does the step? */ if(selected_step->stepid == NO_VAL) { show_full = 1; list_iterator_destroy(itr); goto foundjob; } else if (rec_type != JOB_STEP || selected_step->stepid == step_id) { list_iterator_destroy(itr); goto foundjob; } } list_iterator_destroy(itr); continue; /* no match */ } else { show_full = 1; } foundjob: if (job_cond->partition_list && list_count(job_cond->partition_list)) { itr = list_iterator_create(job_cond->partition_list); while((object = list_next(itr))) if (!strcasecmp(f[F_PARTITION], object)) { list_iterator_destroy(itr); goto foundp; } list_iterator_destroy(itr); continue; /* no match */ } foundp: if (fdump_flag) { _do_fdump(f, lc); continue; } no_cond: /* Build suitable tables with all the data */ switch(rec_type) { case JOB_START: if(i < F_JOB_ACCOUNT) { error("Bad data on a Job Start"); _show_rec(f); } else _process_start(job_list, f, lc, show_full, i); break; case JOB_STEP: if(i < F_MAX_VSIZE) { error("Bad data on a Step entry"); _show_rec(f); } else _process_step(job_list, f, lc, show_full, i); break; case JOB_SUSPEND: if(i < F_JOB_REQUID) { error("Bad data on a Suspend entry"); _show_rec(f); } else _process_suspend(job_list, f, lc, show_full, i); break; case JOB_TERMINATED: if(i < F_JOB_REQUID) { error("Bad data on a Job Term"); _show_rec(f); } else _process_terminated(job_list, f, lc, show_full, i); break; default: debug("Invalid record at line %d of input file", lc); _show_rec(f); break; } } if (ferror(fd)) { perror(filein); exit(1); } fclose(fd); itr = list_iterator_create(job_list); while((filetxt_job = list_next(itr))) { slurmdb_job_rec_t *slurmdb_job = _slurmdb_create_job_rec(filetxt_job, job_cond); if(slurmdb_job) { slurmdb_job_rec_t *curr_job = NULL; if(itr2) { list_iterator_reset(itr2); while((curr_job = list_next(itr2))) { if (curr_job->jobid == slurmdb_job->jobid) { list_delete_item(itr2); info("removing job %d", slurmdb_job->jobid); break; } } } list_append(ret_job_list, slurmdb_job); } } if(itr2) list_iterator_destroy(itr2); list_iterator_destroy(itr); list_destroy(job_list); xfree(filein); return ret_job_list; }
extern List filetxt_jobcomp_process_get_jobs(slurmdb_job_cond_t *job_cond) { char line[BUFFER_SIZE]; char *fptr = NULL, *filein = NULL; int jobid = 0; char *partition = NULL; FILE *fd = NULL; int lc = 0; jobcomp_job_rec_t *job = NULL; slurmdb_selected_step_t *selected_step = NULL; char *selected_part = NULL; ListIterator itr = NULL; List job_info_list = NULL; filetxt_jobcomp_info_t *jobcomp_info = NULL; List job_list = list_create(jobcomp_destroy_job); int fdump_flag = 0; /* we grab the fdump only for the filetxt plug through the FDUMP_FLAG on the job_cond->duplicates variable. We didn't add this extra field to the structure since it only applies to this plugin. */ if(job_cond) { fdump_flag = job_cond->duplicates & FDUMP_FLAG; job_cond->duplicates &= (~FDUMP_FLAG); } filein = slurm_get_jobcomp_loc(); fd = _open_log_file(filein); while (fgets(line, BUFFER_SIZE, fd)) { lc++; fptr = line; /* break the record into NULL- terminated strings */ if(job_info_list) list_destroy(job_info_list); jobid = 0; partition = NULL; job_info_list = list_create(_destroy_filetxt_jobcomp_info); while(fptr) { jobcomp_info = xmalloc(sizeof(filetxt_jobcomp_info_t)); list_append(job_info_list, jobcomp_info); jobcomp_info->name = fptr; fptr = strstr(fptr, "="); *fptr++ = 0; jobcomp_info->val = fptr; fptr = strstr(fptr, " "); if(!strcasecmp("JobId", jobcomp_info->name)) jobid = atoi(jobcomp_info->val); else if(!strcasecmp("Partition", jobcomp_info->name)) partition = jobcomp_info->val; if(!fptr) { fptr = strstr(jobcomp_info->val, "\n"); if (fptr) *fptr = 0; break; } else { *fptr++ = 0; if(*fptr == '\n') { *fptr = 0; break; } } } if (job_cond->step_list && list_count(job_cond->step_list)) { if(!jobid) continue; itr = list_iterator_create(job_cond->step_list); while((selected_step = list_next(itr))) { if (selected_step->jobid == jobid) continue; /* job matches */ list_iterator_destroy(itr); goto foundjob; } list_iterator_destroy(itr); continue; /* no match */ } foundjob: if (job_cond->partition_list && list_count(job_cond->partition_list)) { if(!partition) continue; itr = list_iterator_create(job_cond->partition_list); while((selected_part = list_next(itr))) if (!strcasecmp(selected_part, partition)) { list_iterator_destroy(itr); goto foundp; } list_iterator_destroy(itr); continue; /* no match */ } foundp: if (fdump_flag) { _do_fdump(job_info_list, lc); continue; } job = _parse_line(job_info_list); if(job) list_append(job_list, job); } if(job_info_list) list_destroy(job_info_list); if (ferror(fd)) { perror(filein); xfree(filein); exit(1); } fclose(fd); xfree(filein); return job_list; }