@@ -758,6 +758,9 @@ void libxl__xc_domain_restore_done(libxl__egc *egc, void *dcs_void,
libxl__stream_read_state *stream = &dcs->srs;
STATE_AO_GC(dcs->ao);
+ /* convenience aliases */
+ const int checkpointed_stream = dcs->restore_params.checkpointed_stream;
+
if (rc)
goto err;
@@ -777,11 +780,19 @@ 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)) {
- /*
- * Libxc has indicated that it is done with the stream. Resume reading
- * libxl records from it.
- */
- stream_continue(egc, stream);
+ if (checkpointed_stream) {
+ /*
+ * Failover from primary. Domain state is currently at a
+ * consistent checkpoint, ready to go.
+ */
+ stream_complete(egc, stream, 0);
+ } else {
+ /*
+ * Libxc has indicated that it is done with the stream.
+ * Resume reading libxl records from it.
+ */
+ stream_continue(egc, stream);
+ }
}
}