Skip to content

Commit 02657c6

Browse files
authored
Merge pull request #157 from caibirdme/feat-cache-arc
feat: use Arc<T> to store data in cache
2 parents 0c1267d + ac20513 commit 02657c6

File tree

4 files changed

+20
-12
lines changed

4 files changed

+20
-12
lines changed

src/logquery/labels.rs

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
use std::sync::Arc;
2+
13
use super::*;
24
use crate::{errors::AppError, state::AppState};
35
use axum::{
@@ -31,7 +33,7 @@ pub async fn query_labels(
3133
};
3234
if should_cache {
3335
let d = serde_json::to_vec(&resp).unwrap();
34-
cache.insert(label_cache_key().to_string(), d);
36+
cache.insert(label_cache_key().to_string(), Arc::new(d));
3537
}
3638
Ok(resp)
3739
}
@@ -96,7 +98,7 @@ pub async fn query_label_values(
9698
};
9799
if should_cache {
98100
let d = serde_json::to_vec(&resp).unwrap();
99-
cache.insert(cache_key, d);
101+
cache.insert(cache_key, Arc::new(d));
100102
}
101103
Ok(resp)
102104
}
@@ -140,7 +142,7 @@ pub async fn query_series(
140142
.await?;
141143
if !values.is_empty() {
142144
let d = serde_json::to_vec(&values).unwrap();
143-
state.cache.insert(series_cache_key(), d);
145+
state.cache.insert(series_cache_key(), Arc::new(d));
144146
}
145147
Ok(Json(QuerySeriesResponse {
146148
status: ResponseStatus::Success,

src/logquery/query_range.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ use axum_valid::Valid;
99
use itertools::Itertools;
1010
use logql::parser;
1111
use moka::sync::Cache;
12-
use std::collections::HashMap;
12+
use std::{collections::HashMap, sync::Arc};
1313

1414
pub async fn query_range(
1515
State(state): State<AppState>,
@@ -31,7 +31,7 @@ pub async fn query_range(
3131
};
3232
if let Ok(inner) = &resp {
3333
let d = serde_json::to_vec(inner).unwrap();
34-
state.cache.insert(cache_key, d);
34+
state.cache.insert(cache_key, Arc::new(d));
3535
}
3636
resp
3737
}
@@ -52,7 +52,7 @@ pub async fn loki_is_working() -> Result<QueryRangeResponse, AppError> {
5252

5353
fn get_cached_query(
5454
key: &str,
55-
cache: Cache<String, Vec<u8>>,
55+
cache: Cache<String, Arc<Vec<u8>>>,
5656
) -> Option<QueryRangeResponse> {
5757
if let Some(v) = cache.get(key) {
5858
if let Ok(d) = serde_json::from_slice(&v) {

src/state.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,6 @@ pub struct AppState {
1010
pub config: Arc<config::AppConfig>,
1111
pub log_handle: Box<dyn LogStorage>,
1212
pub trace_handle: Box<dyn TraceStorage>,
13-
pub cache: Cache<String, Vec<u8>>,
13+
pub cache: Cache<String, Arc<Vec<u8>>>,
1414
pub metrics: Arc<metrics::Instrumentations>,
1515
}

src/trace/traceid.rs

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
use std::sync::Arc;
2+
13
use super::*;
24
use crate::{
35
errors::AppError, proto::tempopb::Trace, state::AppState,
@@ -97,21 +99,25 @@ pub async fn get_trace_by_id(
9799
Ok(val)
98100
}
99101

100-
fn cache_trace(trace_id: &str, trace: &Trace, cache: Cache<String, Vec<u8>>) {
102+
fn cache_trace(
103+
trace_id: &str,
104+
trace: &Trace,
105+
cache: Cache<String, Arc<Vec<u8>>>,
106+
) {
101107
let d = trace.encode_to_vec();
102108
let key = get_trace_cache_key(trace_id);
103-
cache.insert(key.clone(), d.clone());
109+
cache.insert(key.clone(), Arc::new(d.clone()));
104110
}
105111

106112
fn get_cached_trace(
107113
trace_id: &str,
108-
cache: Cache<String, Vec<u8>>,
114+
cache: Cache<String, Arc<Vec<u8>>>,
109115
) -> Result<Option<Trace>, AppError> {
110116
let data = cache.get(get_trace_cache_key(trace_id).as_str());
111117
match data {
112118
Some(data) => {
113-
let trace =
114-
Message::decode(Bytes::from(data)).map_err(|e| anyhow!(e))?;
119+
let s: &[u8] = data.as_ref();
120+
let trace = Message::decode(s).map_err(|e| anyhow!(e))?;
115121
Ok(Some(trace))
116122
}
117123
None => Ok(None),

0 commit comments

Comments
 (0)