@@ -6,7 +6,8 @@ use bitvec::prelude as bv;
6
6
use futures:: { SinkExt , StreamExt } ;
7
7
use propolis:: common:: { GuestAddr , Lifecycle , PAGE_SIZE } ;
8
8
use propolis:: migrate:: {
9
- MigrateCtx , MigrateStateError , Migrator , PayloadOffer , PayloadOffers ,
9
+ MigrateCtx , MigrateSingle , MigrateStateError , Migrator , PayloadOffer ,
10
+ PayloadOffers ,
10
11
} ;
11
12
use propolis:: vmm;
12
13
use propolis_api_types:: instance_spec:: SpecKey ;
@@ -22,10 +23,10 @@ use tokio_tungstenite::tungstenite::protocol::CloseFrame;
22
23
use tokio_tungstenite:: { tungstenite, WebSocketStream } ;
23
24
use uuid:: Uuid ;
24
25
25
- use crate :: migrate:: codec;
26
26
use crate :: migrate:: memx;
27
27
use crate :: migrate:: preamble:: Preamble ;
28
28
use crate :: migrate:: probes;
29
+ use crate :: migrate:: { codec, DevicePayload } ;
29
30
use crate :: migrate:: {
30
31
Device , MigrateError , MigratePhase , MigrateRole , MigrationState , PageIter ,
31
32
} ;
@@ -511,6 +512,21 @@ impl<T: MigrateConn> RonV0<T> {
511
512
return Err ( MigrateError :: UnexpectedMessage ) ;
512
513
}
513
514
} ;
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
+
514
530
self . read_ok ( ) . await ?;
515
531
516
532
info ! ( self . log( ) , "Devices: {devices:#?}" ) ;
@@ -529,6 +545,18 @@ impl<T: MigrateConn> RonV0<T> {
529
545
} ) ?;
530
546
self . import_device ( & target, & device, & migrate_ctx) ?;
531
547
}
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) ?;
532
560
}
533
561
534
562
self . send_msg ( codec:: Message :: Okay ) . await
@@ -762,24 +790,8 @@ impl<T: MigrateConn> RonV0<T> {
762
790
. map_err ( codec:: ProtocolError :: from) ?,
763
791
) )
764
792
. 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 ( ) ) ) ?;
781
793
782
- self . send_msg ( codec :: Message :: Okay ) . await
794
+ Ok ( ( ) )
783
795
}
784
796
785
797
async fn finish (
0 commit comments