@@ -876,6 +876,13 @@ void libxl_mac_copy(libxl_ctx *ctx, libxl_mac *dst, libxl_mac *src);
*/
#define LIBXL_HAVE_DEVICE_MODEL_VERSION_NONE 1
+/*
+ * LIBXL_HAVE_CHECKPOINTED_STREAM
+ *
+ * If this is defined, then libxl_checkpointed_stream exists.
+ */
+#define LIBXL_HAVE_CHECKPOINTED_STREAM 1
+
typedef char **libxl_string_list;
void libxl_string_list_dispose(libxl_string_list *sl);
int libxl_string_list_length(const libxl_string_list *sl);
@@ -1033,9 +1033,13 @@ static void domcreate_bootloader_done(libxl__egc *egc,
dcs->srs.completion_callback = domcreate_stream_done;
if (restore_fd >= 0) {
- if (checkpointed_stream)
+ switch (checkpointed_stream) {
+ case LIBXL_CHECKPOINTED_STREAM_REMUS:
libxl__remus_restore_setup(egc, dcs);
- libxl__stream_read_start(egc, &dcs->srs);
+ /* fall through */
+ case LIBXL_CHECKPOINTED_STREAM_NONE:
+ libxl__stream_read_start(egc, &dcs->srs);
+ }
return;
}
@@ -794,19 +794,22 @@ void libxl__xc_domain_restore_done(libxl__egc *egc, void *dcs_void,
* If the stream is not still alive, we must not continue any work.
*/
if (libxl__stream_read_inuse(stream)) {
- if (checkpointed_stream) {
+ switch (checkpointed_stream) {
+ case LIBXL_CHECKPOINTED_STREAM_REMUS:
/*
* Failover from primary. Domain state is currently at a
* consistent checkpoint, complete the stream, and call
* stream->completion_callback() to resume the guest.
*/
stream_complete(egc, stream, 0);
- } else {
+ break;
+ case LIBXL_CHECKPOINTED_STREAM_NONE:
/*
* Libxc has indicated that it is done with the stream.
* Resume reading libxl records from it.
*/
stream_continue(egc, stream);
+ break;
}
}
}
@@ -228,6 +228,11 @@ libxl_hdtype = Enumeration("hdtype", [
(2, "AHCI"),
], init_val = "LIBXL_HDTYPE_IDE")
+libxl_checkpointed_stream = Enumeration("checkpointed_stream", [
+ (0, "NONE"),
+ (1, "REMUS"),
+ ])
+
#
# Complex libxl types
#
@@ -4426,7 +4426,8 @@ static void migrate_domain(uint32_t domid, const char *rune, int debug,
}
static void migrate_receive(int debug, int daemonize, int monitor,
- int send_fd, int recv_fd, int remus)
+ int send_fd, int recv_fd,
+ libxl_checkpointed_stream checkpointed)
{
uint32_t domid;
int rc, rc2;
@@ -4451,7 +4452,7 @@ static void migrate_receive(int debug, int daemonize, int monitor,
dom_info.paused = 1;
dom_info.migrate_fd = recv_fd;
dom_info.migration_domname_r = &migration_domname;
- dom_info.checkpointed_stream = remus;
+ dom_info.checkpointed_stream = checkpointed;
rc = create_domain(&dom_info);
if (rc < 0) {
@@ -4462,7 +4463,8 @@ static void migrate_receive(int debug, int daemonize, int monitor,
domid = rc;
- if (remus) {
+ switch (checkpointed) {
+ case LIBXL_CHECKPOINTED_STREAM_REMUS:
/* If we are here, it means that the sender (primary) has crashed.
* TODO: Split-Brain Check.
*/
@@ -4495,6 +4497,9 @@ static void migrate_receive(int debug, int daemonize, int monitor,
common_domname, domid, rc);
exit(rc ? -ERROR_FAIL: 0);
+ default:
+ /* do nothing */
+ break;
}
fprintf(stderr, "migration target: Transfer complete,"
@@ -4632,7 +4637,8 @@ int main_restore(int argc, char **argv)
int main_migrate_receive(int argc, char **argv)
{
- int debug = 0, daemonize = 1, monitor = 1, remus = 0;
+ int debug = 0, daemonize = 1, monitor = 1;
+ libxl_checkpointed_stream checkpointed = LIBXL_CHECKPOINTED_STREAM_NONE;
int opt;
SWITCH_FOREACH_OPT(opt, "Fedr", NULL, "migrate-receive", 0) {
@@ -4647,7 +4653,7 @@ int main_migrate_receive(int argc, char **argv)
debug = 1;
break;
case 'r':
- remus = 1;
+ checkpointed = LIBXL_CHECKPOINTED_STREAM_REMUS;
break;
}
@@ -4657,7 +4663,7 @@ int main_migrate_receive(int argc, char **argv)
}
migrate_receive(debug, daemonize, monitor,
STDOUT_FILENO, STDIN_FILENO,
- remus);
+ checkpointed);
return 0;
}