11
11
//! This module does not implement any of the safety checks that should be run
12
12
//! *before* the migration.
13
13
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
+ } ;
15
22
16
23
use chrono:: { DateTime , Utc } ;
17
24
use compact_str:: CompactString ;
@@ -32,6 +39,7 @@ use crate::{
32
39
MasNewEmailThreepid , MasNewUnsupportedThreepid , MasNewUpstreamOauthLink , MasNewUser ,
33
40
MasNewUserPassword , MasWriteBuffer , MasWriter ,
34
41
} ,
42
+ progress:: { Progress , ProgressStage } ,
35
43
synapse_reader:: {
36
44
self , ExtractLocalpartError , FullUserId , SynapseAccessToken , SynapseDevice ,
37
45
SynapseExternalId , SynapseRefreshableTokenPair , SynapseThreepid , SynapseUser ,
@@ -147,6 +155,7 @@ pub async fn migrate(
147
155
clock : & dyn Clock ,
148
156
rng : & mut impl RngCore ,
149
157
provider_id_mapping : std:: collections:: HashMap < String , Uuid > ,
158
+ progress : & Progress ,
150
159
) -> Result < ( ) , Error > {
151
160
let counts = synapse. count_rows ( ) . await . into_synapse ( "counting users" ) ?;
152
161
@@ -162,14 +171,58 @@ pub async fn migrate(
162
171
provider_id_mapping,
163
172
} ;
164
173
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
+ } ) ;
168
205
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
+ } ) ;
170
215
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 ?;
173
226
174
227
synapse
175
228
. finish ( )
@@ -189,6 +242,7 @@ async fn migrate_users(
189
242
mut mas : MasWriter ,
190
243
mut state : MigrationState ,
191
244
rng : & mut impl RngCore ,
245
+ progress_counter : Arc < AtomicU32 > ,
192
246
) -> Result < ( MasWriter , MigrationState ) , Error > {
193
247
let start = Instant :: now ( ) ;
194
248
@@ -261,6 +315,8 @@ async fn migrate_users(
261
315
. await
262
316
. into_mas ( "writing password" ) ?;
263
317
}
318
+
319
+ progress_counter. fetch_add ( 1 , Ordering :: Relaxed ) ;
264
320
}
265
321
266
322
user_buffer
@@ -304,6 +360,7 @@ async fn migrate_threepids(
304
360
mut mas : MasWriter ,
305
361
rng : & mut impl RngCore ,
306
362
state : MigrationState ,
363
+ progress_counter : & AtomicU32 ,
307
364
) -> Result < ( MasWriter , MigrationState ) , Error > {
308
365
let start = Instant :: now ( ) ;
309
366
@@ -365,6 +422,8 @@ async fn migrate_threepids(
365
422
. await
366
423
. into_mas ( "writing unsupported threepid" ) ?;
367
424
}
425
+
426
+ progress_counter. fetch_add ( 1 , Ordering :: Relaxed ) ;
368
427
}
369
428
370
429
email_buffer
@@ -394,6 +453,7 @@ async fn migrate_external_ids(
394
453
mut mas : MasWriter ,
395
454
rng : & mut impl RngCore ,
396
455
state : MigrationState ,
456
+ progress_counter : & AtomicU32 ,
397
457
) -> Result < ( MasWriter , MigrationState ) , Error > {
398
458
let start = Instant :: now ( ) ;
399
459
@@ -447,6 +507,8 @@ async fn migrate_external_ids(
447
507
)
448
508
. await
449
509
. into_mas ( "failed to write upstream link" ) ?;
510
+
511
+ progress_counter. fetch_add ( 1 , Ordering :: Relaxed ) ;
450
512
}
451
513
452
514
write_buffer
@@ -476,6 +538,7 @@ async fn migrate_devices(
476
538
mut mas : MasWriter ,
477
539
rng : & mut impl RngCore ,
478
540
mut state : MigrationState ,
541
+ progress_counter : Arc < AtomicU32 > ,
479
542
) -> Result < ( MasWriter , MigrationState ) , Error > {
480
543
let start = Instant :: now ( ) ;
481
544
@@ -563,6 +626,8 @@ async fn migrate_devices(
563
626
)
564
627
. await
565
628
. into_mas ( "writing compat sessions" ) ?;
629
+
630
+ progress_counter. fetch_add ( 1 , Ordering :: Relaxed ) ;
566
631
}
567
632
568
633
write_buffer
@@ -605,6 +670,7 @@ async fn migrate_unrefreshable_access_tokens(
605
670
clock : & dyn Clock ,
606
671
rng : & mut impl RngCore ,
607
672
mut state : MigrationState ,
673
+ progress_counter : Arc < AtomicU32 > ,
608
674
) -> Result < ( MasWriter , MigrationState ) , Error > {
609
675
let start = Instant :: now ( ) ;
610
676
@@ -704,6 +770,8 @@ async fn migrate_unrefreshable_access_tokens(
704
770
)
705
771
. await
706
772
. into_mas ( "writing compat access tokens" ) ?;
773
+
774
+ progress_counter. fetch_add ( 1 , Ordering :: Relaxed ) ;
707
775
}
708
776
write_buffer
709
777
. finish ( & mut mas)
@@ -749,6 +817,7 @@ async fn migrate_refreshable_token_pairs(
749
817
clock : & dyn Clock ,
750
818
rng : & mut impl RngCore ,
751
819
mut state : MigrationState ,
820
+ progress_counter : & AtomicU32 ,
752
821
) -> Result < ( MasWriter , MigrationState ) , Error > {
753
822
let start = Instant :: now ( ) ;
754
823
@@ -830,6 +899,8 @@ async fn migrate_refreshable_token_pairs(
830
899
)
831
900
. await
832
901
. into_mas ( "writing compat refresh tokens" ) ?;
902
+
903
+ progress_counter. fetch_add ( 1 , Ordering :: Relaxed ) ;
833
904
}
834
905
835
906
access_token_write_buffer
0 commit comments