WARNING - OLD ARCHIVES

This is an archived copy of the Xen.org mailing list, which we have preserved to ensure that existing links to archives are not broken. The live archive, which contains the latest emails, can be found at http://lists.xen.org/
   
 
 
Xen 
 
Home Products Support Community News
 
   
 

xen-devel

Re: [Xen-devel] [PATCH 1 of 3] remus: remove dead code and unused module

To: Shriram Rajagopalan <rshriram@xxxxxxxxx>
Subject: Re: [Xen-devel] [PATCH 1 of 3] remus: remove dead code and unused modules
From: Brendan Cully <brendan@xxxxxxxxx>
Date: Thu, 23 Jun 2011 07:34:37 -0700
Cc: xen-devel@xxxxxxxxxxxxxxxxxxx, ian.jackson@xxxxxxxxxxxxx
Delivery-date: Thu, 23 Jun 2011 07:35:13 -0700
Envelope-to: www-data@xxxxxxxxxxxxxxxxxxx
In-reply-to: <BANLkTin2=ggX6BKFou8HqRaA6QjGFVZcoA@xxxxxxxxxxxxxx>
List-help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-id: Xen developer discussion <xen-devel.lists.xensource.com>
List-post: <mailto:xen-devel@lists.xensource.com>
List-subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>, <mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
List-unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>, <mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
Mail-followup-to: Shriram Rajagopalan <rshriram@xxxxxxxxx>, xen-devel@xxxxxxxxxxxxxxxxxxx, ian.jackson@xxxxxxxxxxxxx
References: <patchbomb.1308749856@xxxxxxxxxxxxxxxxxxx> <ca4a8d0d504344a84f64.1308749857@xxxxxxxxxxxxxxxxxxx> <866B66C6-1A2B-4B87-AFA5-491B6E9EB686@xxxxxxxxx> <BANLkTin2=ggX6BKFou8HqRaA6QjGFVZcoA@xxxxxxxxxxxxxx>
Sender: xen-devel-bounces@xxxxxxxxxxxxxxxxxxx
User-agent: Mutt/1.5.21+22 (8d0281f79b21) (2010-12-30)
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