@@ -9,6 +9,7 @@ use redis::{
99 cmd,
1010} ;
1111use tokio:: sync:: Mutex ;
12+ use tracing:: { debug, warn} ;
1213
1314use super :: { ConfigStoreError , UserConfigStore } ;
1415use crate :: {
@@ -30,7 +31,10 @@ impl RedisUserConfigStore {
3031 ConnectionManagerConfig :: default ( ) . set_number_of_retries ( REDIS_RETRIES ) ,
3132 )
3233 . await
33- . map_err ( |_| ConfigStoreError :: InvalidConnection ) ?,
34+ . map_err ( |error| {
35+ warn ! ( error = %error, "failed to create Redis user config connection" ) ;
36+ ConfigStoreError :: InvalidConnection
37+ } ) ?,
3438 cache : Arc :: new ( Mutex :: new ( LruCache :: with_expiry_duration_and_capacity (
3539 LRU_CACHE_EXPIRY_DURATION ,
3640 LRU_CACHE_ENTRIES ,
@@ -42,51 +46,90 @@ impl RedisUserConfigStore {
4246#[ async_trait]
4347impl UserConfigStore for RedisUserConfigStore {
4448 async fn get_config < ' a > ( & self , user_key : & ' a User ) -> Result < UserConfig , ConfigStoreError > {
45- let has_key = { self . cache . lock ( ) . await . contains_key ( user_key. key ( ) ) } ;
46- if has_key {
47- if let Some ( user_config) = self . cache . lock ( ) . await . get_mut ( user_key. key ( ) ) {
48- Ok ( user_config. clone ( ) )
49- } else {
50- return Err ( ConfigStoreError :: NoDataForKey ) ;
49+ let subject = user_key. key ( ) ;
50+
51+ {
52+ let mut cache = self . cache . lock ( ) . await ;
53+ if let Some ( user_config) = cache. get_mut ( subject) {
54+ debug ! (
55+ subject_ref = "redacted" ,
56+ virtual_hosts = user_config. virtual_hosts. len( ) ,
57+ "user config cache hit"
58+ ) ;
59+ return Ok ( user_config. clone ( ) ) ;
5160 }
52- } else {
53- let Ok ( key) = rmp_serde:: encode:: to_vec :: < User > ( user_key) else {
54- return Err ( ConfigStoreError :: DataEncoding ) ;
55- } ;
61+ }
62+
63+ debug ! ( subject_ref = "redacted" , "user config cache miss" ) ;
5664
57- let mut connection = self . connection . clone ( ) ;
58- let maybe_user_config: Result < Option < Vec < u8 > > , RedisError > =
59- cmd ( "GET" ) . arg ( key) . take ( ) . query_async ( & mut connection) . await ;
65+ let Ok ( key) = rmp_serde:: encode:: to_vec :: < User > ( user_key) else {
66+ warn ! ( subject_ref = "redacted" , "failed to encode Redis user config key" ) ;
67+ return Err ( ConfigStoreError :: DataEncoding ) ;
68+ } ;
6069
61- let Ok ( Some ( user_config) ) = maybe_user_config else {
70+ let mut connection = self . connection . clone ( ) ;
71+ let maybe_user_config: Result < Option < Vec < u8 > > , RedisError > =
72+ cmd ( "GET" ) . arg ( key) . take ( ) . query_async ( & mut connection) . await ;
73+
74+ let user_config = match maybe_user_config {
75+ Ok ( Some ( user_config) ) => {
76+ debug ! ( subject_ref = "redacted" , bytes = user_config. len( ) , "loaded user config blob from Redis" ) ;
77+ user_config
78+ } ,
79+ Ok ( None ) => {
80+ warn ! ( subject_ref = "redacted" , "no user config found in Redis" ) ;
81+ return Err ( ConfigStoreError :: NoDataForKey ) ;
82+ } ,
83+ Err ( error) => {
84+ warn ! ( subject_ref = "redacted" , error = %error, "failed to load user config from Redis" ) ;
6285 return Err ( ConfigStoreError :: NoDataForKey ) ;
63- } ;
86+ } ,
87+ } ;
6488
65- let Ok ( user_config) = rmp_serde:: decode:: from_slice :: < UserConfig > ( & user_config) else {
89+ let user_config = match rmp_serde:: decode:: from_slice :: < UserConfig > ( & user_config) {
90+ Ok ( user_config) => user_config,
91+ Err ( error) => {
92+ warn ! ( subject_ref = "redacted" , error = %error, "failed to decode Redis user config blob" ) ;
6693 return Err ( ConfigStoreError :: DataWrongFormat ) ;
67- } ;
94+ } ,
95+ } ;
6896
69- self . cache . lock ( ) . await . insert ( user_key. key ( ) . to_owned ( ) , user_config. clone ( ) ) ;
70- Ok ( user_config)
71- }
97+ debug ! ( subject_ref = "redacted" , virtual_hosts = user_config. virtual_hosts. len( ) , "decoded user config" ) ;
98+
99+ self . cache . lock ( ) . await . insert ( subject. to_owned ( ) , user_config. clone ( ) ) ;
100+ Ok ( user_config)
72101 }
73102
74103 async fn set_config < ' a > ( & self , user_key : & ' a User , config : & ' a UserConfig ) -> Result < ( ) , ConfigStoreError > {
104+ let subject = user_key. key ( ) ;
105+
75106 let Ok ( key) = rmp_serde:: encode:: to_vec :: < User > ( user_key) else {
107+ warn ! ( subject_ref = "redacted" , "failed to encode Redis user config key" ) ;
76108 return Err ( ConfigStoreError :: DataEncoding ) ;
77109 } ;
78110
79111 let Ok ( encoded) = rmp_serde:: encode:: to_vec :: < UserConfig > ( config) else {
112+ warn ! ( subject_ref = "redacted" , virtual_hosts = config. virtual_hosts. len( ) , "failed to encode user config" ) ;
80113 return Err ( ConfigStoreError :: DataEncoding ) ;
81114 } ;
82115
83116 let mut connection = self . connection . clone ( ) ;
84117
85- if connection. set :: < & [ u8 ] , & [ u8 ] , String > ( & key, & encoded) . await . is_ok ( ) {
86- self . cache . lock ( ) . await . insert ( user_key. key ( ) . to_owned ( ) , config. clone ( ) ) ;
87- Ok ( ( ) )
88- } else {
89- return Err ( ConfigStoreError :: CantWriteData ) ;
118+ match connection. set :: < & [ u8 ] , & [ u8 ] , String > ( & key, & encoded) . await {
119+ Ok ( _) => {
120+ debug ! (
121+ subject_ref = "redacted" ,
122+ bytes = encoded. len( ) ,
123+ virtual_hosts = config. virtual_hosts. len( ) ,
124+ "wrote user config to Redis"
125+ ) ;
126+ self . cache . lock ( ) . await . insert ( subject. to_owned ( ) , config. clone ( ) ) ;
127+ Ok ( ( ) )
128+ } ,
129+ Err ( error) => {
130+ warn ! ( subject_ref = "redacted" , error = %error, "failed to write user config to Redis" ) ;
131+ Err ( ConfigStoreError :: CantWriteData )
132+ } ,
90133 }
91134 }
92135}
0 commit comments