From ed349cd6044ba7c3263083d25bd027303a4f42c6 Mon Sep 17 00:00:00 2001 From: Hocuri Date: Wed, 16 Mar 2022 11:52:11 +0100 Subject: [PATCH] Introduce config caching --- src/sql.rs | 38 +++++++++++++++++++++++++++++--------- src/sql/migrations.rs | 4 ++++ 2 files changed, 33 insertions(+), 9 deletions(-) diff --git a/src/sql.rs b/src/sql.rs index 99ae09134..fd608ab06 100644 --- a/src/sql.rs +++ b/src/sql.rs @@ -3,7 +3,7 @@ use async_std::path::Path; use async_std::sync::RwLock; -use std::collections::HashSet; +use std::collections::{HashMap, HashSet}; use std::convert::TryFrom; use std::time::Duration; @@ -39,12 +39,14 @@ mod migrations; #[derive(Debug)] pub struct Sql { pool: RwLock>>, + config_cache: RwLock>, // TODO should be > in order to save that an option is None? } impl Default for Sql { fn default() -> Self { Self { pool: RwLock::new(None), + config_cache: RwLock::new(HashMap::new()), } } } @@ -387,6 +389,8 @@ impl Sql { /// will already have been logged. pub async fn set_raw_config(&self, key: impl AsRef, value: Option<&str>) -> Result<()> { let key = key.as_ref(); + + // TODO could be on another thread if let Some(value) = value { let exists = self .exists( @@ -413,20 +417,36 @@ impl Sql { .await?; } + let mut lock = self.config_cache.write().await; + if let Some(v) = value { + lock.insert(key.to_string(), v.to_string()); + } else { + lock.remove(key); + } + drop(lock); + Ok(()) } /// Get configuration options from the database. pub async fn get_raw_config(&self, key: impl AsRef) -> Result> { - let value = self - .query_get_value( - "SELECT value FROM config WHERE keyname=?;", - paramsv![key.as_ref()], - ) - .await - .context(format!("failed to fetch raw config: {}", key.as_ref()))?; + let lock = self.config_cache.read().await; + let cached = lock.get(key.as_ref()).cloned(); + drop(lock); - Ok(value) + if let Some(c) = cached { + Ok(Some(c)) + } else { + let value = self + .query_get_value( + "SELECT value FROM config WHERE keyname=?;", + paramsv![key.as_ref()], + ) + .await + .context(format!("failed to fetch raw config: {}", key.as_ref()))?; + + Ok(value) + } } pub async fn set_raw_config_int(&self, key: impl AsRef, value: i32) -> Result<()> { diff --git a/src/sql/migrations.rs b/src/sql/migrations.rs index b74330577..d9bfaa941 100644 --- a/src/sql/migrations.rs +++ b/src/sql/migrations.rs @@ -526,6 +526,10 @@ impl Sql { }) .await?; + let mut lock = self.config_cache.write().await; + lock.insert(VERSION_CFG.to_string(), format!("{}", version)); + drop(lock); + Ok(()) } }