Skip to content

Commit 5288c2d

Browse files
committed
fix(redis): address review feedback - warn on ignored credentials, fix feature gating
1 parent 4d3aaf7 commit 5288c2d

3 files changed

Lines changed: 21 additions & 22 deletions

File tree

Cargo.toml

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -125,7 +125,7 @@ rouille = { version = "3.6", optional = true, default-features = false, features
125125
syslog = { version = "7", optional = true }
126126
version-compare = { version = "0.1.1", optional = true }
127127
tracing = "0.1.44"
128-
redis = { version = "0.32", features = ["sentinel"] }
128+
redis = { version = "0.32", features = ["sentinel"], optional = true }
129129

130130
[dev-dependencies]
131131
assert_cmd = "2.0.13"
@@ -159,7 +159,7 @@ version = "0.52"
159159
[features]
160160
all = [
161161
"dist-client",
162-
162+
"redis",
163163
"s3",
164164
"memcached",
165165
"gcs",
@@ -177,7 +177,7 @@ gha = ["opendal/services-ghac", "reqwest"]
177177
memcached = ["opendal/services-memcached"]
178178
native-zlib = []
179179
oss = ["opendal/services-oss", "reqsign", "reqwest"]
180-
redis = ["url", "opendal/services-redis"]
180+
redis = ["dep:redis", "url", "opendal/services-redis"]
181181
s3 = ["opendal/services-s3", "reqsign", "reqwest"]
182182
webdav = ["opendal/services-webdav", "reqwest"]
183183
# Enable features that will build a vendored version of openssl and

src/cache/cache.rs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -380,6 +380,9 @@ pub fn build_single_cache(
380380
(Some(url_str), None, None) => {
381381
if url_str.starts_with("redis-sentinel://") {
382382
debug!("Init redis sentinel cache with url {url_str}");
383+
if username.is_some() || password.is_some() || *db != crate::config::DEFAULT_REDIS_DB {
384+
warn!("`username`, `password` and `db` have no effect when using a `redis-sentinel://` URL. Embed credentials in the URL instead.");
385+
}
383386
RedisCache::build_from_url(url_str, key_prefix, *ttl)
384387
} else {
385388
debug!("Init redis single-node cache with url {url_str}");

src/cache/redis.rs

Lines changed: 15 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -21,17 +21,13 @@ use std::collections::HashMap;
2121
use std::time::Duration;
2222
use url::Url;
2323
use anyhow::anyhow;
24-
use tracing::info;
2524

2625
/// A cache that stores entries in a Redis.
2726
pub struct RedisCache;
2827

2928
impl RedisCache {
3029
/// Create a new `RedisCache` for the given URL.
3130
pub fn build_from_url(url: &str, key_prefix: &str, ttl: u64) -> Result<Operator> {
32-
if url.starts_with("redis-sentinel://") {
33-
return Self::build_sentinel(url, key_prefix, ttl);
34-
}
3531
let parsed = Url::parse(url)?;
3632

3733
let mut builder = Redis::default()
@@ -62,7 +58,7 @@ impl RedisCache {
6258
pub fn build_sentinel(url: &str, key_prefix: &str, ttl: u64) -> Result<Operator> {
6359
use std::net::ToSocketAddrs;
6460

65-
info!("Building Redis Sentinel cache from URL: {}", url);
61+
debug!("Building Redis Sentinel cache from URL: {}", url);
6662

6763
// Basic parsing for: redis-sentinel://[:password@]host1[:port1][,host2[:port2],...]/master_name[/db]
6864
let clean_url = url.trim_start_matches("redis-sentinel://");
@@ -74,7 +70,7 @@ impl RedisCache {
7470
let nodes_part = parts[0];
7571
let master_name = parts[1];
7672

77-
info!("Sentinel nodes: {}, master_name: {}", nodes_part, master_name);
73+
debug!("Sentinel nodes: {}, master_name: {}", nodes_part, master_name);
7874

7975
// Handle password if present
8076
let (password, nodes_str) = if nodes_part.contains('@') {
@@ -89,30 +85,30 @@ impl RedisCache {
8985
let mut master_addr = None;
9086
let mut last_error: Option<String> = None;
9187

92-
info!("Attempting to discover master '{}' from {} sentinel node(s)", master_name, nodes_raw.len());
88+
debug!("Attempting to discover master '{}' from {} sentinel node(s)", master_name, nodes_raw.len());
9389

9490
for node in &nodes_raw {
95-
info!("Trying sentinel node: {}", node);
91+
debug!("Trying sentinel node: {}", node);
9692

9793
// Resolve hostname to IP address(es)
9894
let resolved_addr = match node.to_socket_addrs() {
9995
Ok(mut addrs) => {
10096
if let Some(addr) = addrs.next() {
101-
info!("Resolved {} to {}", node, addr);
97+
debug!("Resolved {} to {}", node, addr);
10298
addr.to_string()
10399
} else {
104-
info!("DNS resolved {} but returned no addresses", node);
100+
debug!("DNS resolved {} but returned no addresses", node);
105101
node.to_string()
106102
}
107103
}
108104
Err(e) => {
109-
info!("DNS resolution failed for {}: {}, using hostname directly", node, e);
105+
debug!("DNS resolution failed for {}: {}, using hostname directly", node, e);
110106
node.to_string()
111107
}
112108
};
113109

114110
let redis_url = format!("redis://{}", resolved_addr);
115-
info!("Connecting to sentinel at: {}", redis_url);
111+
debug!("Connecting to sentinel at: {}", redis_url);
116112

117113
match redis::Client::open(redis_url.as_str()) {
118114
Ok(client) => {
@@ -126,29 +122,29 @@ impl RedisCache {
126122
match res {
127123
Ok(addr_parts) if addr_parts.len() >= 2 => {
128124
let discovered = format!("redis://{}:{}", addr_parts[0], addr_parts[1]);
129-
info!("Discovered master '{}' at: {}", master_name, discovered);
125+
debug!("Discovered master '{}' at: {}", master_name, discovered);
130126
master_addr = Some(discovered);
131127
break;
132128
}
133129
Ok(addr_parts) => {
134130
last_error = Some(format!("Sentinel returned incomplete response: {:?}", addr_parts));
135-
info!("{}", last_error.as_ref().unwrap());
131+
debug!("{}", last_error.as_ref().unwrap());
136132
}
137133
Err(e) => {
138134
last_error = Some(format!("Sentinel query failed: {}", e));
139-
info!("{}", last_error.as_ref().unwrap());
135+
debug!("{}", last_error.as_ref().unwrap());
140136
}
141137
}
142138
}
143139
Err(e) => {
144140
last_error = Some(format!("Connection failed: {}", e));
145-
info!("{}", last_error.as_ref().unwrap());
141+
debug!("{}", last_error.as_ref().unwrap());
146142
}
147143
}
148144
}
149145
Err(e) => {
150146
last_error = Some(format!("Client creation failed: {}", e));
151-
info!("{}", last_error.as_ref().unwrap());
147+
debug!("{}", last_error.as_ref().unwrap());
152148
}
153149
}
154150
}
@@ -161,7 +157,7 @@ impl RedisCache {
161157
}
162158
};
163159

164-
info!("Using Redis master endpoint: {}", final_endpoint);
160+
debug!("Using Redis master endpoint: {}", final_endpoint);
165161

166162
let mut builder = Redis::default()
167163
.endpoint(&final_endpoint)
@@ -186,7 +182,7 @@ impl RedisCache {
186182
.layer(LoggingLayer::default())
187183
.finish();
188184

189-
info!("Redis Sentinel cache initialized successfully");
185+
debug!("Redis Sentinel cache initialized successfully");
190186
Ok(op)
191187
}
192188

0 commit comments

Comments
 (0)