@@ -5,6 +5,11 @@ pub use movement_core::{Overlay, Overlays};
5
5
use mtma_node_types:: executor:: MovementNode ;
6
6
pub use mtma_types:: movement:: aptos_types:: { chain_id:: ChainId , state_store:: TStateView } ;
7
7
use mtma_types:: movement:: movement_client:: rest_client:: Client as MovementRestClient ;
8
+ pub mod live;
9
+ pub use live:: LiveMigrator ;
10
+ use mtma_util:: file:: copy_dir_recursive;
11
+ use std:: path:: PathBuf ;
12
+ use tracing:: warn;
8
13
9
14
/// An enum supporting different types of runners.
10
15
///
@@ -14,6 +19,8 @@ use mtma_types::movement::movement_client::rest_client::Client as MovementRestCl
14
19
pub enum Runner {
15
20
/// [Movement] runner.
16
21
Movement ( Movement ) ,
22
+ /// [LiveMigrator] runner.
23
+ Live ( LiveMigrator ) ,
17
24
}
18
25
19
26
/// The Movement migration struct as would be presented in the criterion.
@@ -35,6 +42,7 @@ impl MovementMigrator {
35
42
pub async fn run ( & self ) -> Result < ( ) , anyhow:: Error > {
36
43
match & self . runner {
37
44
Runner :: Movement ( movement) => Ok ( movement. run ( ) . await ?) ,
45
+ Runner :: Live ( live) => Ok ( live. run ( ) . await ?) ,
38
46
}
39
47
}
40
48
@@ -71,6 +79,7 @@ impl MovementMigrator {
71
79
. context ( "failed to wait for Movement rest api" ) ?;
72
80
Ok ( rest_api. listen_url ( ) . to_string ( ) )
73
81
}
82
+ Runner :: Live ( live) => live. wait_for_live_rest_api_url ( ) . await ,
74
83
}
75
84
}
76
85
@@ -94,13 +103,41 @@ impl MovementMigrator {
94
103
Runner :: Movement ( movement) => {
95
104
MovementNode :: try_from_dir ( movement. workspace_path ( ) . to_path_buf ( ) ) . await
96
105
}
106
+ Runner :: Live ( live) => MovementNode :: try_from_dir ( live. dir . clone ( ) ) . await ,
97
107
}
98
108
}
99
109
100
110
/// Sets the overlays for the runner.
101
111
pub fn set_overlays ( & mut self , overlays : Overlays ) {
102
112
match & mut self . runner {
103
113
Runner :: Movement ( movement) => movement. set_overlays ( overlays) ,
114
+ Runner :: Live ( _live) => {
115
+ warn ! ( "Setting overlays for live migrator is not supported as the runner is already live. If you want to set overlays consider snapshotting the live migrator and using that as a movement runner." ) ;
116
+ }
117
+ }
118
+ }
119
+
120
+ /// Gets the dir for the runner
121
+ pub fn dir ( & self ) -> PathBuf {
122
+ match & self . runner {
123
+ Runner :: Movement ( movement) => movement. workspace_path ( ) . to_path_buf ( ) ,
124
+ Runner :: Live ( live) => live. dir . clone ( ) ,
104
125
}
105
126
}
127
+
128
+ /// Recursively copies the dir for the runner to the given path
129
+ pub async fn copy_dir ( & self , path : PathBuf ) -> Result < ( ) , anyhow:: Error > {
130
+ let dir = self . dir ( ) ;
131
+ copy_dir_recursive ( & dir, & path) . context ( "failed to copy dir for MovementMigrator" ) ?;
132
+ Ok ( ( ) )
133
+ }
134
+
135
+ /// Snapshots the migrator
136
+ ///
137
+ /// NOTE: this can be used to, for example, transition from a live migrator to a movement runner.
138
+ pub async fn snapshot ( & self , path : PathBuf ) -> Result < Self , anyhow:: Error > {
139
+ self . copy_dir ( path. clone ( ) ) . await ?;
140
+
141
+ Ok ( Self :: new ( Runner :: Movement ( Movement :: try_from_dot_movement_dir ( path) ?) ) )
142
+ }
106
143
}
0 commit comments