Ejemplo n.º 1
0
int job_route(

  job *jobp)      /* job to route */

  {
  int               bad_state = 0;
  time_t            life;
  time_t            time_now = time(NULL);
  char              log_buf[LOCAL_LOG_BUF_SIZE];

  struct pbs_queue *qp = jobp->ji_qhdr;
  long              retry_time;

  if (qp == NULL)
    return(PBSE_QUENOEN);
  
  if (LOGLEVEL >= 7)
    {
    sprintf(log_buf, "%s", jobp->ji_qs.ji_jobid);
    LOG_EVENT(PBSEVENT_JOB, PBS_EVENTCLASS_JOB, __func__, log_buf);
    }

  /* see if the job is able to be routed */
  switch (jobp->ji_qs.ji_state)
    {

    case JOB_STATE_TRANSIT:

      return(0);  /* already going, ignore it */

      /*NOTREACHED*/

      break;

    case JOB_STATE_QUEUED:

      /* NO-OP */

      break;   /* ok to try */

    case JOB_STATE_HELD:

      /* job may be acceptable */

      bad_state = !qp->qu_attr[QR_ATR_RouteHeld].at_val.at_long;

      break;

    case JOB_STATE_WAITING:

      /* job may be acceptable */

      bad_state = !qp->qu_attr[QR_ATR_RouteWaiting].at_val.at_long;

      break;

    default:

      snprintf(log_buf, sizeof(log_buf), "%s %d %s", 
        pbse_to_txt(PBSE_BADSTATE), jobp->ji_qs.ji_state, __func__);

      log_event(PBSEVENT_DEBUG,PBS_EVENTCLASS_JOB,jobp->ji_qs.ji_jobid,log_buf);
      
      return(PBSE_NONE);

      /*NOTREACHED*/

      break;
    }

  /* check the queue limits, can we route any (more) */
  if (qp->qu_attr[QA_ATR_Started].at_val.at_long == 0)
    {
    /* queue not started - no routing */

    return(0);
    }

  if ((qp->qu_attr[QA_ATR_MaxRun].at_flags & ATR_VFLAG_SET) &&
      (qp->qu_attr[QA_ATR_MaxRun].at_val.at_long <= qp->qu_njstate[JOB_STATE_TRANSIT]))
    {
    /* max number of jobs being routed */

    return(0);
    }

  /* what is the retry time and life time of a job in this queue */

  if (qp->qu_attr[QR_ATR_RouteRetryTime].at_flags & ATR_VFLAG_SET)
    {
    retry_time =
      (long)time_now +
      qp->qu_attr[QR_ATR_RouteRetryTime].at_val.at_long;
    }
  else
    {
    retry_time = (long)time_now + PBS_NET_RETRY_TIME;
    }

  if (qp->qu_attr[QR_ATR_RouteLifeTime].at_flags & ATR_VFLAG_SET)
    {
    life =
      jobp->ji_qs.ji_un.ji_routet.ji_quetime +
      qp->qu_attr[QR_ATR_RouteLifeTime].at_val.at_long;
    }
  else
    {
    life = 0; /* forever */
    }

  if (life && (life < time_now))
    {
    log_event(PBSEVENT_JOB,PBS_EVENTCLASS_JOB,jobp->ji_qs.ji_jobid,msg_routexceed);

    /* job too long in queue */
    return(PBSE_ROUTEEXPD);
    }

  if (bad_state)
    {
    /* not currently routing this job */

    return(PBSE_NONE);
    }

  if (qp->qu_attr[QR_ATR_AltRouter].at_val.at_long == 0)
    {
    return(default_router(jobp, qp, retry_time));
    }

  return(site_alt_router(jobp, qp, retry_time));
  }  /* END job_route() */
Ejemplo n.º 2
0
int
job_route(job *jobp)
{
	int			 bad_state = 0;
	time_t			 life;
	struct pbs_queue	*qp;
	long			 retry_time;

	/* see if the job is able to be routed */

	switch (jobp->ji_qs.ji_state) {

		case JOB_STATE_TRANSIT:
			return (0);		/* already going, ignore it */

		case JOB_STATE_QUEUED:
			break;			/* ok to try */

		case JOB_STATE_HELD:
			bad_state = !jobp->ji_qhdr->qu_attr[QR_ATR_RouteHeld].at_val.at_long;
			break;

		case JOB_STATE_WAITING:
			bad_state = !jobp->ji_qhdr->qu_attr[QR_ATR_RouteWaiting].at_val.at_long;
			break;

		case JOB_STATE_MOVED:
		case JOB_STATE_FINISHED:
			/*
			 * If the job in ROUTE_Q is already deleted (ji_state ==
			 * JOB_STATE_FINISHED) or routed (ji_state == JOB_STATE_MOVED)
			 * and kept for history purpose, then ignore it until being
			 * cleaned up by SERVER.
			 */
			return (0);

		default:
			(void)sprintf(log_buffer, "(%s) %s, state=%d",
				__func__, msg_badstate, jobp->ji_qs.ji_state);
			log_event(PBSEVENT_DEBUG, PBS_EVENTCLASS_JOB, LOG_DEBUG,
				jobp->ji_qs.ji_jobid, log_buffer);
			return (0);
	}

	/* check the queue limits, can we route any (more) */

	qp = jobp->ji_qhdr;
	if (qp->qu_attr[(int)QA_ATR_Started].at_val.at_long == 0)
		return (0);	/* queue not started - no routing */

	if ((qp->qu_attr[(int)QA_ATR_MaxRun].at_flags & ATR_VFLAG_SET) &&
		(qp->qu_attr[(int)QA_ATR_MaxRun].at_val.at_long <=
		qp->qu_njstate[JOB_STATE_TRANSIT]))
		return (0);	/* max number of jobs being routed */

	/* what is the retry time and life time of a job in this queue */

	if (qp->qu_attr[(int)QR_ATR_RouteRetryTime].at_flags & ATR_VFLAG_SET)
		retry_time = (long)time_now +
			qp->qu_attr[(int)QR_ATR_RouteRetryTime].at_val.at_long;
	else
		retry_time = (long)time_now + PBS_NET_RETRY_TIME;

	if (qp->qu_attr[(int)QR_ATR_RouteLifeTime].at_flags & ATR_VFLAG_SET)

		life = jobp->ji_qs.ji_un.ji_routet.ji_quetime +
			qp->qu_attr[(int)QR_ATR_RouteLifeTime].at_val.at_long;
	else
		life = 0;	/* forever */

	if (life && (life < time_now)) {
		log_event(PBSEVENT_JOB, PBS_EVENTCLASS_JOB, LOG_DEBUG,
			jobp->ji_qs.ji_jobid, msg_routexceed);
		return (PBSE_ROUTEEXPD);   /* job too long in queue */
	}

	if (bad_state) 	/* not currently routing this job */
		return (0);		   /* else ignore this job */

	if (qp->qu_attr[(int)QR_ATR_AltRouter].at_val.at_long == 0)
		return (default_router(jobp, qp, retry_time));
	else
		return (site_alt_router(jobp, qp, retry_time));
}
Ejemplo n.º 3
0
/**
 * @brief
 *	function for routing jobs.
 *
 * @param[in] jobp - job pointer
 * @param[in] qp - pointer to queue info
 * @param[in] retry_time - time to retry
 *
 * @return	int
 * @retval	0	success
 * @retval	!0	error
 *
 */
int
site_alt_router(job *jobp, pbs_queue *qp, long retry_time)
{
	return (default_router(jobp, qp, retry_time));
}
Ejemplo n.º 4
0
int job_route(

  job *jobp) /* job to route */

  {
  int      bad_state = 0;
  char     *id = "job_route";
  time_t     life;

  struct pbs_queue *qp;
  long              retry_time;

  /* see if the job is able to be routed */

  switch (jobp->ji_qs.ji_state)
    {

    case JOB_STATE_TRANSIT:

      return(0);  /* already going, ignore it */

      /*NOTREACHED*/

      break;

    case JOB_STATE_QUEUED:

      /* NO-OP */

      break;   /* ok to try */

    case JOB_STATE_HELD:

      /* job may be acceptable */

      bad_state = !jobp->ji_qhdr->qu_attr[QR_ATR_RouteHeld].at_val.at_long;

      break;

    case JOB_STATE_WAITING:

      /* job may be acceptable */

      bad_state = !jobp->ji_qhdr->qu_attr[QR_ATR_RouteWaiting].at_val.at_long;

      break;

    case JOB_STATE_COMPLETE:

      /* job has been deleted */

      job_purge(jobp);

      return(0);

      /*NOTREACHED*/

      break;

    default:

      sprintf(log_buffer, "%s %d", pbse_to_txt(PBSE_BADSTATE),
              jobp->ji_qs.ji_state);

      strcat(log_buffer, id);

      log_event(
        PBSEVENT_DEBUG,
        PBS_EVENTCLASS_JOB,
        jobp->ji_qs.ji_jobid,
        log_buffer);

      return(0);

      /*NOTREACHED*/

      break;
    }

  /* check the queue limits, can we route any (more) */

  qp = jobp->ji_qhdr;

  if (qp->qu_attr[(int)QA_ATR_Started].at_val.at_long == 0)
    {
    /* queue not started - no routing */

    return(0);
    }

  if ((qp->qu_attr[(int)QA_ATR_MaxRun].at_flags & ATR_VFLAG_SET) &&
      (qp->qu_attr[(int)QA_ATR_MaxRun].at_val.at_long <= qp->qu_njstate[JOB_STATE_TRANSIT]))
    {
    /* max number of jobs being routed */

    return(0);
    }

  /* what is the retry time and life time of a job in this queue */

  if (qp->qu_attr[(int)QR_ATR_RouteRetryTime].at_flags & ATR_VFLAG_SET)
    {
    retry_time =
      (long)time_now +
      qp->qu_attr[(int)QR_ATR_RouteRetryTime].at_val.at_long;
    }
  else
    {
    retry_time = (long)time_now + PBS_NET_RETRY_TIME;
    }

  if (qp->qu_attr[(int)QR_ATR_RouteLifeTime].at_flags & ATR_VFLAG_SET)
    {
    life =
      jobp->ji_qs.ji_un.ji_routet.ji_quetime +
      qp->qu_attr[(int)QR_ATR_RouteLifeTime].at_val.at_long;
    }
  else
    {
    life = 0; /* forever */
    }

  if (life && (life < time_now))
    {
    log_event(
      PBSEVENT_JOB,
      PBS_EVENTCLASS_JOB,
      jobp->ji_qs.ji_jobid,
      msg_routexceed);

    /* job too long in queue */

    return(PBSE_ROUTEEXPD);
    }

  if (bad_state)
    {
    /* not currently routing this job */

    return(0);
    }

  if (qp->qu_attr[(int)QR_ATR_AltRouter].at_val.at_long == 0)
    {
    return(default_router(jobp, qp, retry_time));
    }

  return(site_alt_router(jobp, qp, retry_time));
  }  /* END job_route() */