mirror of
https://github.com/xen-project/xen.git
synced 2026-10-29 10:40:03 +01:00
bitkeeper revision 1.1159.116.4 (4177df97ZOvl759Lo38Gv7CY081ZCA)
Add resource control parameter to migrate.
This commit is contained in:
1 parent
e1ab5a1d0d
commit
4a22a3ffb9
9 files changed
+30
-16
No files matched your search
@@ -8,6 +8,7 @@
|
||||
typedef struct XcIOContext {
|
||||
u32 domain;
|
||||
unsigned flags;
|
||||
int resource;
|
||||
IOStream *io;
|
||||
IOStream *info;
|
||||
IOStream *err;
|
||||
|
||||
@@ -244,11 +244,12 @@ class Xend:
|
||||
{'op' : 'save',
|
||||
'file' : filename })
|
||||
|
||||
def xend_domain_migrate(self, id, dst, live=0):
|
||||
def xend_domain_migrate(self, id, dst, live=0, resource=0):
|
||||
return self.xendPost(self.domainurl(id),
|
||||
{'op' : 'migrate',
|
||||
'destination': dst,
|
||||
'live' : live })
|
||||
'live' : live,
|
||||
'resource' : resource })
|
||||
|
||||
def xend_domain_pincpu(self, id, cpu):
|
||||
return self.xendPost(self.domainurl(id),
|
||||
|
||||
@@ -594,7 +594,7 @@ class XendDomain:
|
||||
self.refresh_schedule()
|
||||
return val
|
||||
|
||||
def domain_migrate(self, id, dst, live):
|
||||
def domain_migrate(self, id, dst, live=0, resource=0):
|
||||
"""Start domain migration.
|
||||
|
||||
@param id: domain id
|
||||
@@ -604,7 +604,7 @@ class XendDomain:
|
||||
# Don't forget to cancel restart for it.
|
||||
dominfo = self.domain_lookup(id)
|
||||
xmigrate = XendMigrate.instance()
|
||||
val = xmigrate.migrate_begin(dominfo, dst, live=live)
|
||||
val = xmigrate.migrate_begin(dominfo, dst, live=live, resource=resource)
|
||||
return val
|
||||
|
||||
def domain_save(self, id, dst, progress=0):
|
||||
|
||||
@@ -260,7 +260,7 @@ class XendMigrateInfo(XfrdInfo):
|
||||
"""Representation of a migrate in-progress and its interaction with xfrd.
|
||||
"""
|
||||
|
||||
def __init__(self, xid, dominfo, host, port, live):
|
||||
def __init__(self, xid, dominfo, host, port, live=0, resource=0):
|
||||
XfrdInfo.__init__(self)
|
||||
self.xid = xid
|
||||
self.dominfo = dominfo
|
||||
@@ -271,13 +271,15 @@ class XendMigrateInfo(XfrdInfo):
|
||||
self.dst_port = port
|
||||
self.dst_dom = None
|
||||
self.live = live
|
||||
self.resource = resource
|
||||
self.start = 0
|
||||
|
||||
def sxpr(self):
|
||||
sxpr = ['migrate',
|
||||
['id', self.xid ],
|
||||
['state', self.state ],
|
||||
['live', self.live ] ]
|
||||
['live', self.live ],
|
||||
['resource', self.resource] ]
|
||||
sxpr_src = ['src', ['host', self.src_host], ['domain', self.src_dom] ]
|
||||
sxpr.append(sxpr_src)
|
||||
sxpr_dst = ['dst', ['host', self.dst_host] ]
|
||||
@@ -300,7 +302,8 @@ class XendMigrateInfo(XfrdInfo):
|
||||
vmconfig,
|
||||
self.dst_host,
|
||||
self.dst_port,
|
||||
self.live ])
|
||||
self.live,
|
||||
self.resource ])
|
||||
|
||||
## def xfr_vm_suspend(self, xfrd, val):
|
||||
## def cbok(val):
|
||||
@@ -490,7 +493,7 @@ class XendMigrate:
|
||||
reactor.connectTCP('localhost', XFRD_PORT, xcf)
|
||||
return info.deferred
|
||||
|
||||
def migrate_begin(self, dominfo, host, port=XFRD_PORT, live=0):
|
||||
def migrate_begin(self, dominfo, host, port=XFRD_PORT, live=0, resource=0):
|
||||
"""Begin to migrate a domain to another host.
|
||||
|
||||
@param dominfo: domain info
|
||||
@@ -499,7 +502,7 @@ class XendMigrate:
|
||||
@return: deferred
|
||||
"""
|
||||
xid = self.nextid()
|
||||
info = XendMigrateInfo(xid, dominfo, host, port, live)
|
||||
info = XendMigrateInfo(xid, dominfo, host, port, live, resource)
|
||||
return self.session_begin(info)
|
||||
|
||||
def save_begin(self, dominfo, file):
|
||||
|
||||
@@ -81,7 +81,8 @@ class SrvDomain(SrvDir):
|
||||
fn = FormFn(self.xd.domain_migrate,
|
||||
[['dom', 'str'],
|
||||
['destination', 'str'],
|
||||
['live', 'int']])
|
||||
['live', 'int'],
|
||||
['resource', 'int']])
|
||||
deferred = fn(req.args, {'dom': self.dom.id})
|
||||
print 'op_migrate>', deferred
|
||||
deferred.addCallback(self._op_migrate_cb, req)
|
||||
|
||||
@@ -26,6 +26,10 @@ gopts.opt('live', short='l',
|
||||
fn=set_true, default=0,
|
||||
use="Use live migration.")
|
||||
|
||||
gopts.opt('resource', short='r',
|
||||
fn=set_int, default=0,
|
||||
use="Set level of resource usage for migration.")
|
||||
|
||||
def help(argv):
|
||||
gopts.argv = argv
|
||||
gopts.usage()
|
||||
@@ -42,5 +46,5 @@ def main(argv):
|
||||
dst = args[1]
|
||||
if dom in [DOM0_NAME, DOM0_ID]:
|
||||
opts.err('Cannot migrate ' + dom)
|
||||
server.xend_domain_migrate(dom, dst, opts.vals.live)
|
||||
server.xend_domain_migrate(dom, dst, opts.vals.live, opts.vals.resource)
|
||||
|
||||
@@ -60,7 +60,7 @@ void xcfini(void){
|
||||
int xen_domain_snd(Conn *xend, IOStream *io,
|
||||
uint32_t dom,
|
||||
char *vmconfig, int vmconfig_n,
|
||||
int live){
|
||||
int live, int resource){
|
||||
int err = 0;
|
||||
#ifdef _XEN_XFR_STUB_
|
||||
char buf[1024];
|
||||
@@ -99,6 +99,7 @@ int xen_domain_snd(Conn *xend, IOStream *io,
|
||||
if(live){
|
||||
ioctxt->flags |= XCFLAGS_LIVE;
|
||||
}
|
||||
ioctxt->resource = resource;
|
||||
err = xc_linux_save(xcinit(), ioctxt);
|
||||
#endif
|
||||
dprintf("< err=%d\n", err);
|
||||
|
||||
@@ -10,7 +10,7 @@
|
||||
extern int xen_domain_snd(Conn *xend, IOStream *io,
|
||||
uint32_t dom,
|
||||
char *vmconfig, int vmconfig_n,
|
||||
int live);
|
||||
int live, int resource);
|
||||
extern int xen_domain_rcv(IOStream *io,
|
||||
uint32_t *dom,
|
||||
char **vmconfig, int *vmconfig_n,
|
||||
|
||||
+6
-3
@@ -96,7 +96,7 @@ receiver:
|
||||
Sxpr oxfr_configure; // (xfr.configure <vmid> <vmconfig>)
|
||||
Sxpr oxfr_err; // (xfr.err <code>)
|
||||
Sxpr oxfr_hello; // (xfr.hello <major> <minor>)
|
||||
Sxpr oxfr_migrate; // (xfr.migrate <vmid> <vmconfig> <host> <port> <live>)
|
||||
Sxpr oxfr_migrate; // (xfr.migrate <vmid> <vmconfig> <host> <port> <live> <resource>)
|
||||
Sxpr oxfr_migrate_ok;// (xfr.migrate.ok <value>)
|
||||
Sxpr oxfr_progress; // (xfr.progress <percent> <rate: kb/s>)
|
||||
Sxpr oxfr_restore; // (xfr.restore <file>)
|
||||
@@ -241,6 +241,7 @@ typedef struct XfrState {
|
||||
char *xfr_host;
|
||||
uint32_t vmid_new;
|
||||
int live;
|
||||
int resource;
|
||||
} XfrState;
|
||||
|
||||
/** Get the name of a transfer state.
|
||||
@@ -623,7 +624,7 @@ int xfr_send_state(XfrState *state, Conn *xend, Conn *peer){
|
||||
err = xen_domain_snd(xend, peer->out,
|
||||
state->vmid,
|
||||
state->vmconfig, state->vmconfig_n,
|
||||
state->live);
|
||||
state->live, state->resource);
|
||||
dprintf(">*** Sent domain %u\n", state->vmid);
|
||||
if(err) goto exit;
|
||||
// Sending the domain suspends it, and there's no way back.
|
||||
@@ -771,7 +772,7 @@ int xfr_save(Args *args, XfrState *state, Conn *xend, char *file){
|
||||
err = xen_domain_snd(xend, io,
|
||||
state->vmid,
|
||||
state->vmconfig, state->vmconfig_n,
|
||||
0);
|
||||
0, 0);
|
||||
if(err){
|
||||
err = xfr_error(xend, err);
|
||||
} else {
|
||||
@@ -926,6 +927,8 @@ int xfrd_service(Args *args, int peersock, struct sockaddr_in peer_in){
|
||||
if(err) goto exit;
|
||||
err = intof(sxpr_childN(sxpr, n++, ONONE), &state->live);
|
||||
if(err) goto exit;
|
||||
err = intof(sxpr_childN(sxpr, n++, ONONE), &state->resource);
|
||||
if(err) goto exit;
|
||||
err = xfr_send(args, state, conn, addr, port);
|
||||
|
||||
} else if(sxpr_elementp(sxpr, oxfr_save)){
|
||||
|
||||