📄 node_info.c
字号:
/** 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 + -