⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 node_info.c

📁 openPBS的开放源代码
💻 C
📖 第 1 页 / 共 2 页
字号:
/**         OpenPBS (Portable Batch System) v2.3 Software License* * Copyright (c) 1999-2000 Veridian Information Solutions, Inc.* All rights reserved.* * ---------------------------------------------------------------------------* For a license to use or redistribute the OpenPBS software under conditions* other than those described below, or to purchase support for this software,* please contact Veridian Systems, PBS Products Department ("Licensor") at:* *    www.OpenPBS.org  +1 650 967-4675                  sales@OpenPBS.org*                        877 902-4PBS (US toll-free)* ---------------------------------------------------------------------------* * This license covers use of the OpenPBS v2.3 software (the "Software") at* your site or location, and, for certain users, redistribution of the* Software to other sites and locations.  Use and redistribution of* OpenPBS v2.3 in source and binary forms, with or without modification,* are permitted provided that all of the following conditions are met.* After December 31, 2001, only conditions 3-6 must be met:* * 1. Commercial and/or non-commercial use of the Software is permitted*    provided a current software registration is on file at www.OpenPBS.org.*    If use of this software contributes to a publication, product, or*    service, proper attribution must be given; see www.OpenPBS.org/credit.html* * 2. Redistribution in any form is only permitted for non-commercial,*    non-profit purposes.  There can be no charge for the Software or any*    software incorporating the Software.  Further, there can be no*    expectation of revenue generated as a consequence of redistributing*    the Software.* * 3. Any Redistribution of source code must retain the above copyright notice*    and the acknowledgment contained in paragraph 6, this list of conditions*    and the disclaimer contained in paragraph 7.* * 4. Any Redistribution in binary form must reproduce the above copyright*    notice and the acknowledgment contained in paragraph 6, this list of*    conditions and the disclaimer contained in paragraph 7 in the*    documentation and/or other materials provided with the distribution.* * 5. Redistributions in any form must be accompanied by information on how to*    obtain complete source code for the OpenPBS software and any*    modifications and/or additions to the OpenPBS software.  The source code*    must either be included in the distribution or be available for no more*    than the cost of distribution plus a nominal fee, and all modifications*    and additions to the Software must be freely redistributable by any party*    (including Licensor) without restriction.* * 6. All advertising materials mentioning features or use of the Software must*    display the following acknowledgment:* *     "This product includes software developed by NASA Ames Research Center,*     Lawrence Livermore National Laboratory, and Veridian Information *     Solutions, Inc.*     Visit www.OpenPBS.org for OpenPBS software support,*     products, and information."* * 7. DISCLAIMER OF WARRANTY* * THIS SOFTWARE IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND. ANY EXPRESS* OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES* OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, AND NON-INFRINGEMENT* ARE EXPRESSLY DISCLAIMED.* * IN NO EVENT SHALL VERIDIAN CORPORATION, ITS AFFILIATED COMPANIES, OR THE* U.S. GOVERNMENT OR ANY OF ITS AGENCIES BE LIABLE FOR ANY DIRECT OR INDIRECT,* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,* EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.* * This license will be governed by the laws of the Commonwealth of Virginia,* without reference to its choice of law rules.*/#include <stdio.h>#include <stdlib.h>#include <string.h>#include <ctype.h>#include <sys/types.h>#include <pbs_ifl.h>#include <log.h>#include <rm.h>#include "node_info.h"#include "misc.h"#include "globals.h"static char *ident = "$Id: node_info.c,v 2.6.2.2.2.6 2000/08/09 00:19:00 hender Exp $";/* *      query_nodes - query all the nodes associated with a server * *	  pbs_sd - communication descriptor wit the pbs server *	  sinfo -  server information * *	returns array of nodes associated with server * */node_info **query_nodes( int pbs_sd, server_info *sinfo ){  struct batch_status *nodes;		/* nodes returned from the server */  struct batch_status *cur_node;	/* used to cycle through nodes */  node_info **ninfo_arr;		/* array of nodes for scheduler's use */  node_info *ninfo;			/* used to set up a node */  char errbuf[256];  char *err;				/* used with pbs_geterrmsg() */  int num_nodes = 0;			/* the number of nodes */  int i;  if( ( nodes = pbs_statnode(pbs_sd, NULL, NULL, NULL) ) == NULL )  {    err = pbs_geterrmsg(pbs_sd);    sprintf(errbuf, "Error getting nodes: %s", err);    log(PBSEVENT_SCHED, PBS_EVENTCLASS_NODE, "", errbuf);    return NULL;  }  cur_node = nodes;  while( cur_node != NULL )  {    num_nodes++;    cur_node = cur_node -> next;  }  if( ( ninfo_arr = (node_info **) malloc( (num_nodes + 1) * sizeof(node_info *) ) ) == NULL )  {    perror("Error Allocating Memory");    pbs_statfree(nodes);    return NULL;  }  cur_node = nodes;  for( i = 0; cur_node != NULL; i++ )  {    if( ( ninfo = query_node_info( cur_node, sinfo ) ) == NULL )    {      pbs_statfree(nodes);      free_nodes( ninfo_arr );      return NULL;    }    /* query mom on the node for resources */    talk_with_mom( ninfo );    ninfo_arr[i] = ninfo;    cur_node = cur_node -> next;  }  ninfo_arr[i] = NULL;  sinfo -> num_nodes = num_nodes;  pbs_statfree(nodes);  return ninfo_arr;}/* * *      query_node_info - collect information from a batch_status and *                        put it in a node_info struct for easier access * *	  node - a node returned from a pbs_statnode() call * *	returns a node_info filled with information from node * */node_info *query_node_info( struct batch_status *node, server_info *sinfo ){  node_info *ninfo;		/* the new node_info */  struct attrl *attrp;		/* used to cycle though attribute list */  if( ( ninfo = new_node_info() ) == NULL )    return NULL;    attrp = node -> attribs;  ninfo -> name = string_dup(node -> name);  ninfo -> server = sinfo;  while( attrp != NULL )  {    /* Node State... i.e. offline down free etc */    if( !strcmp(attrp -> name, ATTR_NODE_state ) )      set_node_state( ninfo, attrp -> value );      /* properties from the servers nodes file */    else if( !strcmp( attrp -> name, ATTR_NODE_properties ) )      ninfo -> properties = break_comma_list( attrp -> value );          /* the jobs running on the node */    else if( !strcmp( attrp -> name, ATTR_NODE_jobs) )      ninfo -> jobs = break_comma_list( attrp -> value );      /* the node type... i.e. timesharing or cluster */    else if( !strcmp( attrp -> name, ATTR_NODE_ntype ) )      set_node_type( ninfo, attrp -> value );        attrp = attrp -> next;  }  return ninfo;}/* * *      new_node_info - allocates a new node_info * *	returns the new node_info * */node_info *new_node_info(){  node_info *new;  if( ( new = (node_info *) malloc( sizeof(node_info) ) ) == NULL )  {    perror("Memory Allocation Error");    return NULL;  }  new -> is_down = 0;  new -> is_free = 0;  new -> is_offline = 0;  new -> is_unknown = 0;  new -> is_reserved = 0;  new -> is_exclusive = 0;  new -> is_sharing = 0;  new -> is_timeshare = 0;  new -> is_cluster = 0;  new -> name = NULL;  new -> properties = NULL;  new -> jobs = NULL;  new -> max_load = 0.0;  new -> ideal_load = 0.0;  new -> arch = NULL;  new -> ncpus = 0;  new -> physmem = 0;  new -> loadave = 0.0;  return new;}/* * *	free_nodes - free all the nodes in a node_info array * *	  ninfo_arr - the node info array * *	returns nothing * */void free_nodes( node_info **ninfo_arr ){  int i;  if( ninfo_arr != NULL )  {    for( i = 0; ninfo_arr[i] != NULL; i++ )      free_node_info( ninfo_arr[i] );        free(ninfo_arr);  }}/* * *      free_node_info - frees memory used by a node_info * *	  ninfo - the node to free * *	returns nothing * */void free_node_info( node_info *ninfo ){  if( ninfo != NULL )  {    if( ninfo -> name != NULL )      free(ninfo -> name);        if( ninfo -> properties != NULL )      free_string_array( ninfo -> properties );        if( ninfo -> jobs != NULL )      free_string_array( ninfo -> jobs );        if( ninfo -> arch != NULL )      free( ninfo -> arch );      free(ninfo);  }}/* * *	set_node_type - set the node type bits * *	  ninfo - the node to set the type *	  ntype - the type string from the server *  *	returns non-zero on error * */int set_node_type( node_info *ninfo, char *ntype ){  char errbuf[256];  if( ntype != NULL && ninfo != NULL )  {    if( !strcmp(ntype, ND_timeshared) )      ninfo -> is_timeshare = 1;    else if( !strcmp(ntype, ND_cluster) )      ninfo -> is_cluster = 1;    else    {      sprintf(errbuf, "Unknown node type: %s", ntype);      log( PBSEVENT_SCHED, PBS_EVENTCLASS_NODE, ninfo -> name, errbuf);      return 1;    }    return 0;  }  return 1;}/* * *      set_node_state - set the node state info bits * *	  ninfo - the node to set the state *	  state - the state string from the server * *	returns non-zero on error * */int set_node_state( node_info *ninfo, char *state ){  char errbuf[256];  char *tok;				/* used with strtok() */  if( ninfo != NULL && state != NULL )  {    tok = strtok(state, ",");    while( tok != NULL )    {      while( isspace( (int) *tok ) )	tok++;            if( !strcmp(tok, ND_down) )	ninfo -> is_down = 1;      else if( !strcmp(tok, ND_free) )	ninfo -> is_free = 1;      else if( !strcmp(tok, ND_offline) )	ninfo -> is_offline = 1;      else if( !strcmp(tok, ND_state_unknown) )	ninfo -> is_unknown = 1;      else if( !strcmp( tok, ND_job_exclusive) )	ninfo -> is_exclusive = 1;      else if( !strcmp(tok, ND_job_sharing) )	ninfo -> is_sharing = 1;      else if( !strcmp(tok, ND_reserve) )	ninfo -> is_reserved = 1;      else if( !strcmp(tok, ND_busy) )	ninfo -> is_busy = 1;      else      {	sprintf(errbuf, "Unknown Node State: %s", tok);	log(PBSEVENT_SCHED, PBS_EVENTCLASS_NODE, ninfo -> name, errbuf);      }      tok = strtok(NULL, ",");    }    return 0;  }  return 1;}      /* * *      talk_with_mom - talk to mom and get resources * *	  ninfo - the node to to talk to its mom * *	returns non-zero on error * */int talk_with_mom( node_info *ninfo ){  int mom_sd;			/* connection descriptor to mom */  char *mom_ans;		/* the answer from mom - getreq() */  char *endp;			/* used with strtol() */  double testd;			/* used to convert string -> double */  int testi;			/* used to convert string -> int */

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -