From 50164abf85b801bc17f7a220e347891f2d6ea96f Mon Sep 17 00:00:00 2001 From: Danial Mehrjerdi Date: Fri, 21 Feb 2025 14:15:43 +0100 Subject: [PATCH] Replace in memory auction vector with HashMap --- .../src/auction/repository/add_auction.rs | 15 ++++++++++----- .../repository/get_in_memory_auction_by_id.rs | 8 +++++--- .../auction/repository/get_in_memory_auctions.rs | 8 +++++++- auction-server/src/auction/repository/mod.rs | 4 ++-- .../repository/remove_in_memory_auction.rs | 7 +++++-- .../src/auction/repository/update_bid_status.rs | 2 +- .../repository/update_in_memory_auction.rs | 2 +- 7 files changed, 31 insertions(+), 15 deletions(-) diff --git a/auction-server/src/auction/repository/add_auction.rs b/auction-server/src/auction/repository/add_auction.rs index d190ef22..088c0754 100644 --- a/auction-server/src/auction/repository/add_auction.rs +++ b/auction-server/src/auction/repository/add_auction.rs @@ -15,6 +15,15 @@ use { }; impl Repository { + #[tracing::instrument(skip_all)] + async fn add_in_memory_auction(&self, auction: entities::Auction) { + self.in_memory_store + .auctions + .write() + .await + .insert(auction.id, auction); + } + #[tracing::instrument(skip_all, name = "add_auction_repo", fields(auction_id))] pub async fn add_auction( &self, @@ -37,11 +46,7 @@ impl Repository { self.remove_in_memory_pending_bids(auction.bids.as_slice()) .await; - self.in_memory_store - .auctions - .write() - .await - .push(auction.clone()); + self.add_in_memory_auction(auction.clone()).await; Ok(auction) } } diff --git a/auction-server/src/auction/repository/get_in_memory_auction_by_id.rs b/auction-server/src/auction/repository/get_in_memory_auction_by_id.rs index 5ff6085a..cbd87807 100644 --- a/auction-server/src/auction/repository/get_in_memory_auction_by_id.rs +++ b/auction-server/src/auction/repository/get_in_memory_auction_by_id.rs @@ -11,9 +11,11 @@ impl Repository { &self, auction_id: entities::AuctionId, ) -> Option> { - self.get_in_memory_auctions() + self.in_memory_store + .auctions + .read() .await - .into_iter() - .find(|auction| auction.id == auction_id) + .get(&auction_id) + .cloned() } } diff --git a/auction-server/src/auction/repository/get_in_memory_auctions.rs b/auction-server/src/auction/repository/get_in_memory_auctions.rs index 4899fa43..029a273f 100644 --- a/auction-server/src/auction/repository/get_in_memory_auctions.rs +++ b/auction-server/src/auction/repository/get_in_memory_auctions.rs @@ -8,6 +8,12 @@ use { impl Repository { pub async fn get_in_memory_auctions(&self) -> Vec> { - self.in_memory_store.auctions.read().await.clone() + self.in_memory_store + .auctions + .read() + .await + .values() + .cloned() + .collect() } } diff --git a/auction-server/src/auction/repository/mod.rs b/auction-server/src/auction/repository/mod.rs index 91b35cd3..33c6b326 100644 --- a/auction-server/src/auction/repository/mod.rs +++ b/auction-server/src/auction/repository/mod.rs @@ -67,7 +67,7 @@ pub struct ChainStoreEvm {} #[derive(Debug)] pub struct InMemoryStore { pub pending_bids: RwLock, Vec>>>, - pub auctions: RwLock>>, + pub auctions: RwLock>>, pub auction_lock: Mutex, entities::AuctionLock>>, pub bid_lock: Mutex>, @@ -79,7 +79,7 @@ impl Default for InMemoryStore { fn default() -> Self { Self { pending_bids: RwLock::new(HashMap::new()), - auctions: RwLock::new(Vec::new()), + auctions: RwLock::new(HashMap::new()), auction_lock: Mutex::new(HashMap::new()), bid_lock: Mutex::new(HashMap::new()), chain_store: T::ChainStore::default(), diff --git a/auction-server/src/auction/repository/remove_in_memory_auction.rs b/auction-server/src/auction/repository/remove_in_memory_auction.rs index eb7aa816..3721bdd2 100644 --- a/auction-server/src/auction/repository/remove_in_memory_auction.rs +++ b/auction-server/src/auction/repository/remove_in_memory_auction.rs @@ -10,7 +10,10 @@ impl Repository { #[tracing::instrument(skip_all, fields(auction_id))] pub async fn remove_in_memory_auction(&self, auction_id: entities::AuctionId) { tracing::Span::current().record("auction_id", auction_id.to_string()); - let mut write_guard = self.in_memory_store.auctions.write().await; - write_guard.retain(|a| a.id != auction_id); + self.in_memory_store + .auctions + .write() + .await + .remove(&auction_id); } } diff --git a/auction-server/src/auction/repository/update_bid_status.rs b/auction-server/src/auction/repository/update_bid_status.rs index fa8c258e..b5ba0d41 100644 --- a/auction-server/src/auction/repository/update_bid_status.rs +++ b/auction-server/src/auction/repository/update_bid_status.rs @@ -22,7 +22,7 @@ impl Repository { ) { if let Some(auction_id) = new_status.get_auction_id() { let mut write_guard = self.in_memory_store.auctions.write().await; - if let Some(auction) = write_guard.iter_mut().find(|a| a.id == auction_id) { + if let Some(auction) = write_guard.get_mut(&auction_id) { let bid_index = auction.bids.iter().position(|b| b.id == bid.id); if let Some(index) = bid_index { auction.bids[index].status = new_status; diff --git a/auction-server/src/auction/repository/update_in_memory_auction.rs b/auction-server/src/auction/repository/update_in_memory_auction.rs index c7125612..a98455fa 100644 --- a/auction-server/src/auction/repository/update_in_memory_auction.rs +++ b/auction-server/src/auction/repository/update_in_memory_auction.rs @@ -11,7 +11,7 @@ impl Repository { pub async fn update_in_memory_auction(&self, auction: entities::Auction) { tracing::Span::current().record("auction_id", auction.id.to_string()); let mut write_gaurd = self.in_memory_store.auctions.write().await; - match write_gaurd.iter_mut().find(|a| a.id == auction.id) { + match write_gaurd.get_mut(&auction.id) { Some(a) => { *a = auction; }