int status_job(job *pjob, struct batch_request *preq, svrattrl *pal, pbs_list_head *pstathd, int *bad) { struct brp_status *pstat; time_t tm; long oldtime = 0; int old_elig_flags = 0; int old_atyp_flags = 0; /* see if the client is authorized to status this job */ if (! server.sv_attr[(int)SRV_ATR_query_others].at_val.at_long) if (svr_authorize_jobreq(preq, pjob)) return (PBSE_PERM); if (pjob->ji_qs.ji_svrflags & JOB_SVFLG_ArrayJob) { /* for Array Job, if array_indices_remaining is modified */ /* then need to recalculate the string value */ char *pnewstr; attribute *premain; premain = &pjob->ji_wattr[(int)JOB_ATR_array_indices_remaining]; if (premain->at_flags & ATR_VFLAG_MODCACHE) { pnewstr = cvt_range(pjob->ji_ajtrk, JOB_STATE_QUEUED); if (pnewstr == NULL) pnewstr = "-"; job_attr_def[JOB_ATR_array_indices_remaining].at_free(premain); job_attr_def[JOB_ATR_array_indices_remaining].at_decode(premain, 0, 0, pnewstr); /* also update value of attribute "array_state_count" */ update_subjob_state_ct(pjob); } } /* calc eligible time on the fly and return, don't save. */ if (server.sv_attr[(int)SRV_ATR_EligibleTimeEnable].at_val.at_long != 0) { if (pjob->ji_wattr[(int)JOB_ATR_accrue_type].at_val.at_long == JOB_ELIGIBLE) { time(&tm); oldtime = pjob->ji_wattr[(int)JOB_ATR_eligible_time].at_val.at_long; pjob->ji_wattr[(int)JOB_ATR_eligible_time].at_val.at_long += ((long)tm - pjob->ji_wattr[(int)JOB_ATR_sample_starttime].at_val.at_long); pjob->ji_wattr[(int)JOB_ATR_eligible_time].at_flags |= ATR_VFLAG_MODCACHE; /* Note: ATR_VFLAG_MODCACHE must be set because of svr_cached() does */ /* not correctly check ATR_VFLAG_SET */ } } else { /* eligible_time_enable is off so, */ /* clear set flag so that eligible_time and accrue type dont show */ old_elig_flags = pjob->ji_wattr[(int)JOB_ATR_eligible_time].at_flags; pjob->ji_wattr[(int)JOB_ATR_eligible_time].at_flags &= ~ATR_VFLAG_SET; pjob->ji_wattr[(int)JOB_ATR_eligible_time].at_flags |= (ATR_VFLAG_MODCACHE); old_atyp_flags = pjob->ji_wattr[(int)JOB_ATR_accrue_type].at_flags; pjob->ji_wattr[(int)JOB_ATR_accrue_type].at_flags &= ~ATR_VFLAG_SET; pjob->ji_wattr[(int)JOB_ATR_accrue_type].at_flags |= (ATR_VFLAG_MODCACHE); /* Note: ATR_VFLAG_MODCACHE must be set because of svr_cached() does */ /* not correctly check ATR_VFLAG_SET */ } /* allocate reply structure and fill in header portion */ pstat = (struct brp_status *)malloc(sizeof(struct brp_status)); if (pstat == (struct brp_status *)0) return (PBSE_SYSTEM); CLEAR_LINK(pstat->brp_stlink); pstat->brp_objtype = MGR_OBJ_JOB; (void)strcpy(pstat->brp_objname, pjob->ji_qs.ji_jobid); CLEAR_HEAD(pstat->brp_attr); append_link(pstathd, &pstat->brp_stlink, pstat); /* add attributes to the status reply */ *bad = 0; if (status_attrib(pal, job_attr_def, pjob->ji_wattr, JOB_ATR_LAST, preq->rq_perm, &pstat->brp_attr, bad)) return (PBSE_NOATTR); /* reset eligible time, it was calctd on the fly, real calctn only when accrue_type changes */ if (server.sv_attr[(int)SRV_ATR_EligibleTimeEnable].at_val.at_long != 0) { if (pjob->ji_wattr[(int)JOB_ATR_accrue_type].at_val.at_long == JOB_ELIGIBLE) { pjob->ji_wattr[(int)JOB_ATR_eligible_time].at_val.at_long = oldtime; pjob->ji_wattr[(int)JOB_ATR_eligible_time].at_flags |= ATR_VFLAG_MODCACHE; /* Note: ATR_VFLAG_MODCACHE must be set because of svr_cached() does */ /* not correctly check ATR_VFLAG_SET */ } } else { /* reset the set flags */ pjob->ji_wattr[(int)JOB_ATR_eligible_time].at_flags = old_elig_flags; pjob->ji_wattr[(int)JOB_ATR_accrue_type].at_flags = old_atyp_flags; } return (0); }
/** * @brief * setup_arrayjob_attrs - set up the special attributes of an Array Job * Called as "action" routine for the attribute array_indices_submitted * * @param[in] pattr - pointer to special attributes of an Array Job * @param[in] pobj - pointer to job structure * @param[in] mode - actmode * * @return PBS error * @retval 0 - success */ int setup_arrayjob_attrs(attribute *pattr, void *pobj, int mode) { int i; job *pjob = pobj; if (mode == ATR_ACTION_NEW) { /* validate max array size */ int l, x, y, z, ct; char *ep; if (server.sv_attr[(int)SVR_ATR_maxarraysize].at_flags & ATR_VFLAG_SET) l = server.sv_attr[(int)SVR_ATR_maxarraysize].at_val.at_long; else l = PBS_MAX_ARRAY_JOB_DFL; /* default limit 10000 */ if (parse_subjob_index(pattr->at_val.at_str, &ep, &x, &y, &z, &ct) != 0) return PBSE_BADATVAL; if (ct > l) return PBSE_MaxArraySize; } /* set attribute "array" True and clear "array_state_count" */ pjob->ji_wattr[(int)JOB_ATR_array].at_val.at_long = 1; pjob->ji_wattr[(int)JOB_ATR_array].at_flags = ATR_VFLAG_SET | ATR_VFLAG_MODCACHE; job_attr_def[(int)JOB_ATR_array_state_count].at_free(&pjob->ji_wattr[(int)JOB_ATR_array_state_count]); if (mode == ATR_ACTION_RECOV) { int x, y, z, ct; char *ep; /* on recovery ... */ /* parse the various components again, since we dont store them */ if (parse_subjob_index(pattr->at_val.at_str, &ep, &x, &y, &z, &ct) != 0) return PBSE_BADATVAL; pjob->ji_ajtrk->tkm_ct = ct; pjob->ji_ajtrk->tkm_step = z; pjob->ji_ajtrk->tkm_flags = 0; /* reset counts and any running/exiting subjob to queued */ for (i=0; i < PBS_NUMJOBSTATE; ++i) pjob->ji_ajtrk->tkm_subjsct[i] = 0; for (i=0; i < pjob->ji_ajtrk->tkm_ct; ++i) { if ((pjob->ji_ajtrk->tkm_tbl[i].trk_status == JOB_STATE_RUNNING) || (pjob->ji_ajtrk->tkm_tbl[i].trk_status == JOB_STATE_EXITING)) pjob->ji_ajtrk->tkm_tbl[i].trk_status =JOB_STATE_QUEUED; pjob->ji_ajtrk->tkm_subjsct[pjob->ji_ajtrk->tkm_tbl[i].trk_status]++; } /* clear and reset array_indices_remaining to new value */ job_attr_def[(int)JOB_ATR_array_indices_remaining].at_free(&pjob->ji_wattr[(int)JOB_ATR_array_indices_remaining]); job_attr_def[(int)JOB_ATR_array_indices_remaining].at_decode(&pjob->ji_wattr[(int)JOB_ATR_array_indices_remaining], NULL, NULL, cvt_range(pjob->ji_ajtrk, JOB_STATE_QUEUED)); return (PBSE_NONE); } if ((mode != ATR_ACTION_ALTER) && (mode != ATR_ACTION_NEW)) return PBSE_BADATVAL; if (is_job_array(pjob->ji_qs.ji_jobid) != IS_ARRAY_ArrayJob) return PBSE_BADATVAL; /* not an Array Job */ if (mode == ATR_ACTION_ALTER) { if (pjob->ji_qs.ji_state != JOB_STATE_QUEUED) return PBSE_MODATRRUN; /* cannot modify once begun */ /* clear "array_indices_remaining" so can be reset */ job_attr_def[(int)JOB_ATR_array_indices_remaining].at_free(&pjob->ji_wattr[(int)JOB_ATR_array_indices_remaining]); } /* set "array_indices_remaining" if not already set */ if ((pjob->ji_wattr[(int)JOB_ATR_array_indices_remaining].at_flags & ATR_VFLAG_SET) == 0) job_attr_def[(int)JOB_ATR_array_indices_remaining].at_decode(&pjob->ji_wattr[(int)JOB_ATR_array_indices_remaining], NULL, NULL, pattr->at_val.at_str); /* set other Array related fields in the job structure */ pjob->ji_qs.ji_svrflags |= JOB_SVFLG_ArrayJob; if (mode == ATR_ACTION_NEW) { if (pjob->ji_ajtrk) free(pjob->ji_ajtrk); if ((pjob->ji_ajtrk = mk_subjob_index_tbl(pjob->ji_wattr[(int)JOB_ATR_array_indices_submitted].at_val.at_str, JOB_STATE_QUEUED)) == NULL) return PBSE_BADATVAL; } return (PBSE_NONE); }