Skip to content

Commit e249191

Browse files
committed
fix(cmd): avoid zero-sized test streams
1 parent e8c8faf commit e249191

10 files changed

Lines changed: 51 additions & 97 deletions

File tree

src/cmd/src/auth.rs

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -126,7 +126,9 @@ mod tests {
126126
use client::StreamTrait;
127127
use storage::storage::Storage;
128128

129-
struct TestStream;
129+
struct TestStream {
130+
_marker: u8,
131+
}
130132

131133
#[async_trait::async_trait]
132134
impl StreamTrait for TestStream {
@@ -141,7 +143,7 @@ mod tests {
141143

142144
fn make_client() -> Arc<Client> {
143145
// `Client::new` is fail-closed: a freshly built client is unauthenticated.
144-
Arc::new(Client::new(Box::new(TestStream)))
146+
Arc::new(Client::new(Box::new(TestStream { _marker: 0 })))
145147
}
146148

147149
fn make_storage() -> Arc<Storage> {

src/cmd/src/hello.rs

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -139,7 +139,9 @@ mod tests {
139139
use super::*;
140140
use client::StreamTrait;
141141

142-
struct TestStream;
142+
struct TestStream {
143+
_marker: u8,
144+
}
143145

144146
#[async_trait::async_trait]
145147
impl StreamTrait for TestStream {
@@ -153,7 +155,7 @@ mod tests {
153155
}
154156

155157
fn make_client() -> Arc<Client> {
156-
Arc::new(Client::new(Box::new(TestStream)))
158+
Arc::new(Client::new(Box::new(TestStream { _marker: 0 })))
157159
}
158160

159161
fn make_storage() -> Arc<Storage> {

src/cmd/src/hscan.rs

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -112,7 +112,9 @@ mod tests {
112112

113113
use super::*;
114114

115-
struct TestStream;
115+
struct TestStream {
116+
_marker: u8,
117+
}
116118

117119
#[async_trait::async_trait]
118120
impl StreamTrait for TestStream {
@@ -175,7 +177,7 @@ mod tests {
175177
.unwrap();
176178
storage.hset(b"binary_hash", b"\xff", b"\xfe").unwrap();
177179
let storage = Arc::new(storage);
178-
let client = Client::new(Box::new(TestStream));
180+
let client = Client::new(Box::new(TestStream { _marker: 0 }));
179181
client.set_argv(&[
180182
b"hscan".to_vec(),
181183
b"binary_hash".to_vec(),
@@ -211,7 +213,7 @@ mod tests {
211213
.unwrap();
212214
storage.hset(b"empty_field_hash", b"", b"value").unwrap();
213215
let storage = Arc::new(storage);
214-
let client = Client::new(Box::new(TestStream));
216+
let client = Client::new(Box::new(TestStream { _marker: 0 }));
215217
client.set_argv(&[
216218
b"hscan".to_vec(),
217219
b"empty_field_hash".to_vec(),

src/cmd/src/keys.rs

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -89,7 +89,9 @@ mod tests {
8989
use super::KeysCmd;
9090
use crate::Cmd;
9191

92-
struct TestStream;
92+
struct TestStream {
93+
_marker: u8,
94+
}
9395

9496
#[async_trait::async_trait]
9597
impl StreamTrait for TestStream {
@@ -142,7 +144,7 @@ mod tests {
142144
storage.set(&invalid_key_a, b"invalid-a").unwrap();
143145
storage.set(&invalid_key_b, b"invalid-b").unwrap();
144146
let storage = Arc::new(storage);
145-
let client = Client::new(Box::new(TestStream));
147+
let client = Client::new(Box::new(TestStream { _marker: 0 }));
146148
let command = KeysCmd::new();
147149

148150
client.set_argv(&[b"keys".to_vec(), b"?".to_vec()]);
@@ -173,7 +175,7 @@ mod tests {
173175
storage.set(b"", b"empty-key").unwrap();
174176
storage.set(b"literal", b"literal-key").unwrap();
175177
let storage = Arc::new(storage);
176-
let client = Client::new(Box::new(TestStream));
178+
let client = Client::new(Box::new(TestStream { _marker: 0 }));
177179
let command = KeysCmd::new();
178180

179181
assert_eq!(

src/cmd/src/sscan.rs

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -110,7 +110,9 @@ mod tests {
110110

111111
use super::*;
112112

113-
struct TestStream;
113+
struct TestStream {
114+
_marker: u8,
115+
}
114116

115117
#[async_trait::async_trait]
116118
impl StreamTrait for TestStream {
@@ -173,7 +175,7 @@ mod tests {
173175
.unwrap();
174176
storage.sadd(b"binary_set", &[b"\xff"]).unwrap();
175177
let storage = Arc::new(storage);
176-
let client = Client::new(Box::new(TestStream));
178+
let client = Client::new(Box::new(TestStream { _marker: 0 }));
177179
client.set_argv(&[
178180
b"sscan".to_vec(),
179181
b"binary_set".to_vec(),
@@ -206,7 +208,7 @@ mod tests {
206208
.unwrap();
207209
storage.sadd(b"empty_member_set", &[b""]).unwrap();
208210
let storage = Arc::new(storage);
209-
let client = Client::new(Box::new(TestStream));
211+
let client = Client::new(Box::new(TestStream { _marker: 0 }));
210212
client.set_argv(&[
211213
b"sscan".to_vec(),
212214
b"empty_member_set".to_vec(),

src/cmd/src/substr.rs

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -74,7 +74,9 @@ mod tests {
7474
use crate::auth::no_requirepass_provider;
7575
use crate::table::create_command_table;
7676

77-
struct TestStream;
77+
struct TestStream {
78+
_marker: u8,
79+
}
7880

7981
#[async_trait::async_trait]
8082
impl StreamTrait for TestStream {
@@ -135,7 +137,7 @@ mod tests {
135137
.unwrap();
136138
storage.set(b"key", b"Hello World").unwrap();
137139
let storage = Arc::new(storage);
138-
let client = Client::new(Box::new(TestStream));
140+
let client = Client::new(Box::new(TestStream { _marker: 0 }));
139141
client.set_cmd_name(b"substr");
140142
client.set_argv(&[
141143
b"substr".to_vec(),
@@ -172,7 +174,7 @@ mod tests {
172174
.unwrap();
173175
storage.hset(b"hash", b"field", b"value").unwrap();
174176
let storage = Arc::new(storage);
175-
let client = Client::new(Box::new(TestStream));
177+
let client = Client::new(Box::new(TestStream { _marker: 0 }));
176178
client.set_cmd_name(b"substr");
177179
client.set_argv(&[
178180
b"substr".to_vec(),
@@ -206,7 +208,7 @@ mod tests {
206208
.unwrap();
207209
storage.set(b"binary", b"\xff\x00").unwrap();
208210
let storage = Arc::new(storage);
209-
let client = Client::new(Box::new(TestStream));
211+
let client = Client::new(Box::new(TestStream { _marker: 0 }));
210212

211213
for (key, expected) in [
212214
(
@@ -235,7 +237,7 @@ mod tests {
235237

236238
#[test]
237239
fn substr_rejects_out_of_range_integer_arguments_before_storage_access() {
238-
let client = Client::new(Box::new(TestStream));
240+
let client = Client::new(Box::new(TestStream { _marker: 0 }));
239241
client.set_cmd_name(b"substr");
240242
client.set_argv(&[
241243
b"substr".to_vec(),

src/cmd/src/table.rs

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -379,7 +379,9 @@ mod tests {
379379
assert!(!table.contains_key("touch"));
380380
}
381381

382-
struct TestStream;
382+
struct TestStream {
383+
_marker: u8,
384+
}
383385

384386
#[async_trait::async_trait]
385387
impl StreamTrait for TestStream {
@@ -399,7 +401,7 @@ mod tests {
399401

400402
fn run_command(table: &CmdTable, name: &str, argv: &[Vec<u8>]) -> RespData {
401403
let command = table.get(name).expect("command should be registered");
402-
let client = Client::new(Box::new(TestStream));
404+
let client = Client::new(Box::new(TestStream { _marker: 0 }));
403405
client.set_cmd_name(name.as_bytes());
404406
client.set_argv(argv);
405407
command.execute(&client, Arc::new(Storage::new(1, 0)));
@@ -417,7 +419,7 @@ mod tests {
417419
fn hello_command_returns_resp3_handshake() {
418420
let table = create_command_table(no_requirepass_provider());
419421
let command = table.get("hello").expect("HELLO should be registered");
420-
let client = Client::new(Box::new(TestStream));
422+
let client = Client::new(Box::new(TestStream { _marker: 0 }));
421423
client.set_cmd_name(b"hello");
422424
client.set_argv(&[b"hello".to_vec(), b"3".to_vec()]);
423425

@@ -663,7 +665,7 @@ mod tests {
663665
fn hello_bare_with_requirepass_returns_noauth() {
664666
let table = create_command_table(test_requirepass_provider(Some("secret")));
665667
let command = table.get("hello").expect("HELLO should be registered");
666-
let client = Client::new(Box::new(TestStream));
668+
let client = Client::new(Box::new(TestStream { _marker: 0 }));
667669
client.set_cmd_name(b"hello");
668670
client.set_argv(&[b"hello".to_vec(), b"3".to_vec()]);
669671

@@ -682,7 +684,7 @@ mod tests {
682684
fn hello_setname_sets_client_name() {
683685
let table = create_command_table(no_requirepass_provider());
684686
let command = table.get("hello").expect("HELLO should be registered");
685-
let client = Client::new(Box::new(TestStream));
687+
let client = Client::new(Box::new(TestStream { _marker: 0 }));
686688
client.set_cmd_name(b"hello");
687689
client.set_argv(&[
688690
b"hello".to_vec(),
@@ -704,7 +706,7 @@ mod tests {
704706
fn hello_auth_with_correct_password_authenticates() {
705707
let table = create_command_table(test_requirepass_provider(Some("secret")));
706708
let command = table.get("hello").expect("HELLO should be registered");
707-
let client = Client::new(Box::new(TestStream));
709+
let client = Client::new(Box::new(TestStream { _marker: 0 }));
708710
client.set_cmd_name(b"hello");
709711
client.set_argv(&[
710712
b"hello".to_vec(),
@@ -729,7 +731,7 @@ mod tests {
729731
fn hello_auth_with_wrong_password_returns_wrongpass() {
730732
let table = create_command_table(test_requirepass_provider(Some("secret")));
731733
let command = table.get("hello").expect("HELLO should be registered");
732-
let client = Client::new(Box::new(TestStream));
734+
let client = Client::new(Box::new(TestStream { _marker: 0 }));
733735
client.set_cmd_name(b"hello");
734736
client.set_argv(&[
735737
b"hello".to_vec(),
@@ -754,7 +756,7 @@ mod tests {
754756
fn hello_auth_without_requirepass_returns_error() {
755757
let table = create_command_table(no_requirepass_provider());
756758
let command = table.get("hello").expect("HELLO should be registered");
757-
let client = Client::new(Box::new(TestStream));
759+
let client = Client::new(Box::new(TestStream { _marker: 0 }));
758760
client.set_cmd_name(b"hello");
759761
client.set_argv(&[
760762
b"hello".to_vec(),

src/cmd/src/zmscore.rs

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -107,7 +107,9 @@ mod tests {
107107

108108
use super::*;
109109

110-
struct TestStream;
110+
struct TestStream {
111+
_marker: u8,
112+
}
111113

112114
#[async_trait::async_trait]
113115
impl StreamTrait for TestStream {
@@ -205,14 +207,14 @@ mod tests {
205207
b"first".to_vec(),
206208
];
207209

208-
let resp2_client = Client::new(Box::new(TestStream));
210+
let resp2_client = Client::new(Box::new(TestStream { _marker: 0 }));
209211
let resp2_reply = run_zmscore(&resp2_client, &storage, &members);
210212
assert_eq!(
211213
encode(&resp2_reply, RespVersion::RESP2),
212214
b"*4\r\n$3\r\n1.5\r\n$-1\r\n$5\r\n-2.25\r\n$3\r\n1.5\r\n"
213215
);
214216

215-
let resp3_client = Client::new(Box::new(TestStream));
217+
let resp3_client = Client::new(Box::new(TestStream { _marker: 0 }));
216218
resp3_client.set_argv(&[b"hello".to_vec(), b"3".to_vec()]);
217219
crate::hello::HelloCmd::default().do_cmd(&resp3_client, Arc::clone(&storage));
218220
let _hello_reply = resp3_client.take_reply();
@@ -229,7 +231,7 @@ mod tests {
229231
#[tokio::test]
230232
async fn zmscore_returns_exact_wrongtype_error_and_expired_key_nils() {
231233
let (db_path, storage) = open_storage();
232-
let client = Client::new(Box::new(TestStream));
234+
let client = Client::new(Box::new(TestStream { _marker: 0 }));
233235
storage.set(b"zmscore-key", b"not-a-zset").unwrap();
234236

235237
let wrongtype = run_zmscore(&client, &storage, &[b"member".to_vec()]);

src/storage/src/redis.rs

Lines changed: 3 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -61,14 +61,6 @@ use crate::storage_manifest::StorageManifest;
6161
/// log index that created the key (wired up by the raft layer later).
6262
pub type GenerationProvider = Arc<dyn Fn() -> Result<u64> + Send + Sync>;
6363

64-
fn default_cache_weighter<K, V>(_: &K, _: &V) -> usize {
65-
1
66-
}
67-
68-
fn default_cache_filter<K, V>(_: &K, _: &V) -> bool {
69-
true
70-
}
71-
7264
// Import logindex types for use in Storage
7365

7466
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
@@ -358,16 +350,7 @@ impl Redis {
358350
};
359351

360352
let statistics_store: Cache<String, KeyStatistics> =
361-
CacheBuilder::new(storage.statistics_max_size)
362-
.with_weighter(
363-
default_cache_weighter::<String, KeyStatistics>
364-
as fn(&String, &KeyStatistics) -> usize,
365-
)
366-
.with_filter(
367-
default_cache_filter::<String, KeyStatistics>
368-
as fn(&String, &KeyStatistics) -> bool,
369-
)
370-
.build();
353+
CacheBuilder::new(storage.statistics_max_size).build();
371354

372355
let flat_query_gate =
373356
crate::vector_flat::FlatQueryGate::new(storage.vector.max_concurrent_flat_queries);
@@ -390,25 +373,8 @@ impl Redis {
390373
vector_fault_hooks: crate::vector_fault::VectorFaultHooks::default(),
391374

392375
statistics_store: Arc::new(statistics_store),
393-
scan_cursors_store: Mutex::new(
394-
CacheBuilder::new(5000)
395-
.with_weighter(
396-
default_cache_weighter::<Vec<u8>, Vec<u8>>
397-
as fn(&Vec<u8>, &Vec<u8>) -> usize,
398-
)
399-
.with_filter(
400-
default_cache_filter::<Vec<u8>, Vec<u8>> as fn(&Vec<u8>, &Vec<u8>) -> bool,
401-
)
402-
.build(),
403-
),
404-
spop_counts_store: Mutex::new(
405-
CacheBuilder::new(1000)
406-
.with_weighter(
407-
default_cache_weighter::<String, u64> as fn(&String, &u64) -> usize,
408-
)
409-
.with_filter(default_cache_filter::<String, u64> as fn(&String, &u64) -> bool)
410-
.build(),
411-
),
376+
scan_cursors_store: Mutex::new(CacheBuilder::new(5000).build()),
377+
spop_counts_store: Mutex::new(CacheBuilder::new(1000).build()),
412378

413379
small_compaction_threshold: std::sync::atomic::AtomicU64::new(5000),
414380
small_compaction_duration_threshold: std::sync::atomic::AtomicU64::new(10000),

src/storage/src/storage.rs

Lines changed: 2 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -34,14 +34,6 @@ use crate::storage_scan::{SCAN_CURSOR_STATE_CAPACITY, ScanCursorState};
3434
use crate::{ColumnFamilyIndex, Redis, StorageOptions, data_type_to_tag};
3535
use conf::raft_type::{Binlog, OperateType};
3636

37-
fn default_cache_weighter<K, V>(_: &K, _: &V) -> usize {
38-
1
39-
}
40-
41-
fn default_cache_filter<K, V>(_: &K, _: &V) -> bool {
42-
true
43-
}
44-
4537
pub enum TaskType {
4638
None = 0,
4739
CleanAll = 1,
@@ -140,28 +132,8 @@ impl Storage {
140132
is_opened: AtomicBool::new(false),
141133
lock_mgr: Arc::new(LockMgr::new(1000)),
142134
command_access_gate: Arc::new(RwLock::new(())),
143-
cursors_store: Arc::new(
144-
CacheBuilder::new(1000)
145-
.with_weighter(
146-
default_cache_weighter::<String, String> as fn(&String, &String) -> usize,
147-
)
148-
.with_filter(
149-
default_cache_filter::<String, String> as fn(&String, &String) -> bool,
150-
)
151-
.build(),
152-
),
153-
scan_cursor_states: Arc::new(
154-
CacheBuilder::new(SCAN_CURSOR_STATE_CAPACITY)
155-
.with_weighter(
156-
default_cache_weighter::<u64, ScanCursorState>
157-
as fn(&u64, &ScanCursorState) -> usize,
158-
)
159-
.with_filter(
160-
default_cache_filter::<u64, ScanCursorState>
161-
as fn(&u64, &ScanCursorState) -> bool,
162-
)
163-
.build(),
164-
),
135+
cursors_store: Arc::new(CacheBuilder::new(1000).build()),
136+
scan_cursor_states: Arc::new(CacheBuilder::new(SCAN_CURSOR_STATE_CAPACITY).build()),
165137
db_instance_num,
166138
db_id,
167139
bg_task_handler: None,

0 commit comments

Comments
 (0)