/** * @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; }
/* * * query_server - creates a structure of arrays consisting of a server * and all the queues and jobs that reside in that server * * pbs_sd - connection to pbs_server * * returns a pointer to the server_info struct * */ server_info *query_server(int pbs_sd) { struct batch_status *server; /* info about the server */ server_info *sinfo; /* scheduler internal form of server info */ queue_info **qinfo; /* array of queues on the server */ resource *res; /* ptr to cycle through sources on server */ int local_errno = 0; /* get server information from pbs server */ if ((server = pbs_statserver_err(pbs_sd, NULL, NULL, &local_errno)) == NULL) { fprintf(stderr, "pbs_statserver failed: %d\n", local_errno); return NULL; } /* convert batch_status structure into server_info structure */ if ((sinfo = query_server_info(server)) == NULL) { pbs_statfree(server); return NULL; } /* get the nodes, if any */ sinfo -> nodes = query_nodes(pbs_sd, sinfo); /* get the queues */ if ((sinfo -> queues = query_queues(pbs_sd, sinfo)) == NULL) { pbs_statfree(server); free_server(sinfo, 0); return NULL; } /* count the queues and total up the individual queue states * for server totals. (total up all the state_count structs) */ qinfo = sinfo -> queues; while (*qinfo != NULL) { sinfo -> num_queues++; total_states(&(sinfo -> sc), &((*qinfo) -> sc)); qinfo++; } if ((sinfo -> jobs = (job_info **) malloc(sizeof(job_info *) * (sinfo -> sc.total + 1))) == NULL) { free_server(sinfo, 1); perror("Memory allocation error"); return NULL; } set_jobs(sinfo); sinfo -> running_jobs = job_filter(sinfo -> jobs, sinfo -> sc.total, check_run_job, NULL); res = sinfo -> res; while (res != NULL) { if (res -> assigned == UNSPECIFIED) res -> assigned = calc_assn_resource(sinfo -> running_jobs, res -> name); res = res -> next; } sinfo -> timesharing_nodes = node_filter(sinfo -> nodes, sinfo -> num_nodes, is_node_timeshared, NULL); pbs_statfree(server); return sinfo; }