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

📄 overlaps.c

📁 openPBS的开放源代码
💻 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.*//* $Id: overlaps.c,v 1.1.10.4 2000/08/09 00:19:18 hender Exp $ */#include <sys/types.h>#include <stdio.h>#include <stdlib.h>#include <string.h>#include <unistd.h>#include "pbs_ifl.h"#include "log.h"/* Scheduler header files */#include "toolkit.h"#include "gblxvars.h"/* * Attempt to find a queue in which this waiting or special job will * be able to run.  Also take into account whether it is the shortest * wait or not.  Given the choice between two equivalent wait times, * try to choose the smallest queue for the job. * * Return the expected time at which the queue will be sufficiently * drained to run 'job' in qlist->queue->drainby. If there is no queue * capable of running the job, do not modify Q->drain_by, and return * (Queue *)NULL. */Queue *schd_find_drain(QueueList *qlist, Job *job){    char   *id = "schd_find_drain";    QueueList *qptr;    Queue  *shortest, *queue;    Job    *rjob;    char    buff[256];    time_t  drainby, mintime;    int     running;    int	    drainnodes;    int	    freenodes;    /*     * Find the smallest, shortest-wait queue in which this job will     * fit.  If it is empty, great.  If not, mark it to be drained,     * in anticipation of the job being run soon. Also update the     * count of nodes that need to be reserved for this job.     */    shortest = NULL;    drainby  = 0;    mintime  = 0;    for (qptr = qlist; qptr != NULL; qptr = qptr->next) {	queue = qptr->queue;	/* The job will never fit in this queue. */	if (!schd_job_fits_queue(job, queue, NULL))	    continue;	/* Ignore stopped or disabled queues */	if (queue->flags & (QFLAGS_STOPPED|QFLAGS_DISABLED))	    continue;	/* Is this job's owner allowed to run in this queue? */	if ((queue->flags & QFLAGS_USER_ACL) &&	    (!schd_useracl_okay(job, queue, NULL)))	{	    continue;	}	/* 	 * Are there sufficient nodes available to run this job already?  If	 * so, there is no need to drain the queue to run this job.  Return	 * NULL - no action is necessary.	 */	if ((queue->nodes_max - queue->nodes_assn) >= job->nodes)	    return (NULL);	/*	 * The job cannot be run in this queue at the expected drain	 * time.	 */	drainby = schd_TimeNow;	running = queue->running;	if (running == 0) {	    /* "This can't happen." */	    DBPRT(("%s: Queue %s not running, but too few nodes for job %s!\n",		id, queue->qname, job->jobid));	    continue;	/* Move on to the next queue. */	}	/*	 * Walk down the list of running jobs, counting up the resources that 	 * will be available after each job completes.  At each step, find 	 * out if the waiting job will be able to run then.	 *	 * Note that this assumes the jobs will be sorted by ending time	 * from soonest to longest ending.	 */	/* Start out with what is available now. */	freenodes = queue->nodes_max - queue->nodes_assn;	drainnodes = freenodes;	for (rjob = queue->jobs; rjob != NULL; rjob = rjob->next) {	    /* Not running -- don't bother. */	    if (rjob->state != 'R')		continue;	    	    /*	     * Pretend that the running job has finished.  If the waiting	     * job will be able to run at this time, then break out and 	     * start this queue draining.	     */	    running --;	    drainnodes += rjob->nodes;	    if (running < 0) {		DBPRT(("Queue %s RAN OUT OF RUNNING JOBS!?\n", queue->qname));		rjob = NULL;		break;	    }	    /* Would there be too many jobs running if this job were to run? */	    if ((queue->maxrun != UNSPECIFIED) && (running >= queue->maxrun)) 		continue;	    /*	     * If there are not yet sufficient resources, then go on to the 	     * next running job (if there is one).	     */	    if (drainnodes < job->nodes)		continue;	    /*	     * Calculate the absolute time at which this job is expected to 	     * complete.  If the waiting job will not be able to run at that 	     * future time, then go on to the next running job.	     */	    drainby = schd_TimeNow + rjob->time_left;	    /*	     * If we've walked past the empty_by time for the queue, then 	     * the empty_by has been pushed forward.  This will be done to 	     * support draining a few jobs from a queue.  That's it -- 	     * don't bother going further.	     */	    if (drainby > queue->empty_by) {		DBPRT(("exceeds '%s' empty_by time\n", queue->qname));		DBPRT(("%s: %s already draining for another job.\n", id, 		    queue->qname));		break;	    }	    if (!schd_dedicated_can_run(job, queue, drainby, buff))		continue;	    if (schd_primetime_limits(job, queue, drainby, buff))		continue;	    /* Stop examining waiting jobs. */	    break;	}	/*	 * If 'rjob' is non-NULL, it points to a job in the current queue.  	 * The waiting job will be able to run when this job ompletes.	 * If not, then the job cannot run in this queue.  If this is the 	 * case, go on to the next queue.	 */	if (rjob == NULL)	    continue;	else	    DBPRT(("%s: %s can run in %s when %s completes (in %s).\n", 		id, job->jobid, queue->qname, rjob->jobid, 		schd_sec2val(rjob->time_left)));	/*	 * If there is no shortest queue yet, then this is it.  Otherwise,	 * see if the wait for this queue will be less than the current	 * shortest one.	 */	if ((shortest == NULL) || (drainby < mintime)) {	    mintime  = drainby;	    shortest = queue;	}    }    if (shortest) {	/* reserve the number of currently free nodes that will be needed	 * later by this job. We only need to reserve what we will actully	 * use. Set the count of these reserved nodes in the Q struct.	 */	if (freenodes)	    shortest->nodes_rsvd = freenodes - (drainnodes - job->nodes);	else	    shortest->nodes_rsvd = freenodes;	if (shortest->running)	    shortest->drain_by = mintime;	else	    shortest->drain_by = schd_TimeNow;    }    return (shortest);}

⌨️ 快捷键说明

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