From 38da461fd79bcfd3eed683076f1ba40465af775e Mon Sep 17 00:00:00 2001 From: Nathan Binkert Date: Mon, 15 Aug 2005 16:12:19 -0400 Subject: Fix NextEthernetAddr python/m5/config.py: NextEthernetAddr shouldnt' be a Singleton since we want __init__ to be called more than once. Make the EthernetAddr class a "proxy" so that unproxy will be called and NextEthernetAddr will generally work correctly. --HG-- extra : convert_revision : c89bf268e805e202ae71030fcea4833867c7e477 --- python/m5/config.py | 22 +++++++++++++++------- 1 file changed, 15 insertions(+), 7 deletions(-) diff --git a/python/m5/config.py b/python/m5/config.py index a281feccc..3c49421d3 100644 --- a/python/m5/config.py +++ b/python/m5/config.py @@ -417,6 +417,9 @@ class SimObject(object): found_obj = match_obj return found_obj, found_obj != None + def unproxy(self, base): + return self + def print_ini(self): print '[' + self.path() + ']' # .ini section header @@ -632,7 +635,7 @@ class AnyProxy(BaseProxy): return 'any' def isproxy(obj): - if isinstance(obj, BaseProxy): + if isinstance(obj, (BaseProxy, EthernetAddr)): return True elif isinstance(obj, (list, tuple)): for v in obj: @@ -980,12 +983,11 @@ def IncEthernetAddr(addr, val = 1): return ':'.join(map(lambda x: '%02x' % x, bytes)) class NextEthernetAddr(object): - __metaclass__ = Singleton addr = "00:90:00:00:00:01" def __init__(self, inc = 1): - self.value = self.addr - self.addr = IncEthernetAddr(self.addr, inc) + self.value = NextEthernetAddr.addr + NextEthernetAddr.addr = IncEthernetAddr(NextEthernetAddr.addr, inc) class EthernetAddr(ParamValue): def __init__(self, value): @@ -1006,10 +1008,16 @@ class EthernetAddr(ParamValue): self.value = value + def unproxy(self, base): + if self.value == NextEthernetAddr: + self.addr = self.value().value + return self + def __str__(self): if self.value == NextEthernetAddr: - self.value = self.value().value - return self.value + return self.addr + else: + return self.value # Special class for NULL pointers. Note the special check in # make_param_value() above that lets these be assigned where a @@ -1027,7 +1035,7 @@ class NullSimObject(object): def ini_str(self): return 'Null' - def unproxy(self,base): + def unproxy(self, base): return self def set_path(self, parent, name): -- cgit v1.2.3 From 09bb20348465f960b9465d94182306137d4b854f Mon Sep 17 00:00:00 2001 From: Nathan Binkert Date: Tue, 16 Aug 2005 11:27:49 -0400 Subject: Updates to job scripts to accept more than 15 characters of jobname Make the Link directory even more useful by working with sub-directories. util/pbs/job.py: Expose JOBNAME as a separate parameter from PBS_JOBNAME. If the former exists, it is used as the jobname for starting the job, if it doesn't exist, PBS_JOBNAME is used. This is to get around the 15 character maximum pbs job name length. While we're at it, shuffle things around to hopefully make things a bit more clear. util/pbs/send.py: Make the Link directory functionality more sophisticated, copy sub-directories and links to directories. (we still don't copy dotfiles though) Add the setname() function to contact pbs and use raj's hack to tell the webpage about longer jobnames. (it's gross, don't look) truncate the pbs job name to 15 characters so that it works. --HG-- extra : convert_revision : 4a76b1a1c33721c7ca93e2fbb761f95bc3a2ac69 --- util/pbs/job.py | 36 ++++++++++++++--------------- util/pbs/send.py | 69 ++++++++++++++++++++++++++++++++++++++++++++------------ 2 files changed, 72 insertions(+), 33 deletions(-) diff --git a/util/pbs/job.py b/util/pbs/job.py index 4ead50de9..f370862de 100755 --- a/util/pbs/job.py +++ b/util/pbs/job.py @@ -83,37 +83,35 @@ def readval(filename): if __name__ == '__main__': rootdir = env.setdefault('ROOTDIR', os.getcwd()) - jobid = env['PBS_JOBID'] - jobname = env['PBS_JOBNAME'] - jobdir = joinpath(rootdir, jobname) + pbs_jobid = env['PBS_JOBID'] + pbs_jobname = env['PBS_JOBNAME'] basedir = joinpath(rootdir, 'Base') - user = env['USER'] - + jobname = env.setdefault('JOBNAME', pbs_jobname) + jobfile = env.setdefault('JOBFILE', joinpath(basedir, 'test.py')) + outdir = env.setdefault('OUTPUT_DIR', joinpath(rootdir, jobname)) env['POOLJOB'] = 'True' - env['OUTPUT_DIR'] = jobdir - env['JOBFILE'] = joinpath(basedir, 'test.py') - env['JOBNAME'] = jobname + + if os.path.isdir("/work"): + workbase = "/work" + else: + workbase = "/tmp/" + + workdir = joinpath(workbase, '%s.%s' % (env['USER'], pbs_jobid)) def echofile(filename, string): try: - f = file(joinpath(jobdir, filename), 'w') + f = file(joinpath(outdir, filename), 'w') print >>f, string f.flush() f.close() except IOError,e: sys.exit(e) - if os.path.isdir("/work"): - workbase = "/work" - else: - workbase = "/tmp/" - - workdir = joinpath(workbase, '%s.%s' % (user, jobid)) - os.umask(0022) echofile('.start', date()) - echofile('.jobid', jobid) + echofile('.pbs_jobid', pbs_jobid) + echofile('.pbs_jobname', pbs_jobid) echofile('.host', socket.gethostname()) if os.path.isdir(workdir): @@ -132,7 +130,7 @@ if __name__ == '__main__': except OSError,e: sys.exit(e) - os.symlink(joinpath(jobdir, 'output'), 'status.out') + os.symlink(joinpath(outdir, 'output'), 'status.out') args = [ joinpath(basedir, 'm5'), joinpath(basedir, 'run.py') ] if not len(args): @@ -147,7 +145,7 @@ if __name__ == '__main__': if not childpid: # Execute command sys.stdin.close() - fd = os.open(joinpath(jobdir, "output"), + fd = os.open(joinpath(outdir, "output"), os.O_WRONLY | os.O_CREAT | os.O_TRUNC) os.dup2(fd, sys.stdout.fileno()) os.dup2(fd, sys.stderr.fileno()) diff --git a/util/pbs/send.py b/util/pbs/send.py index f8ca5209c..ecb0be0ec 100755 --- a/util/pbs/send.py +++ b/util/pbs/send.py @@ -30,9 +30,9 @@ import os, os.path, re, socket, sys from os import environ as env, listdir -from os.path import basename, isdir, isfile, islink, join as joinpath +from os.path import basename, isdir, isfile, islink, join as joinpath, normpath from filecmp import cmp as filecmp -from shutil import copyfile +from shutil import copy def nfspath(dir): if dir.startswith('/.automount/'): @@ -41,6 +41,38 @@ def nfspath(dir): dir = '/n/%s%s' % (socket.gethostname().split('.')[0], dir) return dir +def syncdir(srcdir, destdir): + srcdir = normpath(srcdir) + destdir = normpath(destdir) + if not isdir(destdir): + sys.exit('destination directory "%s" does not exist' % destdir) + + for root, dirs, files in os.walk(srcdir): + root = normpath(root) + prefix = os.path.commonprefix([root, srcdir]) + root = root[len(prefix):] + if root.startswith('/'): + root = root[1:] + for rem in [ d for d in dirs if d.startswith('.') or d == 'SCCS']: + dirs.remove(rem) + + for entry in dirs: + newdir = joinpath(destdir, root, entry) + if not isdir(newdir): + os.mkdir(newdir) + print 'mkdir', newdir + + for i,d in enumerate(dirs): + if islink(joinpath(srcdir, root, d)): + dirs[i] = joinpath(d, '.') + + for entry in files: + dest = normpath(joinpath(destdir, root, entry)) + src = normpath(joinpath(srcdir, root, entry)) + if not isfile(dest) or not filecmp(src, dest): + print 'copy %s %s' % (dest, src) + copy(src, dest) + progpath = nfspath(sys.path[0]) progname = basename(sys.argv[0]) usage = """\ @@ -107,16 +139,7 @@ for arg in args: if not listonly and not onlyecho and isdir(linkdir): if verbose: print 'Checking for outdated files in Link directory' - entries = listdir(linkdir) - for entry in entries: - link = joinpath(linkdir, entry) - if not islink(link) or not isfile(link): - continue - - base = joinpath(basedir, entry) - if not isfile(base) or not filecmp(link, base): - print 'Base/%s is different than Link/%s: copying' % (entry, entry) - copyfile(link, base) + syncdir(linkdir, basedir) import job, jobfile, pbs @@ -164,6 +187,21 @@ if not onlyecho: jl.append(jobname) joblist = jl +def setname(jobid, jobname): + # since pbs can handle jobnames of 15 characters or less, don't + # use the raj hack. + if len(jobname) <= 15: + return + + import socket + s = socket.socket() + # Connect to pbs.pool and send the jobid/jobname pair to port + # 24465 (Raj didn't realize that there are only 64k ports and + # setup inetd to point to port 90001) + s.connect(("pbs.pool", 24465)) + s.send("%s %s\n" % (jobid, jobname)) + s.close() + for jobname in joblist: jobdir = joinpath(rootdir, jobname) @@ -176,10 +214,11 @@ for jobname in joblist: qsub = pbs.qsub() qsub.pbshost = 'simpool.eecs.umich.edu' qsub.stdout = joinpath(jobdir, 'jobout') - qsub.name = jobname + qsub.name = jobname[:15] qsub.join = True qsub.node_type = 'FAST' qsub.env['ROOTDIR'] = rootdir + qsub.env['JOBNAME'] = jobname if len(queue): qsub.queue = queue qsub.build(joinpath(progpath, 'job.py')) @@ -190,6 +229,8 @@ for jobname in joblist: if not onlyecho: ec = qsub.do() if ec == 0: - print 'PBS Jobid: %s' % qsub.result + jobid = qsub.result + print 'PBS Jobid: %s' % jobid + setname(jobid, jobname) else: print 'PBS Failed' -- cgit v1.2.3