extern int select_p_job_fini(struct job_record *job_ptr) { if (job_ptr == NULL) return SLURM_SUCCESS; if (do_basil_release(job_ptr) != SLURM_SUCCESS) return SLURM_ERROR; /* * Convention: like select_p_job_ready, may be called also from * stepdmgr, where job_state == NO_VAL is used to * distinguish the context from that of slurmctld. */ if (job_ptr->job_state == (uint16_t)NO_VAL) return SLURM_SUCCESS; return other_job_fini(job_ptr); }
extern int select_p_job_fini(struct job_record *job_ptr) { select_jobinfo_t *jobinfo = job_ptr->select_jobinfo->data; if (slurmctld_conf.select_type_param & CR_NHC_NO) { debug3("NHC_No set, not running NHC after allocations"); other_job_fini(job_ptr); return SLURM_SUCCESS; } jobinfo->cleaning = 1; _spawn_cleanup_thread(job_ptr, _job_fini); return SLURM_SUCCESS; }
static void *_job_fini(void *args) { struct job_record *job_ptr = (struct job_record *)args; nhc_info_t nhc_info; /* Locks: Write job, write node */ slurmctld_lock_t job_write_lock = { NO_LOCK, WRITE_LOCK, WRITE_LOCK, NO_LOCK }; slurmctld_lock_t job_read_lock = { NO_LOCK, READ_LOCK, NO_LOCK, NO_LOCK }; if (!job_ptr) { error("_job_fini: no job ptr given, this should never happen"); return NULL; } memset(&nhc_info, 0, sizeof(nhc_info_t)); lock_slurmctld(job_read_lock); nhc_info.jobid = job_ptr->job_id; nhc_info.nodelist = xstrdup(job_ptr->nodes); nhc_info.exit_code = 1; /* hard code to 1 to always run */ nhc_info.user_id = job_ptr->user_id; unlock_slurmctld(job_read_lock); /* run NHC */ _run_nhc(&nhc_info); /***********/ xfree(nhc_info.nodelist); lock_slurmctld(job_write_lock); if (job_ptr->magic == JOB_MAGIC) { select_jobinfo_t *jobinfo = NULL; other_job_fini(job_ptr); jobinfo = job_ptr->select_jobinfo->data; jobinfo->cleaning = 0; } else error("_job_fini: job %u had a bad magic, " "this should never happen", nhc_info.jobid); unlock_slurmctld(job_write_lock); return NULL; }
static void *_job_fini(void *args) { struct job_record *job_ptr = (struct job_record *)args; uint32_t job_id = 0; char *node_list = NULL; /* Locks: Write job, write node */ slurmctld_lock_t job_write_lock = { NO_LOCK, WRITE_LOCK, WRITE_LOCK, NO_LOCK }; slurmctld_lock_t job_read_lock = { NO_LOCK, READ_LOCK, NO_LOCK, NO_LOCK }; if (!job_ptr) { error("_job_fini: no job ptr given, this should never happen"); return NULL; } lock_slurmctld(job_read_lock); job_id = job_ptr->job_id; node_list = xstrdup(job_ptr->nodes); unlock_slurmctld(job_read_lock); /* run NHC */ _run_nhc(job_id, node_list, 0); /***********/ xfree(node_list); lock_slurmctld(job_write_lock); if (job_ptr->magic == JOB_MAGIC) { select_jobinfo_t *jobinfo = NULL; other_job_fini(job_ptr); jobinfo = job_ptr->select_jobinfo->data; jobinfo->cleaning = 0; } else error("_job_fini: job %u had a bad magic, " "this should never happen", job_id); unlock_slurmctld(job_write_lock); return NULL; }
extern int select_p_job_fini(struct job_record *job_ptr) { if (job_ptr == NULL) return SLURM_SUCCESS; /* Don't run the release in the controller for batch jobs. It is * handled on the stepd end. */ if (((slurmctld_primary && !job_ptr->batch_flag) || (job_ptr->job_state == NO_VAL)) && !_zero_size_job(job_ptr) && (do_basil_release(job_ptr) != SLURM_SUCCESS)) return SLURM_ERROR; /* * Convention: like select_p_job_ready, may be called also from * stepdmgr, where job_state == NO_VAL is used to * distinguish the context from that of slurmctld. */ if (job_ptr->job_state == NO_VAL) return SLURM_SUCCESS; return other_job_fini(job_ptr); }