From bfb687ef5bae290b9122e0906effecadda939871 Mon Sep 17 00:00:00 2001 From: Mingwei Samuel Date: Thu, 11 Jul 2024 16:59:11 -0700 Subject: [PATCH] refactor: use `memo-map` instead of improvised `CHashMap` --- riven/Cargo.toml | 1 + riven/src/req/regional_requester.rs | 15 +++++++------- riven/src/riot_api.rs | 11 +++++----- riven/src/util/insert_only_chashmap.rs | 28 -------------------------- riven/src/util/mod.rs | 3 --- 5 files changed, 13 insertions(+), 45 deletions(-) delete mode 100644 riven/src/util/insert_only_chashmap.rs diff --git a/riven/Cargo.toml b/riven/Cargo.toml index 06054ec..2ed691a 100644 --- a/riven/Cargo.toml +++ b/riven/Cargo.toml @@ -45,6 +45,7 @@ required-features = [ "__proxy" ] [dependencies] futures = "0.3" log = "0.4" +memo-map = "0.3" num_enum = "0.5" parking_lot = "0.12" reqwest = { version = "0.11", default-features = false, features = [ "gzip", "json" ] } diff --git a/riven/src/req/regional_requester.rs b/riven/src/req/regional_requester.rs index 21ea943..bc2319a 100644 --- a/riven/src/req/regional_requester.rs +++ b/riven/src/req/regional_requester.rs @@ -1,20 +1,19 @@ use std::future::Future; -use std::sync::Arc; +use memo_map::MemoMap; use reqwest::{RequestBuilder, StatusCode}; #[cfg(feature = "tracing")] use tracing::{self as log, Instrument}; use super::{RateLimit, RateLimitType}; use crate::time::{sleep, Duration}; -use crate::util::InsertOnlyCHashMap; use crate::{ResponseInfo, Result, RiotApiConfig, RiotApiError}; pub struct RegionalRequester { /// The app rate limit. app_rate_limit: RateLimit, /// Method rate limits. - method_rate_limits: InsertOnlyCHashMap<&'static str, RateLimit>, + method_rate_limits: MemoMap<&'static str, RateLimit>, } impl RegionalRequester { @@ -27,12 +26,12 @@ impl RegionalRequester { pub fn new() -> Self { Self { app_rate_limit: RateLimit::new(RateLimitType::Application), - method_rate_limits: InsertOnlyCHashMap::new(), + method_rate_limits: MemoMap::new(), } } pub fn execute<'a>( - self: Arc, + &'a self, config: &'a RiotApiConfig, method_id: &'static str, request: RequestBuilder, @@ -40,12 +39,12 @@ impl RegionalRequester { async move { let mut retries: u8 = 0; loop { - let method_rate_limit: Arc = self + let method_rate_limit = self .method_rate_limits - .get_or_insert_with(method_id, || RateLimit::new(RateLimitType::Method)); + .get_or_insert(&method_id, || RateLimit::new(RateLimitType::Method)); // Rate limit. - let rate_limit = RateLimit::acquire_both(&self.app_rate_limit, &method_rate_limit); + let rate_limit = RateLimit::acquire_both(&self.app_rate_limit, method_rate_limit); #[cfg(feature = "tracing")] let rate_limit = rate_limit.instrument(tracing::info_span!("rate_limit")); rate_limit.await; diff --git a/riven/src/riot_api.rs b/riven/src/riot_api.rs index 8eca341..e091366 100644 --- a/riven/src/riot_api.rs +++ b/riven/src/riot_api.rs @@ -1,12 +1,11 @@ use std::future::Future; -use std::sync::Arc; +use memo_map::MemoMap; use reqwest::{Client, Method, RequestBuilder}; #[cfg(feature = "tracing")] use tracing as log; use crate::req::RegionalRequester; -use crate::util::InsertOnlyCHashMap; use crate::{ResponseInfo, Result, RiotApiConfig, RiotApiError}; /// For retrieving data from the Riot Games API. @@ -46,7 +45,7 @@ pub struct RiotApi { client: Client, /// Per-region requesters. - regional_requesters: InsertOnlyCHashMap<&'static str, RegionalRequester>, + regional_requesters: MemoMap<&'static str, RegionalRequester>, } impl RiotApi { @@ -62,7 +61,7 @@ impl RiotApi { client: client_builder .build() .expect("Failed to create client from builder."), - regional_requesters: InsertOnlyCHashMap::new(), + regional_requesters: MemoMap::new(), } } @@ -193,9 +192,9 @@ impl RiotApi { } /// Get or create the RegionalRequester for the given region. - fn regional_requester(&self, region_platform: &'static str) -> Arc { + fn regional_requester(&self, region_platform: &'static str) -> &RegionalRequester { self.regional_requesters - .get_or_insert_with(region_platform, || { + .get_or_insert(®ion_platform, || { log::debug!( "Creating requester for region platform {}.", region_platform diff --git a/riven/src/util/insert_only_chashmap.rs b/riven/src/util/insert_only_chashmap.rs deleted file mode 100644 index 39617d2..0000000 --- a/riven/src/util/insert_only_chashmap.rs +++ /dev/null @@ -1,28 +0,0 @@ -use std::collections::HashMap; -use std::hash::Hash; -use std::sync::Arc; - -use parking_lot::Mutex; - -pub struct InsertOnlyCHashMap { - base: Mutex>>, -} - -impl InsertOnlyCHashMap { - #[inline] - pub fn new() -> Self { - Self { - base: Mutex::new(HashMap::new()), - } - } - - #[inline] - pub fn get_or_insert_with V>(&self, key: K, default: F) -> Arc { - Arc::clone( - self.base - .lock() - .entry(key) - .or_insert_with(|| Arc::new(default())), - ) - } -} diff --git a/riven/src/util/mod.rs b/riven/src/util/mod.rs index 3e9af15..6fc0638 100644 --- a/riven/src/util/mod.rs +++ b/riven/src/util/mod.rs @@ -1,5 +1,2 @@ -mod insert_only_chashmap; -pub use insert_only_chashmap::InsertOnlyCHashMap; - mod notify; pub use notify::Notify;