[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH 1 of 3] remus: remove dead code and unused modules
Some of this code is indeed obsolete or otherwise not useful, but a lot of it (like CheckpointingFile) is, I think, useful for people who might want to hack on Remus. Specifically, I agree with removing vdi.py and with your change to tools/remus/remus, I am neutral on tapdisk.py, and I would prefer to keep the rest. On 2011-06-22, at 6:37 AM, Shriram Rajagopalan wrote: > # HG changeset patch > # User Shriram Rajagopalan <rshriram@xxxxxxxxx> > # Date 1308683501 25200 > # Node ID ca4a8d0d504344a84f64bc7e939f8910baac236e > # Parent c31e9249893d309655a8e739ba2ecb07d2c0148b > remus: remove dead code and unused modules > > remove unused modules (profile, tapdisk, vdi) and > unused thread classes/qdisc classes from the python code > base. > > Signed-off-by: Shriram Rajagopalan <rshriram@xxxxxxxxx> > > diff -r c31e9249893d -r ca4a8d0d5043 tools/python/xen/remus/profile.py > --- a/tools/python/xen/remus/profile.py Sat Jun 18 20:52:07 2011 -0700 > +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 > @@ -1,56 +0,0 @@ > -"""Simple profiling module > -""" > - > -import time > - > -class ProfileBlock(object): > - """A section of code to be profiled""" > - def __init__(self, name): > - self.name = name > - > - def enter(self): > - print "PROF: entered %s at %f" % (self.name, time.time()) > - > - def exit(self): > - print "PROF: exited %s at %f" % (self.name, time.time()) > - > -class NullProfiler(object): > - def enter(self, name): > - pass > - > - def exit(self, name=None): > - pass > - > -class Profiler(object): > - def __init__(self): > - self.blocks = {} > - self.running = [] > - > - def enter(self, name): > - try: > - block = self.blocks[name] > - except KeyError: > - block = ProfileBlock(name) > - self.blocks[name] = block > - > - block.enter() > - self.running.append(block) > - > - def exit(self, name=None): > - if name is not None: > - block = None > - while self.running: > - tmp = self.running.pop() > - if tmp.name == name: > - block = tmp > - break > - tmp.exit() > - if not block: > - raise KeyError('block %s not running' % name) > - else: > - try: > - block = self.running.pop() > - except IndexError: > - raise KeyError('no block running') > - > - block.exit() > diff -r c31e9249893d -r ca4a8d0d5043 tools/python/xen/remus/qdisc.py > --- a/tools/python/xen/remus/qdisc.py Sat Jun 18 20:52:07 2011 -0700 > +++ b/tools/python/xen/remus/qdisc.py Tue Jun 21 12:11:41 2011 -0700 > @@ -109,43 +109,6 @@ > qdisc_kinds['prio'] = PrioQdisc > qdisc_kinds['pfifo_fast'] = PrioQdisc > > -class CfifoQdisc(Qdisc): > - fmt = 'II' > - > - def __init__(self, qdict): > - super(CfifoQdisc, self).__init__(qdict) > - > - if qdict.get('options'): > - self.unpack(qdict['options']) > - else: > - self.epoch = 0 > - self.vmid = 0 > - > - def pack(self): > - return struct.pack(self.fmt, self.epoch, self.vmid) > - > - def unpack(self, opts): > - self.epoch, self.vmid = struct.unpack(self.fmt, opts) > - > - def parse(self, opts): > - args = list(opts) > - try: > - while args: > - arg = args.pop(0) > - if arg == 'epoch': > - self.epoch = int(args.pop(0)) > - continue > - if arg.lower() == 'vmid': > - self.vmid = int(args.pop(0)) > - continue > - except Exception, inst: > - raise QdiscException(str(inst)) > - > - def optstr(self): > - return 'epoch %d vmID %d' % (self.epoch, self.vmid) > - > -qdisc_kinds['cfifo'] = CfifoQdisc > - > TC_PLUG_CHECKPOINT = 0 > TC_PLUG_RELEASE = 1 > > diff -r c31e9249893d -r ca4a8d0d5043 tools/python/xen/remus/save.py > --- a/tools/python/xen/remus/save.py Sat Jun 18 20:52:07 2011 -0700 > +++ b/tools/python/xen/remus/save.py Tue Jun 21 12:11:41 2011 -0700 > @@ -1,8 +1,7 @@ > #!/usr/bin/env python > > -import os, select, socket, threading, time, signal, xmlrpclib > +import os, socket, xmlrpclib > > -from xen.xend.XendClient import server > from xen.xend.xenstore.xswatch import xswatch > > import xen.lowlevel.xc > @@ -13,10 +12,6 @@ > > import vm, image > > -XCFLAGS_LIVE = 1 > - > -xcsave = '/usr/lib/xen/bin/xc_save' > - > class _proxy(object): > "proxy simulates an object without inheritance" > def __init__(self, obj): > @@ -30,58 +25,6 @@ > > class CheckpointError(Exception): pass > > -class CheckpointingFile(_proxy): > - """Tee writes into separate file objects for each round. > - This is necessary because xc_save gets a single file descriptor > - for the duration of checkpointing. > - """ > - def __init__(self, path): > - self.path = path > - > - self.round = 0 > - self.rfd, self.wfd = os.pipe() > - self.fd = file(path, 'wb') > - > - # this pipe is used to notify the writer thread of checkpoints > - self.cprfd, self.cpwfd = os.pipe() > - > - super(CheckpointingFile, self).__init__(self.fd) > - > - wt = threading.Thread(target=self._wrthread, > name='disk-write-thread') > - wt.setDaemon(True) > - wt.start() > - self.wt = wt > - > - def fileno(self): > - return self.wfd > - > - def close(self): > - os.close(self.wfd) > - # closing wfd should signal writer to stop > - self.wt.join() > - os.close(self.rfd) > - os.close(self.cprfd) > - os.close(self.cpwfd) > - self.fd.close() > - self.wt = None > - > - def checkpoint(self): > - os.write(self.cpwfd, '1') > - > - def _wrthread(self): > - while True: > - r, o, e = select.select((self.rfd, self.cprfd), (), ()) > - if self.rfd in r: > - data = os.read(self.rfd, 256 * 1024) > - if not data: > - break > - self.fd.write(data) > - if self.cprfd in r: > - junk = os.read(self.cprfd, 1) > - self.round += 1 > - self.fd = file('%s.%d' % (self.path, self.round), 'wb') > - self.proxy(self.fd) > - > class MigrationSocket(_proxy): > def __init__(self, address): > sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) > @@ -101,36 +44,6 @@ > fd = os.fdopen(filedesc, 'w+') > super(NullSocket, self).__init__(fd) > > -class Keepalive(object): > - "Call a keepalive method at intervals" > - def __init__(self, method, interval=0.1): > - self.keepalive = method > - self.interval = interval > - > - self.thread = None > - self.running = False > - > - def start(self): > - if not self.interval: > - return > - self.thread = threading.Thread(target=self.run, > name='keepalive-thread') > - self.thread.setDaemon(True) > - self.running = True > - self.thread.start() > - > - def stop(self): > - if not self.thread: > - return > - self.running = False > - self.thread.join() > - self.thread = None > - > - def run(self): > - while self.running: > - self.keepalive() > - time.sleep(self.interval) > - self.keepalive(stop=True) > - > class Saver(object): > def __init__(self, domid, fd, suspendcb=None, resumecb=None, > checkpointcb=None, interval=0, flags=0): > @@ -177,10 +90,5 @@ > pass > > def _resume(self): > - """low-overhead version of XendDomainInfo.resumeDomain""" > - # TODO: currently assumes SUSPEND_CANCEL is available > - if True: > xc.domain_resume(self.vm.domid, 1) > xsutil.ResumeDomain(self.vm.domid) > - else: > - server.xend.domain.resumeDomain(self.vm.domid) > diff -r c31e9249893d -r ca4a8d0d5043 tools/python/xen/remus/tapdisk.py > --- a/tools/python/xen/remus/tapdisk.py Sat Jun 18 20:52:07 2011 -0700 > +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 > @@ -1,4 +0,0 @@ > -import blkdev > - > -class TapDisk(BlkDev): > - pass > diff -r c31e9249893d -r ca4a8d0d5043 tools/python/xen/remus/vdi.py > --- a/tools/python/xen/remus/vdi.py Sat Jun 18 20:52:07 2011 -0700 > +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 > @@ -1,121 +0,0 @@ > -#code to play with vdis and snapshots > - > -import os > - > -def run(cmd): > - fd = os.popen(cmd) > - res = [l for l in fd if l.rstrip()] > - return not fd.close(), res > - > - > -_blockstore = '/blockstore.dat' > - > -def set_blockstore(blockstore): > - global _blockstore > - __blockstore = blockstore > - > - > -class SnapShot: > - def __init__(self, vdi, block, index): > - self.__vdi = vdi > - self.__block = block > - self.__index = index > - > - #TODO add snapshot date and radix > - > - def __str__(self): > - return '%d %d %d' % (self.__vdi.id(), self.__block, self.__index) > - > - def vdi(self): > - return self.__vdi > - > - def block(self): > - return self.__block > - > - def index(self): > - return self.__index > - > - def match(self, block, index): > - return self.__block == block and self.__index == index > - > - > -class VDIException(Exception): > - pass > - > - > -class VDI: > - def __init__(self, id, name): > - self.__id = id > - self.__name = name > - > - def __str__(self): > - return 'vdi: %d %s' % (self.__id, self.__name) > - > - def id(self): > - return self.__id > - > - def name(self): > - return self.__name > - > - def list_snapshots(self): > - res, ls = run('vdi_snap_list %s %d' % (_blockstore, self.__id)) > - if res: > - return [SnapShot(self, int(l[0]), int(l[1])) for l in [l.split() > for l in ls[1:]]] > - else: > - raise VDIException("Error reading snapshot list") > - > - def snapshot(self): > - res, ls = run('vdi_checkpoint %s %d' % (_blockstore, self.__id)) > - if res: > - _, block, idx = ls[0].split() > - return SnapShot(self, int(block), int(idx)) > - else: > - raise VDIException("Error taking vdi snapshot") > - > - > -def create(name, snap): > - res, _ = run('vdi_create %s %s %d %d' > - % (_blockstore, name, snap.block(), snap.index())) > - if res: > - return lookup_by_name(name) > - else: > - raise VDIException('Unable to create vdi from snapshot') > - > - > -def fill(name, img_file): > - res, _ = run('vdi_create %s %s' % (_blockstore, name)) > - > - if res: > - vdi = lookup_by_name(name) > - res, _ = run('vdi_fill %d %s' % (vdi.id(), img_file)) > - if res: > - return vdi > - raise VDIException('Unable to create vdi from disk img file') > - > - > -def list_vdis(): > - vdis = [] > - res, lines = run('vdi_list %s' % _blockstore) > - if res: > - for l in lines: > - r = l.split() > - vdis.append(VDI(int(r[0]), r[1])) > - return vdis > - else: > - raise VDIException("Error doing vdi list") > - > - > -def lookup_by_id(id): > - vdis = list_vdis() > - for v in vdis: > - if v.id() == id: > - return v > - raise VDIException("No match from vdi id") > - > - > -def lookup_by_name(name): > - vdis = list_vdis() > - for v in vdis: > - if v.name() == name: > - return v > - raise VDIException("No match for vdi name") > diff -r c31e9249893d -r ca4a8d0d5043 tools/python/xen/remus/vm.py > --- a/tools/python/xen/remus/vm.py Sat Jun 18 20:52:07 2011 -0700 > +++ b/tools/python/xen/remus/vm.py Tue Jun 21 12:11:41 2011 -0700 > @@ -143,10 +143,6 @@ > > return [blkdev.parse(disk) for disk in disks] > > -def fromxend(domid): > - "create a VM object from xend information" > - return VM(domid) > - > def getshadowmem(vm): > "Balloon down domain0 to create free memory for shadow paging." > maxmem = int(vm.dom['maxmem']) > diff -r c31e9249893d -r ca4a8d0d5043 tools/remus/remus > --- a/tools/remus/remus Sat Jun 18 20:52:07 2011 -0700 > +++ b/tools/remus/remus Tue Jun 21 12:11:41 2011 -0700 > @@ -86,12 +86,9 @@ > # I am not sure what the best way to die is. xm destroy is another > option, > # or we could attempt to trigger some instant reboot. > print "dying..." > - print util.runcmd(['sudo', 'ifdown', 'eth2']) > - # dangling imq0 handle on vif locks up the system > for buf in bufs: > buf.uninstall() > print util.runcmd(['sudo', 'xm', 'destroy', cfg.domid]) > - print util.runcmd(['sudo', 'ifup', 'eth2']) > > def getcommand(): > """Get a command to execute while running. > > _______________________________________________ > Xen-devel mailing list > Xen-devel@xxxxxxxxxxxxxxxxxxx > http://lists.xensource.com/xen-devel > _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxxxxxxxx http://lists.xensource.com/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |