Skip to content

Commit b2bcd1a

Browse files
refactor: use RwLock instead of Arc for hashmap
1 parent e947404 commit b2bcd1a

File tree

2 files changed

+12
-8
lines changed

2 files changed

+12
-8
lines changed

src/bors/context.rs

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,16 @@
1-
use arc_swap::ArcSwap;
2-
31
use crate::{bors::command::CommandParser, database::DbClient, github::GithubRepoName};
4-
use std::{collections::HashMap, sync::Arc};
2+
use std::{
3+
collections::HashMap,
4+
sync::{Arc, RwLock},
5+
};
56

67
use super::{RepositoryClient, RepositoryLoader, RepositoryState};
78

89
pub struct BorsContext<Client: RepositoryClient> {
910
pub parser: CommandParser,
1011
pub db: Arc<dyn DbClient>,
1112
pub repository_loader: Arc<dyn RepositoryLoader<Client>>,
12-
pub repositories: ArcSwap<HashMap<GithubRepoName, Arc<RepositoryState<Client>>>>,
13+
pub repositories: RwLock<HashMap<GithubRepoName, Arc<RepositoryState<Client>>>>,
1314
}
1415

1516
impl<Client: RepositoryClient> BorsContext<Client> {
@@ -21,7 +22,7 @@ impl<Client: RepositoryClient> BorsContext<Client> {
2122
// this unwrap is making me nervous, but if lhe repos loading
2223
// fails we might as well restart the bot
2324
let repositories = global_client.load_repositories().await?;
24-
let repositories = ArcSwap::new(Arc::new(repositories));
25+
let repositories = RwLock::new(repositories);
2526
Ok(Self {
2627
parser,
2728
db,

src/bors/handlers/mod.rs

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,8 @@ pub async fn handle_bors_repository_event<Client: RepositoryClient>(
3030
let db = Arc::clone(&ctx.db);
3131
let Some(repo) = ctx
3232
.repositories
33-
.load()
33+
.read()
34+
.unwrap()
3435
.get(event.repository())
3536
.map(Arc::clone)
3637
else {
@@ -125,7 +126,9 @@ pub async fn handle_bors_global_event<Client: RepositoryClient>(
125126

126127
match ctx.repository_loader.load_repositories().await {
127128
Ok(repos) => {
128-
ctx.repositories.store(Arc::new(repos));
129+
let mut repositories = ctx.repositories.write().unwrap();
130+
// TODO: keep old repos in case of repo loading failure
131+
*repositories = repos;
129132
}
130133
Err(error) => {
131134
span.log_error(error);
@@ -136,7 +139,7 @@ pub async fn handle_bors_global_event<Client: RepositoryClient>(
136139
BorsGlobalEvent::Refresh => {
137140
let span = tracing::info_span!("Refresh");
138141
let repos: Vec<Arc<RepositoryState<Client>>> =
139-
ctx.repositories.load().values().cloned().collect();
142+
ctx.repositories.read().unwrap().values().cloned().collect();
140143
futures::future::join_all(repos.into_iter().map(|repo| {
141144
let repo = Arc::clone(&repo);
142145
async {

0 commit comments

Comments
 (0)