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

📄 check.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 <pbs_ifl.h>#include <log.h>#include "check.h"#include "config.h"#include "server_info.h"#include "queue_info.h"#include "job_info.h"#include "misc.h"#include "constant.h"#include "globals.h"#include "dedtime.h"static char *ident = "$Id: check.c,v 2.4.2.1.2.6 2000/08/09 00:18:56 hender Exp $";/* * *	is_ok_to_run_in_queue - check to see if jobs can be run in a queue * *	  qinfo - queue info  * *	returns SUCCESS on success or failure code * *	NOTE: This function will be run once per queue every scheduling cycle * */int is_ok_to_run_queue( queue_info *qinfo ){  int rc = UNSPECIFIED;		/* Return Code */  if( qinfo -> is_exec )  {    if( qinfo -> is_started )    {      if( !( rc = check_ded_time_queue( qinfo ) ) )      {        rc = SUCCESS;      }    }    else      rc = QUEUE_NOT_STARTED;  }  else    rc = QUEUE_NOT_EXEC;  return rc;}/* * *	is_ok_to_run_job - check to see if the job can currently fit into the  *				system limits * *	  pbs_sd - the connection descriptor to the pbs_server *	  sinfo - server info *	  qinfo - queue info *	  jinfo - job info * *	returns  0 on success or failure code * * */int is_ok_to_run_job( int pbs_sd, server_info *sinfo, queue_info *qinfo,                                                        job_info *jinfo){  int rc;                       /* Return Code */  if( (rc = check_server_max_run( sinfo )) )    return rc;  if( (rc = check_server_max_user_run(sinfo, jinfo -> account) ) )    return rc;  if( ( rc = check_server_max_group_run( sinfo, jinfo -> group) ) )    return rc;  if( ( rc = check_queue_max_run( qinfo ) ) )    return rc;  if( ( rc = check_queue_max_user_run( qinfo, jinfo -> account) ) )    return rc;  if( ( rc = check_queue_max_group_run( qinfo, jinfo -> group) ) )    return rc;  if( (rc = check_ded_time_boundry( jinfo ) ) )    return rc;  if( ( rc = check_starvation( jinfo ) ) )    return rc;  if( ( rc = check_nodes( pbs_sd, jinfo, sinfo -> timesharing_nodes )))    return rc;    if( ( rc = check_avail_resources(qinfo -> qres, jinfo) ) != SUCCESS )    return rc;  if( ( rc = check_avail_resources(sinfo -> res, jinfo) ) != SUCCESS )    return rc;  return SUCCESS;}/*  * *	check_server_max_user_run - check if the user is within server  *					user run limits * *	  sinfo - the server *	  account - the account name * *	returns  *	  0: if the user has not reached their limit *	  SERVER_USER_LIMIT_REACHED: if the user has reached their limit * */int check_server_max_user_run( server_info *sinfo, char *account ){  if( sinfo -> max_user_run == INFINITY ||       count_by_user( sinfo -> running_jobs, account ) < sinfo -> max_user_run)    return 0;    return SERVER_USER_LIMIT_REACHED;}/* * *	check_queue_max_user_run - check if the user is within queue  *					user run limits * *	  qinfo - the queue *	  account - the account name * *	returns  *	  0: if the user is under their limit *	  QUEUE_USER_LIMIT_REACHED: if the user has reached their limit * */int check_queue_max_user_run( queue_info *qinfo, char *account ){  if( qinfo -> max_user_run == INFINITY ||      count_by_user( qinfo -> running_jobs, account ) < qinfo -> max_user_run )    return 0;    return QUEUE_USER_LIMIT_REACHED;}/* * *	check_queue_max_group_run - check to see if the group is within their *					queue running limits * *	  qinfo - the queue  *	  group - the groupname * *	returns  *	  0 if the group is within limits *	  QUEUE_GROUP_LIMIT_REACHED: if group is not wihtin limits * */int check_queue_max_group_run( queue_info *qinfo, char *group ){  if( qinfo -> max_group_run == INFINITY ||      count_by_group( qinfo -> running_jobs, group ) < qinfo -> max_group_run)    return 0;  return QUEUE_GROUP_LIMIT_REACHED;}/* * *	check_server_max_group_run - check to see if group is within their  *				     server running limits * *	  sinfo - the server *	  group - the groupname * *	returns  *	  0 if the group is not at their server max_group_run limit *	  SERVER_GROUP_LIMIT_REACHED : if the limit is reached * */int check_server_max_group_run( server_info *sinfo, char *group ){  if( sinfo -> max_group_run == INFINITY ||      count_by_group( sinfo -> running_jobs, group ) < sinfo -> max_group_run)    return 0;    return SERVER_GROUP_LIMIT_REACHED;}/* * *      check_avail_resources - check if there is available resources to run *                              a job on the server * *        reslist   - resources list *        jinfo - job * *      returns NULL on success or failure code * *      NOTE: if a resource is not available it is skipped *            All resources which are checked are in the global variable *              res_to_check * */int check_avail_resources( resource *reslist, job_info *jinfo){  /* The resource needs to be found on the server and the requested resource   * needs to be found from the job, these pointers are used to store the   * results   */  resource_req *resreq;  resource *res;  int ret_code = UNSPECIFIED;  char done = 0;                        /* Are we done? */  int avail;                            /* amount of available resource */  int i;  for( i = 0; (i < num_res) && !done; i++ )  {    res = find_resource(reslist, res_to_check[i].name);    resreq = find_resource_req(jinfo -> resreq, res_to_check[i].name);    /* if either of these are NULL then the system admin did not set a maximum     * default or avail for the resource.  Skip it and move on     */    if( (res == NULL || resreq == NULL) )      continue;    else    {      avail = dynamic_avail( res );      if ( avail != INFINITY && avail < resreq -> amount )      {        /* An insuffient amount of a resource has been found. */        done = 1;        ret_code = i;      }    }  }  if( !done )    ret_code = SUCCESS;  return ret_code;}/* * *	dynamic_avail - find out how much of a resource is available on a  *			server.  If the resources_available attribute is  *			set, use that, else use resources_max.

⌨️ 快捷键说明

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