From c0fe6d7a4304f9687ebc408ea78b83e3537b645a Mon Sep 17 00:00:00 2001 From: Ondrej Vlach Date: Mon, 11 Dec 2023 23:06:16 +0100 Subject: [PATCH] fix: add language to cache key --- src/routes/pdf.rs | 8 ++++---- src/tools/cache.rs | 4 ++-- src/tools/rocket.rs | 1 + 3 files changed, 7 insertions(+), 6 deletions(-) diff --git a/src/routes/pdf.rs b/src/routes/pdf.rs index d8f2e07..c27b0c2 100644 --- a/src/routes/pdf.rs +++ b/src/routes/pdf.rs @@ -62,26 +62,26 @@ fn render_template(template_name: &str, file: &NamedTempFile, tera: NanoTera, cv #[allow(clippy::too_many_arguments)] #[get("/cv///output.pdf?")] pub async fn render_pdf_cv(username: &str, tera: NanoTera, tracing: TracingSpan, request_client: OtelReqwestClient, - cv_config: &State, language: RequestLanguage, browser: BrowserHolder, cache: &State>, + cv_config: &State, language: RequestLanguage, browser: BrowserHolder, cache: &State>, force_rebuild: Option) -> Result { async move { match fetch_cv_data_from_backend(&cv_config.cv_backend_path, &username.to_string(), &request_client.0).await { Ok(cv_data) => { // TODO: CV hasher let data = json!(cv_data).to_string(); - match cache.get(&data, force_rebuild).await { + match cache.get(&(language.clone(), data.clone()), force_rebuild).await { Some(data) => { Ok(data.clone()) } None => { let file = tempfile::Builder::new().suffix(".html").tempfile().unwrap(); - render_template("two_column", &file, tera, cv_data, language.language); + render_template("two_column", &file, tera, cv_data, language.clone().language); let span = info_span!("render_pdf", username = username); let pdf = span.in_scope(||{ generate_pdf(browser.browser, &file) }); let result = PdfStream::new(pdf); - cache.insert(data, result.clone()).await; + cache.insert((language.clone(), data), result.clone()).await; Ok(result) } } diff --git a/src/tools/cache.rs b/src/tools/cache.rs index e9d1dd9..73a2a87 100644 --- a/src/tools/cache.rs +++ b/src/tools/cache.rs @@ -5,7 +5,7 @@ use once_cell::sync::Lazy; use rocket_prometheus::{prometheus::{IntCounterVec, opts, Error}, PrometheusMetrics}; use std::hash::Hash; -use super::pdf::PdfStream; +use super::{pdf::PdfStream, rocket::RequestLanguage}; static CACHE_EVICTION_COUNT: Lazy = Lazy::new(|| IntCounterVec::new(opts!(format!("{}_{}", std::env::var("ROCKET_PROMETHEUS_NAMESPACE").unwrap_or("app".to_string()), "cache_eviction"), "Count of cache eviction"), &["cause"]) @@ -25,7 +25,7 @@ pub fn cache_prometheus_metrics(metrics: &PrometheusMetrics) -> Result<(), Error Ok(()) } -pub fn build_cache() -> NanoCache { +pub fn build_cache() -> NanoCache<(RequestLanguage, String), PdfStream> { let cache = Cache::builder() .time_to_live(Duration::from_secs(60 * 60)) .eviction_listener(|_k, _v, cause| { diff --git a/src/tools/rocket.rs b/src/tools/rocket.rs index 400df72..4bfbae8 100644 --- a/src/tools/rocket.rs +++ b/src/tools/rocket.rs @@ -1,6 +1,7 @@ use phf::phf_map; use rocket::request::FromParam; +#[derive(Debug, Clone, PartialEq, Eq, Hash)] pub struct RequestLanguage { pub language: String, }