1111//! This module does not implement any of the safety checks that should be run
1212//! *before* the migration.
1313
14- use std:: { pin:: pin, time:: Instant } ;
14+ use std:: {
15+ pin:: pin,
16+ sync:: {
17+ Arc ,
18+ atomic:: { AtomicU32 , Ordering } ,
19+ } ,
20+ time:: Instant ,
21+ } ;
1522
1623use chrono:: { DateTime , Utc } ;
1724use compact_str:: CompactString ;
@@ -32,6 +39,7 @@ use crate::{
3239 MasNewEmailThreepid , MasNewUnsupportedThreepid , MasNewUpstreamOauthLink , MasNewUser ,
3340 MasNewUserPassword , MasWriteBuffer , MasWriter ,
3441 } ,
42+ progress:: { Progress , ProgressStage } ,
3543 synapse_reader:: {
3644 self , ExtractLocalpartError , FullUserId , SynapseAccessToken , SynapseDevice ,
3745 SynapseExternalId , SynapseRefreshableTokenPair , SynapseThreepid , SynapseUser ,
@@ -147,6 +155,7 @@ pub async fn migrate(
147155 clock : & dyn Clock ,
148156 rng : & mut impl RngCore ,
149157 provider_id_mapping : std:: collections:: HashMap < String , Uuid > ,
158+ progress : & Progress ,
150159) -> Result < ( ) , Error > {
151160 let counts = synapse. count_rows ( ) . await . into_synapse ( "counting users" ) ?;
152161
@@ -162,14 +171,58 @@ pub async fn migrate(
162171 provider_id_mapping,
163172 } ;
164173
165- let ( mas, state) = migrate_users ( & mut synapse, mas, state, rng) . await ?;
166- let ( mas, state) = migrate_threepids ( & mut synapse, mas, rng, state) . await ?;
167- let ( mas, state) = migrate_external_ids ( & mut synapse, mas, rng, state) . await ?;
174+ let migrated_counter = Arc :: new ( AtomicU32 :: new ( 0 ) ) ;
175+ progress. set_current_stage ( ProgressStage :: MigratingData {
176+ entity : "users" ,
177+ migrated : migrated_counter. clone ( ) ,
178+ approx_count : counts. users as u64 ,
179+ } ) ;
180+ let ( mas, state) = migrate_users ( & mut synapse, mas, state, rng, migrated_counter) . await ?;
181+
182+ let migrated_counter = Arc :: new ( AtomicU32 :: new ( 0 ) ) ;
183+ progress. set_current_stage ( ProgressStage :: MigratingData {
184+ entity : "threepids" ,
185+ migrated : migrated_counter. clone ( ) ,
186+ approx_count : counts. users as u64 ,
187+ } ) ;
188+ let ( mas, state) = migrate_threepids ( & mut synapse, mas, rng, state, & migrated_counter) . await ?;
189+
190+ let migrated_counter = Arc :: new ( AtomicU32 :: new ( 0 ) ) ;
191+ progress. set_current_stage ( ProgressStage :: MigratingData {
192+ entity : "external_ids" ,
193+ migrated : migrated_counter. clone ( ) ,
194+ approx_count : counts. users as u64 ,
195+ } ) ;
196+ let ( mas, state) =
197+ migrate_external_ids ( & mut synapse, mas, rng, state, & migrated_counter) . await ?;
198+
199+ let migrated_counter = Arc :: new ( AtomicU32 :: new ( 0 ) ) ;
200+ progress. set_current_stage ( ProgressStage :: MigratingData {
201+ entity : "unrefreshable_access_tokens" ,
202+ migrated : migrated_counter. clone ( ) ,
203+ approx_count : counts. users as u64 ,
204+ } ) ;
168205 let ( mas, state) =
169- migrate_unrefreshable_access_tokens ( & mut synapse, mas, clock, rng, state) . await ?;
206+ migrate_unrefreshable_access_tokens ( & mut synapse, mas, clock, rng, state, migrated_counter)
207+ . await ?;
208+
209+ let migrated_counter = Arc :: new ( AtomicU32 :: new ( 0 ) ) ;
210+ progress. set_current_stage ( ProgressStage :: MigratingData {
211+ entity : "refreshable_token_pairs" ,
212+ migrated : migrated_counter. clone ( ) ,
213+ approx_count : counts. users as u64 ,
214+ } ) ;
170215 let ( mas, state) =
171- migrate_refreshable_token_pairs ( & mut synapse, mas, clock, rng, state) . await ?;
172- let ( mas, _state) = migrate_devices ( & mut synapse, mas, rng, state) . await ?;
216+ migrate_refreshable_token_pairs ( & mut synapse, mas, clock, rng, state, & migrated_counter)
217+ . await ?;
218+
219+ let migrated_counter = Arc :: new ( AtomicU32 :: new ( 0 ) ) ;
220+ progress. set_current_stage ( ProgressStage :: MigratingData {
221+ entity : "devices" ,
222+ migrated : migrated_counter. clone ( ) ,
223+ approx_count : counts. users as u64 ,
224+ } ) ;
225+ let ( mas, _state) = migrate_devices ( & mut synapse, mas, rng, state, migrated_counter) . await ?;
173226
174227 synapse
175228 . finish ( )
@@ -189,6 +242,7 @@ async fn migrate_users(
189242 mut mas : MasWriter ,
190243 mut state : MigrationState ,
191244 rng : & mut impl RngCore ,
245+ progress_counter : Arc < AtomicU32 > ,
192246) -> Result < ( MasWriter , MigrationState ) , Error > {
193247 let start = Instant :: now ( ) ;
194248
@@ -261,6 +315,8 @@ async fn migrate_users(
261315 . await
262316 . into_mas ( "writing password" ) ?;
263317 }
318+
319+ progress_counter. fetch_add ( 1 , Ordering :: Relaxed ) ;
264320 }
265321
266322 user_buffer
@@ -304,6 +360,7 @@ async fn migrate_threepids(
304360 mut mas : MasWriter ,
305361 rng : & mut impl RngCore ,
306362 state : MigrationState ,
363+ progress_counter : & AtomicU32 ,
307364) -> Result < ( MasWriter , MigrationState ) , Error > {
308365 let start = Instant :: now ( ) ;
309366
@@ -365,6 +422,8 @@ async fn migrate_threepids(
365422 . await
366423 . into_mas ( "writing unsupported threepid" ) ?;
367424 }
425+
426+ progress_counter. fetch_add ( 1 , Ordering :: Relaxed ) ;
368427 }
369428
370429 email_buffer
@@ -394,6 +453,7 @@ async fn migrate_external_ids(
394453 mut mas : MasWriter ,
395454 rng : & mut impl RngCore ,
396455 state : MigrationState ,
456+ progress_counter : & AtomicU32 ,
397457) -> Result < ( MasWriter , MigrationState ) , Error > {
398458 let start = Instant :: now ( ) ;
399459
@@ -447,6 +507,8 @@ async fn migrate_external_ids(
447507 )
448508 . await
449509 . into_mas ( "failed to write upstream link" ) ?;
510+
511+ progress_counter. fetch_add ( 1 , Ordering :: Relaxed ) ;
450512 }
451513
452514 write_buffer
@@ -476,6 +538,7 @@ async fn migrate_devices(
476538 mut mas : MasWriter ,
477539 rng : & mut impl RngCore ,
478540 mut state : MigrationState ,
541+ progress_counter : Arc < AtomicU32 > ,
479542) -> Result < ( MasWriter , MigrationState ) , Error > {
480543 let start = Instant :: now ( ) ;
481544
@@ -563,6 +626,8 @@ async fn migrate_devices(
563626 )
564627 . await
565628 . into_mas ( "writing compat sessions" ) ?;
629+
630+ progress_counter. fetch_add ( 1 , Ordering :: Relaxed ) ;
566631 }
567632
568633 write_buffer
@@ -605,6 +670,7 @@ async fn migrate_unrefreshable_access_tokens(
605670 clock : & dyn Clock ,
606671 rng : & mut impl RngCore ,
607672 mut state : MigrationState ,
673+ progress_counter : Arc < AtomicU32 > ,
608674) -> Result < ( MasWriter , MigrationState ) , Error > {
609675 let start = Instant :: now ( ) ;
610676
@@ -704,6 +770,8 @@ async fn migrate_unrefreshable_access_tokens(
704770 )
705771 . await
706772 . into_mas ( "writing compat access tokens" ) ?;
773+
774+ progress_counter. fetch_add ( 1 , Ordering :: Relaxed ) ;
707775 }
708776 write_buffer
709777 . finish ( & mut mas)
@@ -749,6 +817,7 @@ async fn migrate_refreshable_token_pairs(
749817 clock : & dyn Clock ,
750818 rng : & mut impl RngCore ,
751819 mut state : MigrationState ,
820+ progress_counter : & AtomicU32 ,
752821) -> Result < ( MasWriter , MigrationState ) , Error > {
753822 let start = Instant :: now ( ) ;
754823
@@ -830,6 +899,8 @@ async fn migrate_refreshable_token_pairs(
830899 )
831900 . await
832901 . into_mas ( "writing compat refresh tokens" ) ?;
902+
903+ progress_counter. fetch_add ( 1 , Ordering :: Relaxed ) ;
833904 }
834905
835906 access_token_write_buffer
0 commit comments