/* * assign_front_end - assign a front end node for starting a job * job_ptr IN - job to assign a front end node (tests access control lists) * RET pointer to the front end node to use or NULL if none found */ extern front_end_record_t *assign_front_end(struct job_record *job_ptr) { #ifdef HAVE_FRONT_END front_end_record_t *front_end_ptr, *best_front_end = NULL; uint32_t state_flags; int i; if (!job_ptr->batch_host && (job_ptr->batch_flag == 0) && (front_end_ptr = find_front_end_record(job_ptr->alloc_node))) { /* Use submit host for interactive job */ if (!IS_NODE_DOWN(front_end_ptr) && !IS_NODE_DRAIN(front_end_ptr) && !IS_NODE_NO_RESPOND(front_end_ptr) && _front_end_access(front_end_ptr, job_ptr)) { best_front_end = front_end_ptr; } else { info("%s: front-end node %s not available for job %u", __func__, job_ptr->alloc_node, job_ptr->job_id); return NULL; } } else { for (i = 0, front_end_ptr = front_end_nodes; i < front_end_node_cnt; i++, front_end_ptr++) { if (job_ptr->batch_host) { /* Find specific front-end */ if (xstrcmp(job_ptr->batch_host, front_end_ptr->name)) continue; if (!_front_end_access(front_end_ptr, job_ptr)) break; } else { /* Find a usable front-end node */ if (IS_NODE_DOWN(front_end_ptr) || IS_NODE_DRAIN(front_end_ptr) || IS_NODE_NO_RESPOND(front_end_ptr)) continue; if (!_front_end_access(front_end_ptr, job_ptr)) continue; } if ((best_front_end == NULL) || (front_end_ptr->job_cnt_run < best_front_end->job_cnt_run)) best_front_end = front_end_ptr; } } if (best_front_end) { state_flags = best_front_end->node_state & NODE_STATE_FLAGS; best_front_end->node_state = NODE_STATE_ALLOCATED | state_flags; best_front_end->job_cnt_run++; return best_front_end; } else if (job_ptr->batch_host) { /* Find specific front-end node */ error("assign_front_end: front end node %s not found", job_ptr->batch_host); } else { /* Find some usable front-end node */ error("assign_front_end: no available front end nodes found"); } #endif return NULL; }
/* * assign_front_end - assign a front end node for starting a job * job_ptr IN - job to assign a front end node (tests access control lists) * RET pointer to the front end node to use or NULL if none found */ extern front_end_record_t *assign_front_end(struct job_record *job_ptr) { #ifdef HAVE_FRONT_END front_end_record_t *front_end_ptr, *best_front_end = NULL; uint32_t state_flags; int i; for (i = 0, front_end_ptr = front_end_nodes; i < front_end_node_cnt; i++, front_end_ptr++) { if (job_ptr->batch_host) { /* Find specific front-end node */ if (strcmp(job_ptr->batch_host, front_end_ptr->name)) continue; if (!_front_end_access(front_end_ptr, job_ptr)) break; } else { /* Find some usable front-end node */ if (IS_NODE_DOWN(front_end_ptr) || IS_NODE_DRAIN(front_end_ptr) || IS_NODE_NO_RESPOND(front_end_ptr)) continue; if (!_front_end_access(front_end_ptr, job_ptr)) continue; } if ((best_front_end == NULL) || (front_end_ptr->job_cnt_run < best_front_end->job_cnt_run)) best_front_end = front_end_ptr; } if (best_front_end) { state_flags = best_front_end->node_state & NODE_STATE_FLAGS; best_front_end->node_state = NODE_STATE_ALLOCATED | state_flags; best_front_end->job_cnt_run++; return best_front_end; } else if (job_ptr->batch_host) { /* Find specific front-end node */ error("assign_front_end: front end node %s not found", job_ptr->batch_host); } else { /* Find some usable front-end node */ error("assign_front_end: no available front end nodes found"); } #endif return NULL; }
/* * assign_front_end - assign a front end node for starting a job * job_ptr IN - job to assign a front end node (tests access control lists) * RET pointer to the front end node to use or NULL if none found */ extern front_end_record_t *assign_front_end(struct job_record *job_ptr) { #ifdef HAVE_FRONT_END static int last_assigned = -1; front_end_record_t *front_end_ptr; uint16_t state_flags; int i; for (i = 0; i < front_end_node_cnt; i++) { last_assigned = (last_assigned + 1) % front_end_node_cnt; front_end_ptr = front_end_nodes + last_assigned; if (job_ptr->batch_host) { /* Find specific front-end node */ if (strcmp(job_ptr->batch_host, front_end_ptr->name)) continue; if (!_front_end_access(front_end_ptr, job_ptr)) break; } else { /* Find some usable front-end node */ if (IS_NODE_DOWN(front_end_ptr) || IS_NODE_DRAIN(front_end_ptr) || IS_NODE_NO_RESPOND(front_end_ptr)) continue; if (!_front_end_access(front_end_ptr, job_ptr)) continue; } state_flags = front_end_nodes[last_assigned].node_state & NODE_STATE_FLAGS; front_end_nodes[last_assigned].node_state = NODE_STATE_ALLOCATED | state_flags; front_end_nodes[last_assigned].job_cnt_run++; return front_end_ptr; } if (job_ptr->batch_host) { /* Find specific front-end node */ error("assign_front_end: front end node %s not found", job_ptr->batch_host); } else { /* Find some usable front-end node */ error("assign_front_end: no available front end nodes found"); } #endif return NULL; }
/* * avail_front_end - test if any front end nodes are available for starting job * job_ptr IN - job to consider for starting (tests access control lists) or * NULL to test if any job can start (no test of ACL) */ extern bool avail_front_end(struct job_record *job_ptr) { #ifdef HAVE_FRONT_END front_end_record_t *front_end_ptr; int i; for (i = 0, front_end_ptr = front_end_nodes; i < front_end_node_cnt; i++, front_end_ptr++) { if (IS_NODE_DOWN(front_end_ptr) || IS_NODE_DRAIN(front_end_ptr) || IS_NODE_NO_RESPOND(front_end_ptr)) continue; if (!_front_end_access(front_end_ptr, job_ptr)) continue; return true; } return false; #else return true; #endif }