Skip to content

Commit c23ee96

Browse files
committed
store: Avoid running setup unnecessarily if several threads try to run it
1 parent eb6fae7 commit c23ee96

File tree

1 file changed

+23
-10
lines changed

1 file changed

+23
-10
lines changed

store/postgres/src/connection_pool.rs

Lines changed: 23 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)