/* Allocate a burst buffer record for a job and increase the job priority * if so configured. * Use bb_free_alloc_rec() to purge the returned record. */ extern bb_alloc_t *bb_alloc_job(bb_state_t *state_ptr, struct job_record *job_ptr, bb_job_t *bb_job) { bb_alloc_t *bb_alloc; bb_alloc = bb_alloc_job_rec(state_ptr, job_ptr, bb_job); return bb_alloc; }
static int _parse_job_info(void **dest, slurm_parser_enum_t type, const char *key, const char *value, const char *line, char **leftover) { s_p_hashtbl_t *job_tbl; char *name = NULL, *tmp = NULL, local_name[64] = ""; uint64_t size = 0; uint32_t job_id = 0, user_id = 0; uint16_t state = 0; bb_alloc_t *bb_ptr; struct job_record *job_ptr = NULL; bb_job_t *bb_spec; static s_p_options_t _job_options[] = { {"JobID",S_P_STRING}, {"Name", S_P_STRING}, {"Size", S_P_STRING}, {"State", S_P_STRING}, {NULL} }; *dest = NULL; user_id = strtol(value, NULL, 10); job_tbl = s_p_hashtbl_create(_job_options); s_p_parse_line(job_tbl, *leftover, leftover); if (s_p_get_string(&tmp, "JobID", job_tbl)) { job_id = strtol(tmp, NULL, 10); xfree(tmp); } if (s_p_get_string(&name, "Name", job_tbl)) { snprintf(local_name, sizeof(local_name), "%s", name); xfree(name); } if (s_p_get_string(&tmp, "Size", job_tbl)) { size = bb_get_size_num(tmp, bb_state.bb_config.granularity); xfree(tmp); } if (s_p_get_string(&tmp, "State", job_tbl)) { state = bb_state_num(tmp); xfree(tmp); } s_p_hashtbl_destroy(job_tbl); #if 0 info("%s: JobID:%u Name:%s Size:%"PRIu64" State:%u UserID:%u", __func__, job_id, local_name, size, state, user_id); #endif if (job_id) { job_ptr = find_job_record(job_id); if (!job_ptr && (state == BB_STATE_STAGED_OUT)) { struct job_record job_rec; job_rec.job_id = job_id; job_rec.user_id = user_id; bb_ptr = bb_find_alloc_rec(&bb_state, &job_rec); _stop_stage_out(job_id); /* Purge buffer */ if (bb_ptr) { bb_ptr->cancelled = true; bb_ptr->end_time = 0; } else { /* Slurm knows nothing about this job, * may be result of slurmctld cold start */ error("%s: Vestigial buffer for purged job %u", plugin_type, job_id); } return SLURM_SUCCESS; } else if (!job_ptr && ((state == BB_STATE_STAGING_IN) || (state == BB_STATE_STAGED_IN))) { struct job_record job_rec; job_rec.job_id = job_id; job_rec.user_id = user_id; bb_ptr = bb_find_alloc_rec(&bb_state, &job_rec); _stop_stage_in(job_id); /* Purge buffer */ if (bb_ptr) { bb_ptr->cancelled = true; bb_ptr->end_time = 0; } else { /* Slurm knows nothing about this job, * may be result of slurmctld cold start */ error("%s: Vestigial buffer for purged job %u", plugin_type, job_id); } return SLURM_SUCCESS; } else if (!job_ptr) { error("%s: Vestigial buffer for job ID %u. " "Clear manually", plugin_type, job_id); } snprintf(local_name, sizeof(local_name), "VestigialJob%u", job_id); } if (job_ptr) { bb_ptr = bb_find_alloc_rec(&bb_state, job_ptr); if (bb_ptr == NULL) { bb_spec = xmalloc(sizeof(bb_job_t)); bb_spec->total_size = _get_bb_size(job_ptr); bb_ptr = bb_alloc_job_rec(&bb_state, job_ptr, bb_spec); xfree(bb_spec); bb_ptr->state = state; /* bb_ptr->state_time set in bb_alloc_job_rec() */ } } else { if ((bb_ptr = _find_bb_name_rec(local_name, user_id)) == NULL) { bb_ptr = bb_alloc_name_rec(&bb_state, local_name, user_id); bb_ptr->size = size; bb_ptr->state = state; //FIXME: VESTIGIAL: Use bb_limit_add // bb_add_user_load(bb_ptr, &bb_state); return SLURM_SUCCESS; } } bb_ptr->seen_time = time(NULL); /* used to purge defunct recs */ /* UserID set to 0 on some failure modes */ if ((bb_ptr->user_id != user_id) && (user_id != 0)) { error("%s: User ID mismatch (%u != %u). " "BB UserID=%u JobID=%u Name=%s", plugin_type, bb_ptr->user_id, user_id, bb_ptr->user_id, bb_ptr->job_id, bb_ptr->name); } if ((bb_ptr->state == BB_STATE_RUNNING) && (state == BB_STATE_STAGED_IN)) state = BB_STATE_RUNNING; /* More precise state info */ if (bb_ptr->state != state) { /* State is subject to real-time changes */ debug("%s: State changed (%s to %s). " "BB UserID=%u JobID=%u Name=%s", plugin_type, bb_state_string(bb_ptr->state), bb_state_string(state), bb_ptr->user_id, bb_ptr->job_id, bb_ptr->name); bb_ptr->state = state; bb_ptr->state_time = time(NULL); if (bb_ptr->state == BB_STATE_STAGED_OUT) { if (bb_ptr->size != 0) { //FIXME: VESTIGIAL: Use bb_limit_rem // bb_remove_user_load(bb_ptr, &bb_state); bb_ptr->size = 0; } } if (bb_ptr->state == BB_STATE_STAGED_IN) queue_job_scheduler(); } if ((bb_ptr->state != BB_STATE_STAGED_OUT) && (bb_ptr->size != size)) { //FIXME: VESTIGIAL: Use bb_limit_rem // bb_remove_user_load(bb_ptr, &bb_state); if (size != 0) { error("%s: Size mismatch (%"PRIu64" != %"PRIu64"). " "BB UserID=%u JobID=%u Name=%s", plugin_type, bb_ptr->size, size, bb_ptr->user_id, bb_ptr->job_id, bb_ptr->name); } bb_ptr->size = MAX(bb_ptr->size, size); //FIXME: VESTIGIAL: Use bb_limit_add // bb_add_user_load(bb_ptr, &bb_state); } return SLURM_SUCCESS; }