@@ -6,7 +6,8 @@ use bitvec::prelude as bv;
66use futures:: { SinkExt , StreamExt } ;
77use propolis:: common:: { GuestAddr , Lifecycle , PAGE_SIZE } ;
88use propolis:: migrate:: {
9- MigrateCtx , MigrateStateError , Migrator , PayloadOffer , PayloadOffers ,
9+ MigrateCtx , MigrateSingle , MigrateStateError , Migrator , PayloadOffer ,
10+ PayloadOffers ,
1011} ;
1112use propolis:: vmm;
1213use propolis_api_types:: instance_spec:: SpecKey ;
@@ -22,10 +23,10 @@ use tokio_tungstenite::tungstenite::protocol::CloseFrame;
2223use tokio_tungstenite:: { tungstenite, WebSocketStream } ;
2324use uuid:: Uuid ;
2425
25- use crate :: migrate:: codec;
2626use crate :: migrate:: memx;
2727use crate :: migrate:: preamble:: Preamble ;
2828use crate :: migrate:: probes;
29+ use crate :: migrate:: { codec, DevicePayload } ;
2930use crate :: migrate:: {
3031 Device , MigrateError , MigratePhase , MigrateRole , MigrationState , PageIter ,
3132} ;
@@ -511,6 +512,21 @@ impl<T: MigrateConn> RonV0<T> {
511512 return Err ( MigrateError :: UnexpectedMessage ) ;
512513 }
513514 } ;
515+
516+ let com1_payload: DevicePayload = match self . read_msg ( ) . await ? {
517+ codec:: Message :: Serialized ( encoded) => {
518+ ron:: de:: from_reader ( encoded. as_bytes ( ) )
519+ . map_err ( codec:: ProtocolError :: from) ?
520+ }
521+ msg => {
522+ error ! (
523+ self . log( ) ,
524+ "device_state: unexpected COM1 history message: {msg:?}"
525+ ) ;
526+ return Err ( MigrateError :: UnexpectedMessage ) ;
527+ }
528+ } ;
529+
514530 self . read_ok ( ) . await ?;
515531
516532 info ! ( self . log( ) , "Devices: {devices:#?}" ) ;
@@ -529,6 +545,18 @@ impl<T: MigrateConn> RonV0<T> {
529545 } ) ?;
530546 self . import_device ( & target, & device, & migrate_ctx) ?;
531547 }
548+
549+ let com1_data =
550+ & mut ron:: Deserializer :: from_str ( & com1_payload. data )
551+ . map_err ( codec:: ProtocolError :: from) ?;
552+ let com1_offer = PayloadOffer {
553+ kind : & com1_payload. kind ,
554+ version : com1_payload. version ,
555+ payload : Box :: new ( <dyn erased_serde:: Deserializer >:: erase (
556+ com1_data,
557+ ) ) ,
558+ } ;
559+ vm_objects. com1 ( ) . import ( com1_offer, & migrate_ctx) ?;
532560 }
533561
534562 self . send_msg ( codec:: Message :: Okay ) . await
@@ -762,24 +790,8 @@ impl<T: MigrateConn> RonV0<T> {
762790 . map_err ( codec:: ProtocolError :: from) ?,
763791 ) )
764792 . await ?;
765- let com1_history = match self . read_msg ( ) . await ? {
766- codec:: Message :: Serialized ( encoded) => encoded,
767- msg => {
768- error ! ( self . log( ) , "server_state: unexpected message: {msg:?}" ) ;
769- return Err ( MigrateError :: UnexpectedMessage ) ;
770- }
771- } ;
772-
773- ensure_ctx
774- . vm_objects ( )
775- . lock_shared ( )
776- . await
777- . com1 ( )
778- . import ( & com1_history)
779- . await
780- . map_err ( |e| MigrateError :: Codec ( e. to_string ( ) ) ) ?;
781793
782- self . send_msg ( codec :: Message :: Okay ) . await
794+ Ok ( ( ) )
783795 }
784796
785797 async fn finish (
0 commit comments