diff --git a/vmm/src/lib.rs b/vmm/src/lib.rs index 78ff205d3..75de067af 100644 --- a/vmm/src/lib.rs +++ b/vmm/src/lib.rs @@ -1453,15 +1453,7 @@ impl Vmm { // Capture snapshot and send it let vm_snapshot = vm.snapshot()?; - let snapshot_data = serde_json::to_vec(&vm_snapshot).unwrap(); - Request::state(snapshot_data.len() as u64).write_to(&mut socket)?; - socket - .write_all(&snapshot_data) - .map_err(MigratableError::MigrateSocket)?; - migration_transport::expect_ok_response( - &mut socket, - MigratableError::MigrateSend(anyhow!("Error during state migration")), - )?; + migration_transport::send_state(&mut socket, &vm_snapshot)?; // Complete the migration // At this step, the receiving VMM will acquire disk locks again. migration_transport::send_request_expect_ok( diff --git a/vmm/src/migration_transport.rs b/vmm/src/migration_transport.rs index 6cf3e5bd1..99d0e12df 100644 --- a/vmm/src/migration_transport.rs +++ b/vmm/src/migration_transport.rs @@ -12,8 +12,8 @@ use std::result::Result; use anyhow::{Context, anyhow}; use log::info; use serde_json; -use vm_migration::MigratableError; use vm_migration::protocol::{Request, Response}; +use vm_migration::{MigratableError, Snapshot}; use crate::{SocketStream, VmMigrationConfig}; @@ -117,3 +117,21 @@ pub(crate) fn send_config( MigratableError::MigrateSend(anyhow!("Error during config migration")), ) } + +/// Serialize and send the VM snapshot payload. +pub(crate) fn send_state( + socket: &mut SocketStream, + snapshot: &Snapshot, +) -> Result<(), MigratableError> { + let snapshot_data = serde_json::to_vec(snapshot) + .context("Error serializing VM snapshot") + .map_err(MigratableError::MigrateSend)?; + Request::state(snapshot_data.len() as u64).write_to(socket)?; + socket + .write_all(&snapshot_data) + .map_err(MigratableError::MigrateSocket)?; + expect_ok_response( + socket, + MigratableError::MigrateSend(anyhow!("Error during state migration")), + ) +}