[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
On Thursday, 23 June 2011 at 09:08, Shriram Rajagopalan wrote: > On Wed, Jun 22, 2011 at 6:30 PM, Brendan Cully <brendan@xxxxxxxxx> wrote: > > > 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. > > > > Please specify what goes into "a lot of it" and "rest" Did the second sentence of the original email not make that clear? > 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 > > -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 > > > +++ 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 > > > +++ 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 > > -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 > > > +++ /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 > > > +++ 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 > > > +++ 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 |