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() */
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)); }
/** * @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)); }
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() */