use ahash. allow no redis
This commit is contained in:
parent
6182b5f8e6
commit
3d4bfbfde0
32
Cargo.lock
generated
32
Cargo.lock
generated
@ -50,6 +50,18 @@ dependencies = [
|
|||||||
"version_check",
|
"version_check",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "ahash"
|
||||||
|
version = "0.8.0"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "57e6e951cfbb2db8de1828d49073a113a29fd7117b1596caa781a258c7e38d72"
|
||||||
|
dependencies = [
|
||||||
|
"cfg-if",
|
||||||
|
"getrandom",
|
||||||
|
"once_cell",
|
||||||
|
"version_check",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "aho-corasick"
|
name = "aho-corasick"
|
||||||
version = "0.7.18"
|
version = "0.7.18"
|
||||||
@ -1097,20 +1109,6 @@ dependencies = [
|
|||||||
"cfg-if",
|
"cfg-if",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "crossbeam"
|
|
||||||
version = "0.8.2"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
checksum = "2801af0d36612ae591caa9568261fddce32ce6e08a7275ea334a06a4ad021a2c"
|
|
||||||
dependencies = [
|
|
||||||
"cfg-if",
|
|
||||||
"crossbeam-channel",
|
|
||||||
"crossbeam-deque",
|
|
||||||
"crossbeam-epoch",
|
|
||||||
"crossbeam-queue",
|
|
||||||
"crossbeam-utils",
|
|
||||||
]
|
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "crossbeam-channel"
|
name = "crossbeam-channel"
|
||||||
version = "0.5.6"
|
version = "0.5.6"
|
||||||
@ -1274,8 +1272,8 @@ dependencies = [
|
|||||||
name = "deferred-rate-limiter"
|
name = "deferred-rate-limiter"
|
||||||
version = "0.2.0"
|
version = "0.2.0"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
|
"ahash 0.8.0",
|
||||||
"anyhow",
|
"anyhow",
|
||||||
"crossbeam",
|
|
||||||
"moka",
|
"moka",
|
||||||
"redis-rate-limiter",
|
"redis-rate-limiter",
|
||||||
"tokio",
|
"tokio",
|
||||||
@ -2239,7 +2237,7 @@ version = "0.12.3"
|
|||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888"
|
checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"ahash",
|
"ahash 0.7.6",
|
||||||
"serde",
|
"serde",
|
||||||
]
|
]
|
||||||
|
|
||||||
@ -4611,7 +4609,7 @@ version = "0.6.0"
|
|||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "6b69bf218860335ddda60d6ce85ee39f6cf6e5630e300e19757d1de15886a093"
|
checksum = "6b69bf218860335ddda60d6ce85ee39f6cf6e5630e300e19757d1de15886a093"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"ahash",
|
"ahash 0.7.6",
|
||||||
"atoi",
|
"atoi",
|
||||||
"bitflags",
|
"bitflags",
|
||||||
"byteorder",
|
"byteorder",
|
||||||
|
@ -7,8 +7,8 @@ edition = "2021"
|
|||||||
[dependencies]
|
[dependencies]
|
||||||
redis-rate-limiter = { path = "../redis-rate-limiter" }
|
redis-rate-limiter = { path = "../redis-rate-limiter" }
|
||||||
|
|
||||||
|
ahash = "0.8.0"
|
||||||
anyhow = "1.0.65"
|
anyhow = "1.0.65"
|
||||||
crossbeam = "*"
|
|
||||||
moka = { version = "0.9.4", default-features = false, features = ["future"] }
|
moka = { version = "0.9.4", default-features = false, features = ["future"] }
|
||||||
tokio = "1.21.1"
|
tokio = "1.21.1"
|
||||||
tracing = "0.1.36"
|
tracing = "0.1.36"
|
||||||
|
@ -7,7 +7,7 @@ use std::hash::Hash;
|
|||||||
use std::sync::atomic::{AtomicBool, Ordering};
|
use std::sync::atomic::{AtomicBool, Ordering};
|
||||||
use std::sync::{atomic::AtomicU64, Arc};
|
use std::sync::{atomic::AtomicU64, Arc};
|
||||||
use tokio::sync::Mutex;
|
use tokio::sync::Mutex;
|
||||||
use tokio::time::Instant;
|
use tokio::time::{Duration, Instant};
|
||||||
use tracing::error;
|
use tracing::error;
|
||||||
|
|
||||||
/// A local cache that sits in front of a RedisRateLimiter
|
/// A local cache that sits in front of a RedisRateLimiter
|
||||||
@ -16,7 +16,7 @@ pub struct DeferredRateLimiter<K>
|
|||||||
where
|
where
|
||||||
K: Send + Sync,
|
K: Send + Sync,
|
||||||
{
|
{
|
||||||
local_cache: Cache<K, Arc<AtomicU64>>,
|
local_cache: Cache<K, Arc<AtomicU64>, ahash::RandomState>,
|
||||||
prefix: String,
|
prefix: String,
|
||||||
rrl: RedisRateLimiter,
|
rrl: RedisRateLimiter,
|
||||||
}
|
}
|
||||||
@ -32,8 +32,19 @@ where
|
|||||||
K: Copy + Debug + Display + Hash + Eq + Send + Sync + 'static,
|
K: Copy + Debug + Display + Hash + Eq + Send + Sync + 'static,
|
||||||
{
|
{
|
||||||
pub fn new(cache_size: u64, prefix: &str, rrl: RedisRateLimiter) -> Self {
|
pub fn new(cache_size: u64, prefix: &str, rrl: RedisRateLimiter) -> Self {
|
||||||
|
let ttl = rrl.period as u64;
|
||||||
|
|
||||||
|
let hasher = ahash::RandomState::new();
|
||||||
|
|
||||||
|
// TODO: think more about this ttl. if
|
||||||
|
let local_cache = Cache::builder()
|
||||||
|
.time_to_live(Duration::from_secs(ttl))
|
||||||
|
.max_capacity(cache_size)
|
||||||
|
.name(prefix)
|
||||||
|
.build_with_hasher(hasher);
|
||||||
|
|
||||||
Self {
|
Self {
|
||||||
local_cache: Cache::new(cache_size),
|
local_cache,
|
||||||
prefix: prefix.to_string(),
|
prefix: prefix.to_string(),
|
||||||
rrl,
|
rrl,
|
||||||
}
|
}
|
||||||
|
@ -40,7 +40,7 @@ use tokio::sync::{broadcast, watch};
|
|||||||
use tokio::task::JoinHandle;
|
use tokio::task::JoinHandle;
|
||||||
use tokio::time::{timeout, Instant};
|
use tokio::time::{timeout, Instant};
|
||||||
use tokio_stream::wrappers::{BroadcastStream, WatchStream};
|
use tokio_stream::wrappers::{BroadcastStream, WatchStream};
|
||||||
use tracing::{info, info_span, instrument, trace, warn, Instrument};
|
use tracing::{error, info, info_span, instrument, trace, warn, Instrument};
|
||||||
use uuid::Uuid;
|
use uuid::Uuid;
|
||||||
|
|
||||||
// TODO: make this customizable?
|
// TODO: make this customizable?
|
||||||
@ -231,7 +231,9 @@ impl Web3ProxyApp {
|
|||||||
.build()?;
|
.build()?;
|
||||||
|
|
||||||
// test the pool
|
// test the pool
|
||||||
redis_pool.get().await.context("Redis connection failed")?;
|
if let Err(err) = redis_pool.get().await {
|
||||||
|
error!("failed to connect to redis. some features will be disabled");
|
||||||
|
};
|
||||||
|
|
||||||
Some(redis_pool)
|
Some(redis_pool)
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user