@@ -1643,35 +1643,48 @@ impl PoolCoordinator {
16431643
16441644 let mut pconn = primary. get ( ) . map_err ( |_| StoreError :: DatabaseUnavailable ) ?;
16451645
1646- let pools : Vec < _ > = states
1646+ let states : Vec < _ > = states
16471647 . into_iter ( )
16481648 . filter ( |pool| pool. needs_setup ( ) )
16491649 . collect ( ) ;
1650+ if states. is_empty ( ) {
1651+ return Ok ( 0 ) ;
1652+ }
16501653
16511654 // Everything here happens under the migration lock. Anything called
16521655 // from here should not try to get that lock, otherwise the process
16531656 // will deadlock
16541657 debug ! ( self . logger, "Waiting for migration lock" ) ;
16551658 let res = with_migration_lock ( & mut pconn, |_| async {
16561659 debug ! ( self . logger, "Migration lock acquired" ) ;
1660+
1661+ // While we were waiting for the migration lock, another thread
1662+ // might have already run this
1663+ let states: Vec < _ > = states
1664+ . into_iter ( )
1665+ . filter ( |pool| pool. needs_setup ( ) )
1666+ . collect ( ) ;
1667+ if states. is_empty ( ) {
1668+ debug ! ( self . logger, "No pools to set up" ) ;
1669+ return Ok ( 0 ) ;
1670+ }
1671+
16571672 primary. drop_cross_shard_views ( ) ?;
16581673
1659- let migrated = migrate ( & pools , self . servers . as_ref ( ) ) . await ?;
1674+ let migrated = migrate ( & states , self . servers . as_ref ( ) ) . await ?;
16601675
16611676 let propagated = propagate ( & self , migrated) . await ?;
16621677
16631678 primary. create_cross_shard_views ( & self . servers ) ?;
1664- Ok ( propagated)
1665- } )
1666- . await ;
1667- debug ! ( self . logger, "Database setup finished" ) ;
16681679
1669- // Mark all pool states that we set up completely as ready
1670- res. map ( |states| {
1671- for state in & states {
1680+ for state in & propagated {
16721681 state. set_ready ( ) ;
16731682 }
1674- states . len ( )
1683+ Ok ( propagated . len ( ) )
16751684 } )
1685+ . await ;
1686+ debug ! ( self . logger, "Database setup finished" ) ;
1687+
1688+ res
16761689 }
16771690}
0 commit comments