(
&mut self,
send_data_migration: VmSendMigrationData,
)
| 2556 | } |
| 2557 | |
| 2558 | fn vm_send_migration( |
| 2559 | &mut self, |
| 2560 | send_data_migration: VmSendMigrationData, |
| 2561 | ) -> result::Result<(), MigratableError> { |
| 2562 | send_data_migration |
| 2563 | .validate() |
| 2564 | .context("Invalid send migration configuration") |
| 2565 | .map_err(MigratableError::MigrateSend)?; |
| 2566 | |
| 2567 | info!( |
| 2568 | "Sending migration: destination_url={},local={},downtime={}ms,timeout={}s,timeout_strategy={:?}", |
| 2569 | send_data_migration.destination_url, |
| 2570 | send_data_migration.local, |
| 2571 | send_data_migration.downtime().as_millis(), |
| 2572 | send_data_migration.timeout().as_secs(), |
| 2573 | send_data_migration.timeout_strategy |
| 2574 | ); |
| 2575 | |
| 2576 | if !self |
| 2577 | .vm_config |
| 2578 | .as_ref() |
| 2579 | .unwrap() |
| 2580 | .lock() |
| 2581 | .unwrap() |
| 2582 | .backed_by_shared_memory() |
| 2583 | && send_data_migration.local |
| 2584 | { |
| 2585 | return Err(MigratableError::MigrateSend(anyhow!( |
| 2586 | "Local migration requires shared memory or hugepages enabled" |
| 2587 | ))); |
| 2588 | } |
| 2589 | |
| 2590 | let vm = self |
| 2591 | .vm |
| 2592 | .as_mut() |
| 2593 | .ok_or_else(|| MigratableError::MigrateSend(anyhow!("VM is not running")))?; |
| 2594 | |
| 2595 | let initial_vm_state = vm.get_state(); |
| 2596 | if initial_vm_state != VmState::Running && initial_vm_state != VmState::Paused { |
| 2597 | return Err(MigratableError::MigrateSend(anyhow!( |
| 2598 | "VM is not running or paused: {initial_vm_state:?}" |
| 2599 | ))); |
| 2600 | } |
| 2601 | |
| 2602 | event!("vm", "migration-started"); |
| 2603 | Self::send_migration( |
| 2604 | vm, |
| 2605 | #[cfg(all(feature = "kvm", target_arch = "x86_64"))] |
| 2606 | self.hypervisor.as_ref(), |
| 2607 | &send_data_migration, |
| 2608 | initial_vm_state, |
| 2609 | ) |
| 2610 | .map_err(|migration_err| { |
| 2611 | error!("Migration failed: {migration_err:?}"); |
| 2612 | event!("vm", "migration-failed"); |
| 2613 | |
| 2614 | // Stop logging dirty pages only for non-local migrations |
| 2615 | if !send_data_migration.local |
no test coverage detected