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

📄 getqueues.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.*//* $Id: getqueues.c,v 1.2.2.1.2.4 2000/08/09 00:19:16 hender Exp $ */#include <stdio.h>#include <stdlib.h>#include <errno.h>#include <sys/types.h>#include <sys/param.h>#include <sys/sysmacros.h>#include <string.h>/* PBS header files */#include "pbs_error.h"#include "pbs_ifl.h"#include "log.h"/* Scheduler header files */#include "toolkit.h"#include "gblxvars.h"extern int connector;static int  queue_claim_jobs(Queue *queue, Job **joblist_ptr);static int  queue_sanity(Queue *queue);#ifdef NODEMASKstatic int  find_nodemasks(Queue *queue, Resources *rsrcs);#endif	/* NODEMASK *//* * schd_get_queue_limits - query queue information from the server. * * Returns 0 on success, -1 for "fatal errors", and 1 for a transient * error (i.e., the queue failed the sanity checks imposed by the * queue_sanity() function). */int schd_get_queue_limits(Queue *queue){    char   *id = "schd_get_queue_limits";    int     moved = 0, istrue;    Batch_Status *bs;    AttrList *attr;    static AttrList alist[] =    {	{&alist[1],  ATTR_start,	"", ""},	{&alist[2],  ATTR_enable,	"", ""},	{&alist[3],  ATTR_count,	"", ""},	{&alist[4],  ATTR_maxuserrun,	"", ""},	{&alist[5],  ATTR_rescavail,	"", ""},	{&alist[6],  ATTR_rescassn,	"", ""},	{&alist[7],  ATTR_rescdflt,	"", ""},	{&alist[8],  ATTR_rescmax,	"", ""},	{&alist[9],  ATTR_rescmin,	"", ""},	{&alist[10], ATTR_acluren,	"", ""},	{&alist[11], ATTR_acluser,	"", ""},	{NULL,       ATTR_maxrun,	"", ""}    };    size_t  mem_default = UNSPECIFIED;    size_t  mem_assn    = UNSPECIFIED;    size_t  mem_max     = UNSPECIFIED;    size_t  mem_min     = UNSPECIFIED;    int     cpu_default = UNSPECIFIED;    int     cpu_assn    = UNSPECIFIED;    int     cpu_max     = UNSPECIFIED;    int     cpu_min     = UNSPECIFIED;    int     nodes_from_cpu, nodes_from_mem;    queue->running	= UNSPECIFIED;    queue->queued	= UNSPECIFIED;    queue->maxrun	= UNSPECIFIED;    queue->userrun      = UNSPECIFIED;    queue->nodes_max	= UNSPECIFIED;    queue->nodes_min	= UNSPECIFIED;    queue->nodes_default= UNSPECIFIED;    queue->nodes_assn	= UNSPECIFIED;    queue->nodes_rsvd	= UNSPECIFIED;    queue->wallt_max	= UNSPECIFIED;    queue->wallt_min	= UNSPECIFIED;    queue->wallt_default= UNSPECIFIED;    queue->flags	= 0;#ifdef NODEMASK    BITFIELD_CLRALL(&queue->queuemask);    BITFIELD_CLRALL(&queue->availmask);#endif	/* NODEMASK */    queue->rsrcs	= NULL;        if (queue->jobs) {	DBPRT(("%s: found jobs on queue '%s'!  Freeing them...\n", id, 	    queue->qname));	schd_free_jobs(queue->jobs);    }    if (queue->useracl) {	DBPRT(("%s: found user ACL list on queue '%s'!  Freeing it...\n", id, 	    queue->qname));	schd_free_useracl(queue->useracl);    }    queue->jobs         = NULL;    queue->useracl	= NULL;    /* Ask the server for information about the specified queue. */    if ((bs = pbs_statque(connector, queue->qname, alist, NULL)) == NULL) {	sprintf(log_buffer, "pbs_statque failed, \"%s\" %d",		queue->qname, pbs_errno);	log_record(PBSEVENT_ERROR, PBS_EVENTCLASS_SERVER, id, log_buffer);	DBPRT(("%s: %s\n", id, log_buffer));	return (-1);    }    /* Process the list of attributes returned by the server. */	    for (attr = bs->attribs; attr != NULL; attr = attr->next) {	/* Is queue started? */	if (!strcmp(attr->name, ATTR_start)) {	    if (schd_val2bool(attr->value, &istrue) == 0) {		if (istrue)	/* if true, queue is not stopped. */		    queue->flags &= ~QFLAGS_STOPPED;		else 		    queue->flags |= QFLAGS_STOPPED;	    } else {		DBPRT(("%s: couldn't parse attr %s value %s to boolean\n", id,		    attr->name, attr->value));	    }	    continue;	}	/* Is queue enabled? */	if (!strcmp(attr->name, ATTR_enable)) {	    if (schd_val2bool(attr->value, &istrue) == 0) {		if (istrue)	/* if true, queue is not disabled. */		    queue->flags &= ~QFLAGS_DISABLED;		else 		    queue->flags |= QFLAGS_DISABLED;	    } else {		DBPRT(("%s: couldn't parse attr %s value %s to boolean\n", id,		    attr->name, attr->value));	    }	    continue;	}	/* How many jobs are queued and running? */	if (!strcmp(attr->name, ATTR_count)) {	    queue->queued = schd_how_many(attr->value, SC_QUEUED);	    queue->running = schd_how_many(attr->value, SC_RUNNING);	    continue;	}	/* Queue-wide maximum number of jobs running. */	if (!strcmp(attr->name, ATTR_maxrun)) {	    queue->maxrun = atoi(attr->value);	    continue;	}	/* Per-user maximum number of jobs running. */	if (!strcmp(attr->name, ATTR_maxuserrun)) {	    queue->userrun = atoi(attr->value);	    continue;	}	/* Is there an enabled user access control list on this queue? */	if (!strcmp(attr->name, ATTR_acluren)) {	    if (schd_val2bool(attr->value, &istrue) == 0) {		if (istrue)	/* if true, queue has an ACL */		    queue->flags |= QFLAGS_USER_ACL;		else 		    queue->flags &= ~QFLAGS_USER_ACL;	    } else {		DBPRT(("%s: couldn't parse attr %s value %s to boolean\n", id,		    attr->name, attr->value));	    }	    continue;	}	if (!strcmp(attr->name, ATTR_acluser)) {	    if (queue->useracl) {		DBPRT(("queue %s acluser already set!\n", queue->qname));		schd_free_useracl(queue->useracl);	    }	    queue->useracl = schd_create_useracl(attr->value);	    continue;	}	/* Queue maximum resource usage. */	if (!strcmp(attr->name, ATTR_rescmax)) {	    if (!strcmp("mem", attr->resource)) {		mem_max = schd_val2byte(attr->value);		continue;	    }	    if (!strcmp("ncpus", attr->resource)) {		cpu_max = atoi(attr->value);		continue;	    }	    if (!strcmp("walltime", attr->resource)) {		queue->wallt_max = schd_val2sec(attr->value);		continue;	    }#ifdef NODEMASK	    if (!strcmp("nodemask", attr->resource)) {		if (schd_str2mask(attr->value, &queue->queuemask)) {		    (void)sprintf(log_buffer, "couldn't convert nodemask %s", 			attr->value);		    log_record(PBSEVENT_SYSTEM, PBS_EVENTCLASS_SERVER, id,			log_buffer);		} else 		    queue->flags |= QFLAGS_NODEMASK;	/* Valid nodemask. */	    }#endif	/* NODEMASK */	    continue;	}	/* Queue minimum resource usage. */	if (!strcmp(attr->name, ATTR_rescmin)) {	    if (!strcmp("mem", attr->resource)) {		mem_min = schd_val2byte(attr->value);		continue;	    }	    if (!strcmp("ncpus", attr->resource)) {		cpu_min = atoi(attr->value);		continue;	    }	    if (!strcmp("walltime", attr->resource)) {		queue->wallt_min = schd_val2sec(attr->value);		continue;	    }	    continue;	}	/* Queue assigned (in use) resource usage. */	if (!strcmp(attr->name, ATTR_rescassn)) {	    if (!strcmp("mem", attr->resource)) {		mem_assn = schd_val2byte(attr->value);		continue;	    }	    if (!strcmp("ncpus", attr->resource)) {		cpu_assn = atoi(attr->value);	    }	    continue;	}	if (!strcmp(attr->name, ATTR_rescdflt)) {	    if (!strcmp("mem", attr->resource))	{		mem_default = schd_val2byte(attr->value);		continue;	    }	    if (!strcmp("ncpus", attr->resource)) {		cpu_default = atoi(attr->value);		continue;	    }	    if (!strcmp("walltime", attr->resource))		queue->wallt_default = schd_val2sec(attr->value);	}	/* Ignore anything else */    }    pbs_statfree(bs);    /*     * Calculate values for queue node limits, given memory and cpu values.     * Note any discrepancies.     */    nodes_from_cpu = NODES_FROM_CPU(cpu_default);    nodes_from_mem = NODES_FROM_MEM(mem_default);    if (nodes_from_cpu != nodes_from_mem) {	sprintf(log_buffer, 	    "%s: Queue '%s' default cpu/mem (%d/%s) convert to %d != %d nodes",	    id, queue->qname, cpu_default, schd_byte2val(mem_default), 	    nodes_from_cpu, nodes_from_mem);	log_record(PBSEVENT_ERROR, PBS_EVENTCLASS_SERVER, id, log_buffer);	DBPRT(("%s: %s\n", id, log_buffer));    }    nodes_from_cpu = NODES_FROM_CPU(cpu_max);    nodes_from_mem = NODES_FROM_MEM(mem_max);    if (nodes_from_cpu != nodes_from_mem) {	sprintf(log_buffer, 	    "%s: Queue '%s' maximum cpu/mem (%d/%s) convert to %d != %d nodes",	    id, queue->qname, cpu_max, schd_byte2val(mem_max), 	    nodes_from_cpu, nodes_from_mem);	log_record(PBSEVENT_ERROR, PBS_EVENTCLASS_SERVER, id, log_buffer);	DBPRT(("%s: %s\n", id, log_buffer));    }    nodes_from_cpu = NODES_FROM_CPU(cpu_min);    nodes_from_mem = NODES_FROM_MEM(mem_min);    if (nodes_from_cpu != nodes_from_mem) {	sprintf(log_buffer, 	    "%s: Queue '%s' minimum cpu/mem (%d/%s) convert to %d != %d nodes",	    id, queue->qname, cpu_min, schd_byte2val(mem_min), 	    nodes_from_cpu, nodes_from_mem);	log_record(PBSEVENT_ERROR, PBS_EVENTCLASS_SERVER, id, log_buffer);	DBPRT(("%s: %s\n", id, log_buffer));    }    /*     * Note: The assigned cpus and memory need not be exactly the same     * node equivalency.     */    if ((cpu_default != UNSPECIFIED) && (mem_default != UNSPECIFIED))	queue->nodes_default = NODES_REQD(cpu_default, mem_default);    if ((cpu_max != UNSPECIFIED) && (mem_max != UNSPECIFIED))	queue->nodes_max     = NODES_REQD(cpu_max, mem_max);    if ((cpu_min != UNSPECIFIED) && (mem_min != UNSPECIFIED))	queue->nodes_min     = NODES_REQD(cpu_min, mem_min);    if ((cpu_assn != UNSPECIFIED) && (mem_assn != UNSPECIFIED))	queue->nodes_assn    = NODES_REQD(cpu_assn, mem_assn);    /*     * Move any jobs on this queue from the global list onto the queue's     * list.  Keep track of when the longest-running job will end, and set     * the 'empty_by' field to that value.  Maintain the ordering as it was     * in "schd_AllJobs".     */    if (schd_AllJobs)	moved = queue_claim_jobs(queue, &schd_AllJobs);        if (moved < 0) {	sprintf(log_buffer, "%s: WARNING! Queue '%s' failed to claim jobs.",	    id, queue->qname);	log_record(PBSEVENT_ERROR, PBS_EVENTCLASS_SERVER, id, log_buffer);	DBPRT(("%s: %s\n", id, log_buffer));    }    if (queue->nodes_assn == UNSPECIFIED)	queue->nodes_assn = 0;    if (queue->running    == UNSPECIFIED)	queue->running    = 0;    /*     * Find out if the queue is idle, and if it was not before, set the idle     * time to now.  If there are running jobs, the queue is not idle at the     * start of this iteration - set idle_since to 0.     */    if (queue->running) {	queue->idle_since = 0;    } else {	if (queue->idle_since == 0)	    queue->idle_since = schd_TimeNow;    }    /*     * Get the resources for this queue from the resource monitor (if     * available).  If the resmom is not accessible, disable the queue.     * If the resources were received okay, compute the available node     * masks from the resources and jobs.     * Don't bother with resources for the special or submit queues.     */    if ((strcmp(queue->qname, schd_SubmitQueue->queue->qname) != 0) ||	((schd_SpecialQueue != NULL) &&          (!strcmp(queue->qname, schd_SpecialQueue->queue->qname))) ) {	queue->rsrcs = schd_get_resources(queue->exechost);	if (queue->rsrcs != NULL) {	    /* Account for this queue's resources. */	    queue->rsrcs->nodes_alloc += queue->nodes_assn;	    queue->rsrcs->njobs       += queue->running;	    /*	     * If the HPM counters do not appear to be in use on this host, 	     * check for jobs on the queue that are using hpm.  If so, set	     * the 'HPM_IN_USE' flag on the resources.  This will prevent the	     * HPM counters from being released to global mode at the end 	     * of the scheduling run (c.f. cleanup.c).	     * The 'HPM_IN_USE' flag will also be asserted if a job is run 	     * that uses the HPM counters.	     */	    if (schd_MANAGE_HPM && 		!(queue->rsrcs->flags & RSRCS_FLAGS_HPM_IN_USE))	    {		if (schd_hpm_job_count(queue->jobs))		    queue->rsrcs->flags |= RSRCS_FLAGS_HPM_IN_USE;	    }#ifdef NODEMASK	    /* And find the nodemasks for the queue and resources. */	    find_nodemasks(queue, queue->rsrcs);#endif	/* NODEMASK */

⌨️ 快捷键说明

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