@@ -186,7 +186,9 @@ impl WriterConnectionPool {
186
186
}
187
187
188
188
pub struct MasWriter < ' c > {
189
- conn : LockedMasDatabase < ' c > ,
189
+ conn : LockedMasDatabase ,
190
+ // Temporary phantom data, so that we don't remove the lifetime parameter yet
191
+ phantom : std:: marker:: PhantomData < & ' c ( ) > ,
190
192
writer_pool : WriterConnectionPool ,
191
193
192
194
indices_to_restore : Vec < IndexDescription > ,
@@ -324,7 +326,7 @@ pub async fn is_syn2mas_in_progress(conn: &mut PgConnection) -> Result<bool, Err
324
326
}
325
327
}
326
328
327
- impl < ' conn > MasWriter < ' conn > {
329
+ impl MasWriter < ' _ > {
328
330
/// Creates a new MAS writer.
329
331
///
330
332
/// # Errors
@@ -335,7 +337,7 @@ impl<'conn> MasWriter<'conn> {
335
337
#[ allow( clippy:: missing_panics_doc) ] // not real
336
338
#[ tracing:: instrument( skip_all) ]
337
339
pub async fn new (
338
- mut conn : LockedMasDatabase < ' conn > ,
340
+ mut conn : LockedMasDatabase ,
339
341
mut writer_connections : Vec < PgConnection > ,
340
342
) -> Result < Self , Error > {
341
343
// Given that we don't have any concurrent transactions here,
@@ -446,6 +448,7 @@ impl<'conn> MasWriter<'conn> {
446
448
447
449
Ok ( Self {
448
450
conn,
451
+ phantom : std:: marker:: PhantomData ,
449
452
writer_pool : WriterConnectionPool :: new ( writer_connections) ,
450
453
indices_to_restore,
451
454
constraints_to_restore,
@@ -488,7 +491,7 @@ impl<'conn> MasWriter<'conn> {
488
491
}
489
492
490
493
async fn restore_indices (
491
- conn : & mut LockedMasDatabase < ' _ > ,
494
+ conn : & mut LockedMasDatabase ,
492
495
indices_to_restore : & [ IndexDescription ] ,
493
496
constraints_to_restore : & [ ConstraintDescription ] ,
494
497
) -> Result < ( ) , Error > {
@@ -507,14 +510,15 @@ impl<'conn> MasWriter<'conn> {
507
510
}
508
511
509
512
/// Finish writing to the MAS database, flushing and committing all changes.
513
+ /// It returns the unlocked underlying connection.
510
514
///
511
515
/// # Errors
512
516
///
513
517
/// Errors are returned in the following conditions:
514
518
///
515
519
/// - If the database connection experiences an error.
516
520
#[ tracing:: instrument( skip_all) ]
517
- pub async fn finish ( mut self ) -> Result < ( ) , Error > {
521
+ pub async fn finish ( mut self ) -> Result < PgConnection , Error > {
518
522
// Commit all writer transactions to the database.
519
523
self . writer_pool
520
524
. finish ( )
@@ -549,12 +553,13 @@ impl<'conn> MasWriter<'conn> {
549
553
. await
550
554
. into_database ( "ending MAS transaction" ) ?;
551
555
552
- self . conn
556
+ let conn = self
557
+ . conn
553
558
. unlock ( )
554
559
. await
555
560
. into_database ( "could not unlock MAS database" ) ?;
556
561
557
- Ok ( ( ) )
562
+ Ok ( conn )
558
563
}
559
564
560
565
/// Write a batch of users to the database.
@@ -1180,10 +1185,8 @@ mod test {
1180
1185
/// Runs some code with a `MasWriter`.
1181
1186
///
1182
1187
/// The callback is responsible for `finish`ing the `MasWriter`.
1183
- async fn make_mas_writer < ' conn > (
1184
- pool : & PgPool ,
1185
- main_conn : & ' conn mut PgConnection ,
1186
- ) -> MasWriter < ' conn > {
1188
+ async fn make_mas_writer ( pool : & PgPool ) -> MasWriter < ' static > {
1189
+ let main_conn = pool. acquire ( ) . await . unwrap ( ) . detach ( ) ;
1187
1190
let mut writer_conns = Vec :: new ( ) ;
1188
1191
for _ in 0 ..2 {
1189
1192
writer_conns. push (
@@ -1205,8 +1208,7 @@ mod test {
1205
1208
/// Tests writing a single user, without a password.
1206
1209
#[ sqlx:: test( migrator = "mas_storage_pg::MIGRATOR" ) ]
1207
1210
async fn test_write_user ( pool : PgPool ) {
1208
- let mut conn = pool. acquire ( ) . await . unwrap ( ) ;
1209
- let mut writer = make_mas_writer ( & pool, & mut conn) . await ;
1211
+ let mut writer = make_mas_writer ( & pool) . await ;
1210
1212
1211
1213
writer
1212
1214
. write_users ( vec ! [ MasNewUser {
@@ -1220,7 +1222,7 @@ mod test {
1220
1222
. await
1221
1223
. expect ( "failed to write user" ) ;
1222
1224
1223
- writer. finish ( ) . await . expect ( "failed to finish MasWriter" ) ;
1225
+ let mut conn = writer. finish ( ) . await . expect ( "failed to finish MasWriter" ) ;
1224
1226
1225
1227
assert_db_snapshot ! ( & mut conn) ;
1226
1228
}
@@ -1230,8 +1232,7 @@ mod test {
1230
1232
async fn test_write_user_with_password ( pool : PgPool ) {
1231
1233
const USER_ID : Uuid = Uuid :: from_u128 ( 1u128 ) ;
1232
1234
1233
- let mut conn = pool. acquire ( ) . await . unwrap ( ) ;
1234
- let mut writer = make_mas_writer ( & pool, & mut conn) . await ;
1235
+ let mut writer = make_mas_writer ( & pool) . await ;
1235
1236
1236
1237
writer
1237
1238
. write_users ( vec ! [ MasNewUser {
@@ -1254,16 +1255,15 @@ mod test {
1254
1255
. await
1255
1256
. expect ( "failed to write password" ) ;
1256
1257
1257
- writer. finish ( ) . await . expect ( "failed to finish MasWriter" ) ;
1258
+ let mut conn = writer. finish ( ) . await . expect ( "failed to finish MasWriter" ) ;
1258
1259
1259
1260
assert_db_snapshot ! ( & mut conn) ;
1260
1261
}
1261
1262
1262
1263
/// Tests writing a single user, with an e-mail address associated.
1263
1264
#[ sqlx:: test( migrator = "mas_storage_pg::MIGRATOR" ) ]
1264
1265
async fn test_write_user_with_email ( pool : PgPool ) {
1265
- let mut conn = pool. acquire ( ) . await . unwrap ( ) ;
1266
- let mut writer = make_mas_writer ( & pool, & mut conn) . await ;
1266
+ let mut writer = make_mas_writer ( & pool) . await ;
1267
1267
1268
1268
writer
1269
1269
. write_users ( vec ! [ MasNewUser {
@@ -1287,7 +1287,7 @@ mod test {
1287
1287
. await
1288
1288
. expect ( "failed to write e-mail" ) ;
1289
1289
1290
- writer. finish ( ) . await . expect ( "failed to finish MasWriter" ) ;
1290
+ let mut conn = writer. finish ( ) . await . expect ( "failed to finish MasWriter" ) ;
1291
1291
1292
1292
assert_db_snapshot ! ( & mut conn) ;
1293
1293
}
@@ -1296,8 +1296,7 @@ mod test {
1296
1296
/// associated.
1297
1297
#[ sqlx:: test( migrator = "mas_storage_pg::MIGRATOR" ) ]
1298
1298
async fn test_write_user_with_unsupported_threepid ( pool : PgPool ) {
1299
- let mut conn = pool. acquire ( ) . await . unwrap ( ) ;
1300
- let mut writer = make_mas_writer ( & pool, & mut conn) . await ;
1299
+ let mut writer = make_mas_writer ( & pool) . await ;
1301
1300
1302
1301
writer
1303
1302
. write_users ( vec ! [ MasNewUser {
@@ -1321,7 +1320,7 @@ mod test {
1321
1320
. await
1322
1321
. expect ( "failed to write phone number (unsupported threepid)" ) ;
1323
1322
1324
- writer. finish ( ) . await . expect ( "failed to finish MasWriter" ) ;
1323
+ let mut conn = writer. finish ( ) . await . expect ( "failed to finish MasWriter" ) ;
1325
1324
1326
1325
assert_db_snapshot ! ( & mut conn) ;
1327
1326
}
@@ -1331,8 +1330,7 @@ mod test {
1331
1330
/// real migration, this is done by running a provider sync first.
1332
1331
#[ sqlx:: test( migrator = "mas_storage_pg::MIGRATOR" , fixtures( "upstream_provider" ) ) ]
1333
1332
async fn test_write_user_with_upstream_provider_link ( pool : PgPool ) {
1334
- let mut conn = pool. acquire ( ) . await . unwrap ( ) ;
1335
- let mut writer = make_mas_writer ( & pool, & mut conn) . await ;
1333
+ let mut writer = make_mas_writer ( & pool) . await ;
1336
1334
1337
1335
writer
1338
1336
. write_users ( vec ! [ MasNewUser {
@@ -1357,16 +1355,15 @@ mod test {
1357
1355
. await
1358
1356
. expect ( "failed to write link" ) ;
1359
1357
1360
- writer. finish ( ) . await . expect ( "failed to finish MasWriter" ) ;
1358
+ let mut conn = writer. finish ( ) . await . expect ( "failed to finish MasWriter" ) ;
1361
1359
1362
1360
assert_db_snapshot ! ( & mut conn) ;
1363
1361
}
1364
1362
1365
1363
/// Tests writing a single user, with a device (compat session).
1366
1364
#[ sqlx:: test( migrator = "mas_storage_pg::MIGRATOR" ) ]
1367
1365
async fn test_write_user_with_device ( pool : PgPool ) {
1368
- let mut conn = pool. acquire ( ) . await . unwrap ( ) ;
1369
- let mut writer = make_mas_writer ( & pool, & mut conn) . await ;
1366
+ let mut writer = make_mas_writer ( & pool) . await ;
1370
1367
1371
1368
writer
1372
1369
. write_users ( vec ! [ MasNewUser {
@@ -1395,16 +1392,15 @@ mod test {
1395
1392
. await
1396
1393
. expect ( "failed to write compat session" ) ;
1397
1394
1398
- writer. finish ( ) . await . expect ( "failed to finish MasWriter" ) ;
1395
+ let mut conn = writer. finish ( ) . await . expect ( "failed to finish MasWriter" ) ;
1399
1396
1400
1397
assert_db_snapshot ! ( & mut conn) ;
1401
1398
}
1402
1399
1403
1400
/// Tests writing a single user, with a device and an access token.
1404
1401
#[ sqlx:: test( migrator = "mas_storage_pg::MIGRATOR" ) ]
1405
1402
async fn test_write_user_with_access_token ( pool : PgPool ) {
1406
- let mut conn = pool. acquire ( ) . await . unwrap ( ) ;
1407
- let mut writer = make_mas_writer ( & pool, & mut conn) . await ;
1403
+ let mut writer = make_mas_writer ( & pool) . await ;
1408
1404
1409
1405
writer
1410
1406
. write_users ( vec ! [ MasNewUser {
@@ -1444,7 +1440,7 @@ mod test {
1444
1440
. await
1445
1441
. expect ( "failed to write access token" ) ;
1446
1442
1447
- writer. finish ( ) . await . expect ( "failed to finish MasWriter" ) ;
1443
+ let mut conn = writer. finish ( ) . await . expect ( "failed to finish MasWriter" ) ;
1448
1444
1449
1445
assert_db_snapshot ! ( & mut conn) ;
1450
1446
}
@@ -1453,8 +1449,7 @@ mod test {
1453
1449
/// refresh token.
1454
1450
#[ sqlx:: test( migrator = "mas_storage_pg::MIGRATOR" ) ]
1455
1451
async fn test_write_user_with_refresh_token ( pool : PgPool ) {
1456
- let mut conn = pool. acquire ( ) . await . unwrap ( ) ;
1457
- let mut writer = make_mas_writer ( & pool, & mut conn) . await ;
1452
+ let mut writer = make_mas_writer ( & pool) . await ;
1458
1453
1459
1454
writer
1460
1455
. write_users ( vec ! [ MasNewUser {
@@ -1505,7 +1500,7 @@ mod test {
1505
1500
. await
1506
1501
. expect ( "failed to write refresh token" ) ;
1507
1502
1508
- writer. finish ( ) . await . expect ( "failed to finish MasWriter" ) ;
1503
+ let mut conn = writer. finish ( ) . await . expect ( "failed to finish MasWriter" ) ;
1509
1504
1510
1505
assert_db_snapshot ! ( & mut conn) ;
1511
1506
}
0 commit comments