0
0
mirror of https://github.com/neon-mmd/websurfx.git synced 2024-11-25 15:38:21 -05:00

Rename features, make the memory-cache the default

This commit is contained in:
Zsombor Gegesy 2023-09-13 23:19:44 +02:00
parent 76795c43cc
commit 1e7805cf42
4 changed files with 23 additions and 19 deletions

View File

@ -67,7 +67,8 @@ rpath = false
strip = "debuginfo" strip = "debuginfo"
[features] [features]
default = ["in_memory_cache", "redis"] default = ["memory-cache"]
dhat-heap = ["dep:dhat"] dhat-heap = ["dep:dhat"]
in_memory_cache = ["dep:mini-moka"] memory-cache = ["dep:mini-moka"]
redis = ["dep:redis"] redis-cache = ["dep:redis"]
hybrid-cache = ["memory-cache", "redis-cache"]

25
src/cache/cacher.rs vendored
View File

@ -2,15 +2,16 @@
//! from the upstream search engines in a json format. //! from the upstream search engines in a json format.
use error_stack::Report; use error_stack::Report;
#[cfg(feature = "in_memory_cache")] #[cfg(feature = "memory-cache")]
use mini_moka::sync::Cache as MokaCache; use mini_moka::sync::Cache as MokaCache;
#[cfg(feature = "memory-cache")]
use std::time::Duration; use std::time::Duration;
use tokio::sync::Mutex; use tokio::sync::Mutex;
use crate::{config::parser::Config, results::aggregation_models::SearchResults}; use crate::{config::parser::Config, results::aggregation_models::SearchResults};
use super::error::PoolError; use super::error::PoolError;
#[cfg(feature = "redis")] #[cfg(feature = "redis-cache")]
use super::redis_cacher::RedisCache; use super::redis_cacher::RedisCache;
/// Different implementations for caching, currently it is possible to cache in-memory or in Redis. /// Different implementations for caching, currently it is possible to cache in-memory or in Redis.
@ -18,10 +19,10 @@ use super::redis_cacher::RedisCache;
pub enum Cache { pub enum Cache {
/// Caching is disabled /// Caching is disabled
Disabled, Disabled,
#[cfg(feature = "redis")] #[cfg(feature = "redis-cache")]
/// Encapsulates the Redis based cache /// Encapsulates the Redis based cache
Redis(RedisCache), Redis(RedisCache),
#[cfg(feature = "in_memory_cache")] #[cfg(feature = "memory-cache")]
/// Contains the in-memory cache. /// Contains the in-memory cache.
InMemory(MokaCache<String, SearchResults>), InMemory(MokaCache<String, SearchResults>),
} }
@ -29,7 +30,7 @@ pub enum Cache {
impl Cache { impl Cache {
/// Builds the cache from the given configuration. /// Builds the cache from the given configuration.
pub async fn build(config: &Config) -> Self { pub async fn build(config: &Config) -> Self {
#[cfg(feature = "redis")] #[cfg(feature = "redis-cache")]
if let Some(url) = &config.redis_url { if let Some(url) = &config.redis_url {
log::info!("Using Redis running at {} for caching", &url); log::info!("Using Redis running at {} for caching", &url);
return Cache::new( return Cache::new(
@ -38,7 +39,7 @@ impl Cache {
.expect("Redis cache configured"), .expect("Redis cache configured"),
); );
} }
#[cfg(feature = "in_memory_cache")] #[cfg(feature = "memory-cache")]
if config.in_memory_cache { if config.in_memory_cache {
log::info!("Using an in-memory cache"); log::info!("Using an in-memory cache");
return Cache::new_in_memory(); return Cache::new_in_memory();
@ -48,13 +49,13 @@ impl Cache {
} }
/// Creates a new cache, which wraps the given RedisCache. /// Creates a new cache, which wraps the given RedisCache.
#[cfg(feature = "redis")] #[cfg(feature = "redis-cache")]
pub fn new(redis_cache: RedisCache) -> Self { pub fn new(redis_cache: RedisCache) -> Self {
Cache::Redis(redis_cache) Cache::Redis(redis_cache)
} }
/// Creates an in-memory cache /// Creates an in-memory cache
#[cfg(feature = "in_memory_cache")] #[cfg(feature = "memory-cache")]
pub fn new_in_memory() -> Self { pub fn new_in_memory() -> Self {
let cache = MokaCache::builder() let cache = MokaCache::builder()
.max_capacity(1000) .max_capacity(1000)
@ -71,13 +72,13 @@ impl Cache {
pub async fn cached_json(&mut self, url: &str) -> Result<SearchResults, Report<PoolError>> { pub async fn cached_json(&mut self, url: &str) -> Result<SearchResults, Report<PoolError>> {
match self { match self {
Cache::Disabled => Err(Report::new(PoolError::MissingValue)), Cache::Disabled => Err(Report::new(PoolError::MissingValue)),
#[cfg(feature = "redis")] #[cfg(feature = "redis-cache")]
Cache::Redis(redis_cache) => { Cache::Redis(redis_cache) => {
let json = redis_cache.cached_json(url).await?; let json = redis_cache.cached_json(url).await?;
Ok(serde_json::from_str::<SearchResults>(&json) Ok(serde_json::from_str::<SearchResults>(&json)
.map_err(|_| PoolError::SerializationError)?) .map_err(|_| PoolError::SerializationError)?)
} }
#[cfg(feature = "in_memory_cache")] #[cfg(feature = "memory-cache")]
Cache::InMemory(in_memory) => match in_memory.get(&url.to_string()) { Cache::InMemory(in_memory) => match in_memory.get(&url.to_string()) {
Some(res) => Ok(res), Some(res) => Ok(res),
None => Err(Report::new(PoolError::MissingValue)), None => Err(Report::new(PoolError::MissingValue)),
@ -99,13 +100,13 @@ impl Cache {
) -> Result<(), Report<PoolError>> { ) -> Result<(), Report<PoolError>> {
match self { match self {
Cache::Disabled => Ok(()), Cache::Disabled => Ok(()),
#[cfg(feature = "redis")] #[cfg(feature = "redis-cache")]
Cache::Redis(redis_cache) => { Cache::Redis(redis_cache) => {
let json = serde_json::to_string(search_results) let json = serde_json::to_string(search_results)
.map_err(|_| PoolError::SerializationError)?; .map_err(|_| PoolError::SerializationError)?;
redis_cache.cache_results(&json, url).await redis_cache.cache_results(&json, url).await
} }
#[cfg(feature = "in_memory_cache")] #[cfg(feature = "memory-cache")]
Cache::InMemory(cache) => { Cache::InMemory(cache) => {
cache.insert(url.to_string(), search_results.clone()); cache.insert(url.to_string(), search_results.clone());
Ok(()) Ok(())

8
src/cache/error.rs vendored
View File

@ -2,26 +2,28 @@
//! the redis server using an async connection pool. //! the redis server using an async connection pool.
use std::fmt; use std::fmt;
#[cfg(feature = "redis")] #[cfg(feature = "redis-cache")]
use redis::RedisError; use redis::RedisError;
/// A custom error type used for handling redis async pool associated errors. /// A custom error type used for handling redis async pool associated errors.
#[derive(Debug)] #[derive(Debug)]
pub enum PoolError { pub enum PoolError {
/// This variant handles all errors related to `RedisError`, /// This variant handles all errors related to `RedisError`,
#[cfg(feature = "redis")] #[cfg(feature = "redis-cache")]
RedisError(RedisError), RedisError(RedisError),
/// This variant handles the errors which occurs when all the connections /// This variant handles the errors which occurs when all the connections
/// in the connection pool return a connection dropped redis error. /// in the connection pool return a connection dropped redis error.
PoolExhaustionWithConnectionDropError, PoolExhaustionWithConnectionDropError,
/// Whenever serialization or deserialization fails during communication with the cache.
SerializationError, SerializationError,
/// Returned when the value is missing.
MissingValue, MissingValue,
} }
impl fmt::Display for PoolError { impl fmt::Display for PoolError {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
match self { match self {
#[cfg(feature = "redis")] #[cfg(feature = "redis-cache")]
PoolError::RedisError(redis_error) => { PoolError::RedisError(redis_error) => {
if let Some(detail) = redis_error.detail() { if let Some(detail) = redis_error.detail() {
write!(f, "{}", detail) write!(f, "{}", detail)

2
src/cache/mod.rs vendored
View File

@ -3,5 +3,5 @@
pub mod cacher; pub mod cacher;
pub mod error; pub mod error;
#[cfg(feature = "redis")] #[cfg(feature = "redis-cache")]
pub mod redis_cacher; pub mod redis_cacher;