Beispiel #1
0
/**
 * @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;
}
Beispiel #2
0
/*
 *
 * 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;
  }