remus: command line switch to enable/disable checkpoint compression

Add a command line switch to remus script that allows the user to
enable or disable checkpoint compression in the libxc code.

Signed-off-by: Shriram Rajagopalan <rshriram@cs.ubc.ca>
Acked-by: Brendan Cully <brendan@cs.ubc.ca>
Committed-by: Ian Jackson <ian.jackson@eu.citrix.com>
This commit is contained in:
Shriram Rajagopalan committed 2011-12-01 15:36:51 +00:00
1 parent f6b3d39f5d
commit d18429eabf
5 files changed
+25 -8

No files matched your search

@@ -104,13 +104,14 @@ static PyObject* pycheckpoint_start(PyObject* obj, PyObject* args) {
PyObject* postcopy_cb = NULL;
PyObject* checkpoint_cb = NULL;
unsigned int interval = 0;
unsigned int flags = 0;
int fd;
struct save_callbacks callbacks;
int rc;
if (!PyArg_ParseTuple(args, "O|OOOI", &iofile, &suspend_cb, &postcopy_cb,
&checkpoint_cb, &interval))
if (!PyArg_ParseTuple(args, "O|OOOII", &iofile, &suspend_cb, &postcopy_cb,
&checkpoint_cb, &interval, &flags))
return NULL;
self->interval = interval;
@@ -160,7 +161,7 @@ static PyObject* pycheckpoint_start(PyObject* obj, PyObject* args) {
callbacks.data = self;
self->threadstate = PyEval_SaveThread();
rc = checkpoint_start(&self->cps, fd, &callbacks);
rc = checkpoint_start(&self->cps, fd, &callbacks, flags);
PyEval_RestoreThread(self->threadstate);
if (rc < 0) {
@@ -40,13 +40,15 @@ typedef struct {
timer_t timer;
} checkpoint_state;
#define CHECKPOINT_FLAGS_COMPRESSION 1
char* checkpoint_error(checkpoint_state* s);
void checkpoint_init(checkpoint_state* s);
int checkpoint_open(checkpoint_state* s, unsigned int domid);
void checkpoint_close(checkpoint_state* s);
int checkpoint_start(checkpoint_state* s, int fd,
struct save_callbacks* callbacks);
struct save_callbacks* callbacks,
unsigned int remus_flags);
int checkpoint_suspend(checkpoint_state* s);
int checkpoint_resume(checkpoint_state* s);
int checkpoint_postflush(checkpoint_state* s);
@@ -170,7 +170,8 @@ static int noop_switch_logdirty(int domid, unsigned enable, void *data)
}
int checkpoint_start(checkpoint_state* s, int fd,
struct save_callbacks* callbacks)
struct save_callbacks* callbacks,
unsigned int remus_flags)
{
int hvm, rc;
int flags = XCFLAGS_LIVE;
@@ -188,6 +189,8 @@ int checkpoint_start(checkpoint_state* s, int fd,
if (switch_qemu_logdirty(s, 1))
return -1;
}
if (remus_flags & CHECKPOINT_FLAGS_COMPRESSION)
flags |= XCFLAGS_CHECKPOINT_COMPRESS;
callbacks->switch_qemu_logdirty = noop_switch_logdirty;
+5 -2
View File
@@ -133,7 +133,7 @@ class Keepalive(object):
class Saver(object):
def __init__(self, domid, fd, suspendcb=None, resumecb=None,
checkpointcb=None, interval=0):
checkpointcb=None, interval=0, flags=0):
"""Create a Saver object for taking guest checkpoints.
domid: name, number or UUID of a running domain
fd: a stream to which checkpoint data will be written.
@@ -141,12 +141,14 @@ class Saver(object):
resumecb: callback invoked before guest resumes
checkpointcb: callback invoked when a checkpoint is complete. Return
True to take another checkpoint, or False to stop.
flags: Remus flags to be passed to xc_domain_save
"""
self.fd = fd
self.suspendcb = suspendcb
self.resumecb = resumecb
self.checkpointcb = checkpointcb
self.interval = interval
self.flags = flags
self.vm = vm.VM(domid)
@@ -164,7 +166,8 @@ class Saver(object):
try:
self.checkpointer.open(self.vm.domid)
self.checkpointer.start(self.fd, self.suspendcb, self.resumecb,
self.checkpointcb, self.interval)
self.checkpointcb, self.interval,
self.flags)
except xen.lowlevel.checkpoint.error, e:
raise CheckpointError(e)
finally:
+9 -1
View File
@@ -16,6 +16,9 @@ from xen.xend import XendOptions
class CfgException(Exception): pass
class Cfg(object):
REMUS_FLAGS_COMPRESSION = 1
def __init__(self):
# must be set
self.domid = 0
@@ -25,6 +28,7 @@ class Cfg(object):
self.port = XendOptions.instance().get_xend_relocation_port()
self.interval = 200
self.netbuffer = True
self.flags = self.REMUS_FLAGS_COMPRESSION
self.timer = False
parser = optparse.OptionParser()
@@ -38,6 +42,8 @@ class Cfg(object):
help='replicate to /dev/null (no disk checkpoints, only memory & net buffering)')
parser.add_option('', '--no-net', dest='nonet', action='store_true',
help='run without net buffering (benchmark option)')
parser.add_option('', '--no-compression', dest='nocompress', action='store_true',
help='run without checkpoint compression')
parser.add_option('', '--timer', dest='timer', action='store_true',
help='force pause at checkpoint interval (experimental)')
self.parser = parser
@@ -56,6 +62,8 @@ class Cfg(object):
self.nullremus = True
if opts.nonet:
self.netbuffer = False
if opts.nocompress:
self.flags &= ~self.REMUS_FLAGS_COMPRESSION
if opts.timer:
self.timer = True
@@ -190,7 +198,7 @@ def run(cfg):
rc = 0
checkpointer = save.Saver(cfg.domid, fd, postsuspend, preresume, commit,
interval)
interval, cfg.flags)
try:
checkpointer.start()
Reference in new issue
Block a user
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.