📄 check.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 <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 + -