Ejemplo n.º 1
0
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);
}
Ejemplo n.º 2
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);
}