queue_info * query_queue_info(status *policy, struct batch_status *queue, server_info *sinfo) { struct attrl *attrp; /* linked list of attributes from server */ struct queue_info *qinfo; /* queue_info being created */ schd_resource *resp; /* resource in resource qres list */ char *endp; /* used with strtol() */ sch_resource_t count; /* used to convert string -> num */ if ((qinfo = new_queue_info(1)) == NULL) return NULL; if (qinfo->liminfo == NULL) return NULL; if ((qinfo->name = string_dup(queue->name)) == NULL) { free_queue_info(qinfo); return NULL; } attrp = queue->attribs; qinfo->server = sinfo; while (attrp != NULL) { if (!strcmp(attrp->name, ATTR_start)) { /* started */ if (!strcmp(attrp->value, ATR_TRUE)) qinfo->is_started = 1; else qinfo->is_started = 0; } else if (!strcmp(attrp->name, ATTR_HasNodes)) { if (!strcmp(attrp->value, ATR_TRUE)) { sinfo->has_nodes_assoc_queue = 1; qinfo->has_nodes = 1; } else qinfo->has_nodes = 0; } else if(!strcmp(attrp->name, ATTR_backfill_depth)) { qinfo->backfill_depth = strtol(attrp->value, NULL, 10); if(qinfo->backfill_depth > 0) policy->backfill = 1; } else if(!strcmp(attrp->name, ATTR_partition)) { if (attrp->value != NULL) { qinfo->partition = string_dup(attrp->value); if (qinfo->partition == NULL) { log_err(errno, __func__, MEM_ERR_MSG); free_queue_info(qinfo); return NULL; } } } else if (is_reslimattr(attrp)) { (void) lim_setlimits(attrp, LIM_RES, qinfo->liminfo); if(strstr(attrp->value, "u:") != NULL) sinfo->has_user_limit = 1; if(strstr(attrp->value, "g:") != NULL) sinfo->has_grp_limit = 1; if(strstr(attrp->value, "p:") != NULL) sinfo->has_proj_limit = 1; } else if (is_runlimattr(attrp)) { (void) lim_setlimits(attrp, LIM_RUN, qinfo->liminfo); if(strstr(attrp->value, "u:") != NULL) sinfo->has_user_limit = 1; if(strstr(attrp->value, "g:") != NULL) sinfo->has_grp_limit = 1; if(strstr(attrp->value, "p:") != NULL) sinfo->has_proj_limit = 1; } else if (is_oldlimattr(attrp)) { char *limname = convert_oldlim_to_new(attrp); (void) lim_setlimits(attrp, LIM_OLD, qinfo->liminfo); if(strstr(limname, "u:") != NULL) sinfo->has_user_limit = 1; if(strstr(limname, "g:") != NULL) sinfo->has_grp_limit = 1; /* no need to check for project limits because there were no old style project limits */ } else if (!strcmp(attrp->name, ATTR_p)) { /* priority */ count = strtol(attrp->value, &endp, 10); if (*endp != '\0') count = -1; qinfo->priority = count; } else if (!strcmp(attrp->name, ATTR_qtype)) { /* queue_type */ if (!strcmp(attrp->value, "Execution")) { qinfo->is_exec = 1; qinfo->is_route = 0; } else if (!strcmp(attrp->value, "Route")) { qinfo->is_route = 1; qinfo->is_exec = 0; } } else if (!strcmp(attrp->name, ATTR_NodeGroupKey)) qinfo->node_group_key = break_comma_list(attrp->value); else if (!strcmp(attrp->name, ATTR_rescavail)) { /* resources_available*/ #ifdef NAS /* localmod 040 */ if (!strcmp(attrp->resource, ATTR_ignore_nodect_sort)) { if (!strcmp(attrp->value, ATR_TRUE)) qinfo->ignore_nodect_sort = 1; else qinfo->ignore_nodect_sort = 0; resp = NULL; }/* localmod 038 */ else if (!strcmp(attrp->resource, ATTR_topjob_setaside)) { if (!strcmp(attrp->value, ATR_TRUE)) qinfo->is_topjob_set_aside = 1; else qinfo->is_topjob_set_aside = 0; resp = NULL; } else #endif resp = find_alloc_resource_by_str(qinfo->qres, attrp->resource); if (resp != NULL) { if (qinfo->qres == NULL) qinfo->qres = resp; if (set_resource(resp, attrp->value, RF_AVAIL) == 0) { free_queue_info(qinfo); return NULL; } qinfo->has_resav_limit = 1; } } else if (!strcmp(attrp->name, ATTR_rescassn)) { /* resources_assigned */ resp = find_alloc_resource_by_str(qinfo->qres, attrp->resource); if (qinfo->qres == NULL) qinfo->qres = resp; if (resp != NULL) { if (set_resource(resp, attrp->value, RF_ASSN) == 0) { free_queue_info(qinfo); return NULL; } } } #ifdef NAS /* localmod 046 */ else if (!strcmp(attrp->name, ATTR_maxstarve)) { time_t starve; starve = site_decode_time(attrp->value); qinfo->max_starve = starve; } /* localmod 034 */ else if (!strcmp(attrp->name, ATTR_maxborrow)) { time_t borrow; borrow = site_decode_time(attrp->value); qinfo->max_borrow = borrow; } #endif attrp = attrp->next; } if (has_hardlimits(qinfo->liminfo)) qinfo->has_hard_limit = 1; if (has_softlimits(qinfo->liminfo)) qinfo->has_soft_limit = 1; return qinfo; }
/** * @brief * dup_queue_info - duplicate a queue_info structure * * @param[in] oqinfo - the queue_info to copy * @param[in] nsinfo - the server which owns the duplicated queue * * @return duplicated queue_info struct * @retval NULL : on error * */ queue_info * dup_queue_info(queue_info *oqinfo, server_info *nsinfo) { queue_info *nqinfo; if ((nqinfo = new_queue_info(0)) == NULL) return NULL; nqinfo->name = string_dup(oqinfo->name); nqinfo->server = nsinfo; nqinfo->is_started = oqinfo->is_started; nqinfo->is_exec = oqinfo->is_exec; nqinfo->is_route = oqinfo->is_route; nqinfo->is_ok_to_run = oqinfo->is_ok_to_run; nqinfo->is_ded_queue = oqinfo->is_ded_queue; nqinfo->is_prime_queue = oqinfo->is_prime_queue; nqinfo->is_nonprime_queue = oqinfo->is_nonprime_queue; nqinfo->has_nodes = oqinfo->has_nodes; nqinfo->has_soft_limit = oqinfo->has_soft_limit; nqinfo->has_hard_limit = oqinfo->has_hard_limit; nqinfo->is_peer_queue = oqinfo->is_peer_queue; nqinfo->has_resav_limit = oqinfo->has_resav_limit; nqinfo->sc = oqinfo->sc; nqinfo->liminfo = lim_dup_liminfo(oqinfo->liminfo); nqinfo->priority = oqinfo->priority; nqinfo->num_parts = oqinfo->num_parts; nqinfo->num_topjobs = oqinfo->num_topjobs; nqinfo->backfill_depth = oqinfo->backfill_depth; #ifdef NAS /* localmod 046 */ nqinfo->max_starve = oqinfo->max_starve; /* localmod 034 */ nqinfo->max_borrow = oqinfo->max_borrow; /* localmod 038 */ nqinfo->is_topjob_set_aside = oqinfo->is_topjob_set_aside; /* localmod 040 */ nqinfo->ignore_nodect_sort = oqinfo->ignore_nodect_sort; #endif nqinfo->qres = dup_resource_list(oqinfo->qres); nqinfo->alljobcounts = dup_counts_list(oqinfo->alljobcounts); nqinfo->group_counts = dup_counts_list(oqinfo->group_counts); nqinfo->project_counts = dup_counts_list(oqinfo->project_counts); nqinfo->user_counts = dup_counts_list(oqinfo->user_counts); nqinfo->total_alljobcounts = dup_counts_list(oqinfo->total_alljobcounts); nqinfo->total_group_counts = dup_counts_list(oqinfo->total_group_counts); nqinfo->total_project_counts = dup_counts_list(oqinfo->total_project_counts); nqinfo->total_user_counts = dup_counts_list(oqinfo->total_user_counts); nqinfo->nodepart = dup_node_partition_array(oqinfo->nodepart, nsinfo); nqinfo->allpart = dup_node_partition(oqinfo->allpart, nsinfo); nqinfo->node_group_key = dup_string_array(oqinfo->node_group_key); if (oqinfo->resv != NULL) { nqinfo->resv = find_resource_resv_by_rank(nsinfo->resvs, oqinfo->resv->rank); /* just incase we we didn't set the reservation cross pointer */ if (nqinfo->resv != NULL && nqinfo->resv->resv != NULL) nqinfo->resv->resv->resv_queue = nqinfo; } nqinfo->jobs = dup_resource_resv_array(oqinfo->jobs, nqinfo->server, nqinfo); if (nqinfo->jobs != NULL) nqinfo->running_jobs = resource_resv_filter(nqinfo->jobs, nqinfo->sc.total, check_run_job, NULL, 0); if (oqinfo->nodes != NULL) nqinfo->nodes = node_filter(nsinfo->nodes, nsinfo->num_nodes, node_queue_cmp, (void *) nqinfo->name, 0); if (oqinfo->nodes_in_partition != NULL) nqinfo->nodes_in_partition = node_filter(nsinfo->nodes, nsinfo->num_nodes, node_partition_cmp, (void *) oqinfo->partition, 0); if (oqinfo->partition != NULL) { nqinfo->partition = string_dup(oqinfo->partition); if (nqinfo->partition == NULL) { free_queue_info(nqinfo); return NULL; } } return nqinfo; }
queue_info *query_queue_info(struct batch_status *queue, server_info *sinfo) { struct attrl *attrp; /* linked list of attributes from server */ struct queue_info *qinfo; /* queue_info being created */ resource *resp; /* resource in resource qres list */ char *endp; /* used with strtol() */ int count; /* used to convert string -> integer */ if ((qinfo = new_queue_info()) == NULL) return NULL; attrp = queue -> attribs; qinfo -> name = string_dup(queue -> name); qinfo -> server = sinfo; while (attrp != NULL) { if (!strcmp(attrp -> name, ATTR_start)) /* started */ { if (!strcmp(attrp -> value, "True")) qinfo -> is_started = 1; } else if (!strcmp(attrp -> name, ATTR_maxrun)) /* max_running */ { count = strtol(attrp -> value, &endp, 10); if (*endp != '\0') count = -1; qinfo -> max_run = count; } else if (!strcmp(attrp -> name, ATTR_maxuserrun)) /* max_user_run */ { count = strtol(attrp -> value, &endp, 10); if (*endp != '\0') count = -1; qinfo -> max_user_run = count; } else if (!strcmp(attrp -> name, ATTR_maxgrprun)) /* max_group_run */ { count = strtol(attrp -> value, &endp, 10); if (*endp != '\0') count = -1; qinfo -> max_group_run = count; } else if (!strcmp(attrp -> name, ATTR_p)) /* priority */ { count = strtol(attrp -> value, &endp, 10); if (*endp != '\0') count = -1; qinfo -> priority = count; } else if (!strcmp(attrp -> name, ATTR_qtype)) /* queue_type */ { if (!strcmp(attrp -> value, "Execution")) { qinfo -> is_exec = 1; qinfo -> is_route = 0; } else if (!strcmp(attrp -> value, "Route")) { qinfo -> is_route = 1; qinfo -> is_exec = 0; } } else if (!strcmp(attrp -> name, ATTR_rescavail)) /* resources_available*/ { count = res_to_num(attrp -> value); resp = find_alloc_resource(qinfo -> qres, attrp -> resource); if (qinfo -> qres == NULL) qinfo -> qres = resp; if (resp != NULL) resp -> avail = count; } else if (!strcmp(attrp -> name, ATTR_rescmax)) /* resources_max */ { count = res_to_num(attrp -> value); resp = find_alloc_resource(qinfo -> qres, attrp -> resource); if (qinfo -> qres == NULL) qinfo -> qres = resp; if (resp != NULL) resp -> max = count; } else if (!strcmp(attrp -> name, ATTR_rescassn)) /* resources_assigned */ { count = res_to_num(attrp -> value); resp = find_alloc_resource(qinfo -> qres, attrp -> resource); if (qinfo -> qres == NULL) qinfo -> qres = resp; if (resp != NULL) resp -> assigned = count; } attrp = attrp -> next; } return qinfo; }