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
|