From cb458fc952f995811323b2a2aa5e282655fa2fe4 Mon Sep 17 00:00:00 2001 From: icycrystal4 Date: Sat, 22 Oct 2022 14:51:53 +0800 Subject: [PATCH 01/34] =?UTF-8?q?tests:=20=E5=88=A0=E9=99=A4=E9=83=A8?= =?UTF-8?q?=E5=88=86=E5=BA=9F=E5=BC=83=E7=9A=84=E6=B5=8B=E8=AF=95=E7=94=A8?= =?UTF-8?q?=E4=BE=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- tests/src/all.rs | 4 +- tests/src/bit_map.rs | 31 ----- tests/src/cow.rs | 47 +++---- tests/src/mem.rs | 310 +++++++++++++++++++++---------------------- tests/src/offset.rs | 65 --------- tests/src/size.rs | 17 +-- 6 files changed, 181 insertions(+), 293 deletions(-) delete mode 100644 tests/src/bit_map.rs delete mode 100644 tests/src/offset.rs diff --git a/tests/src/all.rs b/tests/src/all.rs index 6d6dfbd93..dccd5d982 100644 --- a/tests/src/all.rs +++ b/tests/src/all.rs @@ -1,5 +1,3 @@ -// mod offset; -//mod bit_map; //mod cow; // mod distribute; // mod hash_test; @@ -13,5 +11,5 @@ mod protocol; mod hash_test; mod redis; mod ring_slice; -//mod size; +mod size; //mod slice; diff --git a/tests/src/bit_map.rs b/tests/src/bit_map.rs deleted file mode 100644 index 6bfaf9a0e..000000000 --- a/tests/src/bit_map.rs +++ /dev/null @@ -1,31 +0,0 @@ -#[cfg(test)] -mod bit_map_test { - use rand::Rng; - use std::collections::HashMap; - #[test] - fn test_bit_map() { - let cap = 256; - let bits = ds::BitMap::with_capacity(cap); - for i in 0..cap { - bits.mark(i); - assert!(bits.marked(i)); - bits.unmark(i); - assert!(!bits.marked(i)); - bits.unmark(i); - assert!(!bits.marked(i)); - } - assert_eq!(bits.take().len(), 0); - - let mut marked = HashMap::with_capacity(64); - let mut rng = rand::thread_rng(); - for _i in 0..10 { - let pos = rng.gen::() % cap; - marked.insert(pos, ()); - bits.mark(pos); - } - let mut marked = marked.iter().map(|(&pos, _)| pos).collect::>(); - marked.sort(); - - assert_eq!(marked, bits.take()); - } -} diff --git a/tests/src/cow.rs b/tests/src/cow.rs index c5d0a38d9..df53b079b 100644 --- a/tests/src/cow.rs +++ b/tests/src/cow.rs @@ -1,27 +1,24 @@ -#[cfg(test)] -mod bit_map_test { - //#[derive(Clone)] - //struct T { - // name: String, - // cfg: String, - //} - //#[test] - //fn test_cow() { - // let t = T { - // name: "icy0".to_string(), - // cfg: "cfg0".to_string(), - // }; - // let (mut tx, rx) = ds::cow(t); - // rx.read(|o| { - // assert_eq!(o.name, "icy0"); - // assert_eq!(o.cfg, "cfg0"); - // }); +//#[derive(Clone)] +//struct T { +// name: String, +// cfg: String, +//} +//#[test] +//fn test_cow() { +// let t = T { +// name: "icy0".to_string(), +// cfg: "cfg0".to_string(), +// }; +// let (mut tx, rx) = ds::cow(t); +// rx.read(|o| { +// assert_eq!(o.name, "icy0"); +// assert_eq!(o.cfg, "cfg0"); +// }); - // tx.write(&("icy1", "cfg1")); +// tx.write(&("icy1", "cfg1")); - // rx.read(|o| { - // assert_eq!(o.name, "icy1"); - // assert_eq!(o.cfg, "cfg1"); - // }); - //} -} +// rx.read(|o| { +// assert_eq!(o.name, "icy1"); +// assert_eq!(o.cfg, "cfg1"); +// }); +//} diff --git a/tests/src/mem.rs b/tests/src/mem.rs index 9813c4fda..6b0d893c6 100644 --- a/tests/src/mem.rs +++ b/tests/src/mem.rs @@ -1,166 +1,158 @@ -#[cfg(test)] -mod mem { - use ds::{RingBuffer, RingSlice}; - use std::time::{Duration, Instant}; +use ds::{RingBuffer, RingSlice}; - fn rnd_bytes(size: usize) -> Vec { - let data: Vec = (0..size).map(|_| rand::random::()).collect(); - data - } - - #[test] - fn ring_buffer() { - let cap = 32; - let data = rnd_bytes(cap); - let rs = RingSlice::from(data.as_ptr(), cap, 0, 17); - let mut buf = RingBuffer::with_capacity(cap); - buf.write(&rs); - assert_eq!(buf.len(), 17); - assert!(&(buf.data()) == &data[0..17]); - let rs = RingSlice::from(data.as_ptr(), cap, 32, 32 + 32); - buf.advance_read(buf.len()); - assert_eq!(buf.len(), 0); - let n = buf.write(&rs); - assert_eq!(buf.len(), n); - assert_eq!(&buf.data(), &data[..]); - buf.advance_read(rs.len()); - assert_eq!(buf.len(), 0); - // 有折返的 - let rs = RingSlice::from(data.as_ptr(), cap, 27, 27 + 19); - assert_eq!(rs.len(), 19); - let n = buf.write(&rs); - assert_eq!(n, rs.len()); - assert_eq!(buf.len(), rs.len()); - assert_eq!(buf.len(), 19); - assert_eq!(buf.data(), rs); - let rs = RingSlice::from(data.as_ptr(), cap, 32, 32 + 32); - let n = buf.write(&rs); - assert_eq!(n, 32 - 19); - - let mut rrb = ds::ResizedRingBuffer::from(256, 4 * 1024, 1024, |cap, delta| { - println!("resize {} => {}", cap, delta); - }); - assert_eq!(1024, rrb.cap()); - assert_eq!(0, rrb.len()); - - // 一次写满 - let buf = rrb.as_mut_bytes(); - assert_eq!(buf.len(), 1024); - assert_eq!(rrb.len(), 0); - assert_eq!(rrb.cap(), 1024); - rrb.advance_write(1024); - assert_eq!(rrb.len(), 1024); - assert_eq!(rrb.cap(), 1024); - - // 没有了,触发扩容 - let buf = rrb.as_mut_bytes(); - assert_eq!(buf.len(), 1024); - assert_eq!(rrb.cap(), 1024 * 2); - assert_eq!(rrb.len(), 1024); - - rrb.advance_read(1024); - - rrb.advance_write(1024); - let buf = rrb.as_mut_bytes(); - assert_eq!(buf.len(), 1024); - rrb.advance_write(1024); - - // 等待10ms。(默认是4ms) - std::thread::sleep(std::time::Duration::from_millis(10)); - let buf = rrb.as_mut_bytes(); - assert_eq!(buf.len(), 1024); - rrb.advance_write(1024); - let buf = rrb.as_mut_bytes(); - assert_eq!(buf.len(), 1024); +fn rnd_bytes(size: usize) -> Vec { + let data: Vec = (0..size).map(|_| rand::random::()).collect(); + data +} - // 缩容 - assert_eq!(rrb.cap(), 4 * 1024); - rrb.advance_read(2 * 1024); - rrb.resize(2 * 1024); - assert_eq!(rrb.cap(), 2 * 1024); - } +#[test] +fn ring_buffer() { + let cap = 32; + let data = rnd_bytes(cap); + let rs = RingSlice::from(data.as_ptr(), cap, 0, 17); + let mut buf = RingBuffer::with_capacity(cap); + buf.write(&rs); + assert_eq!(buf.len(), 17); + assert!(&(buf.data()) == &data[0..17]); + let rs = RingSlice::from(data.as_ptr(), cap, 32, 32 + 32); + buf.advance_read(buf.len()); + assert_eq!(buf.len(), 0); + let n = buf.write(&rs); + assert_eq!(buf.len(), n); + assert_eq!(&buf.data(), &data[..]); + buf.advance_read(rs.len()); + assert_eq!(buf.len(), 0); + // 有折返的 + let rs = RingSlice::from(data.as_ptr(), cap, 27, 27 + 19); + assert_eq!(rs.len(), 19); + let n = buf.write(&rs); + assert_eq!(n, rs.len()); + assert_eq!(buf.len(), rs.len()); + assert_eq!(buf.len(), 19); + assert_eq!(buf.data(), rs); + let rs = RingSlice::from(data.as_ptr(), cap, 32, 32 + 32); + let n = buf.write(&rs); + assert_eq!(n, 32 - 19); + + let mut rrb = ds::ResizedRingBuffer::from(256, 4 * 1024, 1024, |cap, delta| { + println!("resize {} => {}", cap, delta); + }); + assert_eq!(1024, rrb.cap()); + assert_eq!(0, rrb.len()); + + // 一次写满 + let buf = rrb.as_mut_bytes(); + assert_eq!(buf.len(), 1024); + assert_eq!(rrb.len(), 0); + assert_eq!(rrb.cap(), 1024); + rrb.advance_write(1024); + assert_eq!(rrb.len(), 1024); + assert_eq!(rrb.cap(), 1024); + + // 没有了,触发扩容 + let buf = rrb.as_mut_bytes(); + assert_eq!(buf.len(), 1024); + assert_eq!(rrb.cap(), 1024 * 2); + assert_eq!(rrb.len(), 1024); + + rrb.advance_read(1024); + + rrb.advance_write(1024); + let buf = rrb.as_mut_bytes(); + assert_eq!(buf.len(), 1024); + rrb.advance_write(1024); + + // 等待10ms。(默认是4ms) + std::thread::sleep(std::time::Duration::from_millis(10)); + let buf = rrb.as_mut_bytes(); + assert_eq!(buf.len(), 1024); + rrb.advance_write(1024); + let buf = rrb.as_mut_bytes(); + assert_eq!(buf.len(), 1024); + + // 缩容 + assert_eq!(rrb.cap(), 4 * 1024); + rrb.advance_read(2 * 1024); + rrb.resize(2 * 1024); + assert_eq!(rrb.cap(), 2 * 1024); +} - // 随机生成器,生成的内存从a-z, A-Z, 0-9 循环。 - struct Reader { - num: usize, - source: Vec, - offset: usize, - } - impl ds::BuffRead for Reader { - type Out = usize; - fn read(&mut self, b: &mut [u8]) -> (usize, Self::Out) { - assert!(self.num > 0); - let mut w = 0; - while w < self.num { - let oft = self.offset % self.source.len(); - let l = b.len().min(self.num - w); - use std::ptr::copy_nonoverlapping as copy; - unsafe { copy(self.source.as_ptr().offset(oft as isize), b.as_mut_ptr(), l) }; - w += l; - self.offset += l; - } - (w, w) +// 随机生成器,生成的内存从a-z, A-Z, 0-9 循环。 +struct Reader { + num: usize, + source: Vec, + offset: usize, +} +impl ds::BuffRead for Reader { + type Out = usize; + fn read(&mut self, b: &mut [u8]) -> (usize, Self::Out) { + assert!(self.num > 0); + let mut w = 0; + while w < self.num { + let oft = self.offset % self.source.len(); + let l = b.len().min(self.num - w); + use std::ptr::copy_nonoverlapping as copy; + unsafe { copy(self.source.as_ptr().offset(oft as isize), b.as_mut_ptr(), l) }; + w += l; + self.offset += l; } + (w, w) } +} - #[test] - fn guarded_buffer() { - // 测试MemGuard - //let data: Vec = "abcdefg".into(); - //let s: &[u8] = &data; - //let slice: RingSlice = s.into(); - //let g0: MemGuard = slice.into(); - //assert_eq!(g0.read(0), &data); - //// 指向同一块内存 - //assert_eq!(g0.read(0).as_ptr() as usize, data.as_ptr() as usize); - //g0.recall(); - //// 内存回收,共享内存被释放。数据被复制,指向不同的内存。 - //assert_ne!(g0.read(0).as_ptr() as usize, data.as_ptr() as usize); - //// 但是数据一致 - //assert_eq!(g0.read(0), &data); - ////assert_eq!(g0.len(), data.len()); - //drop(data); - - println!("=====================\n"); - - let mut reader = Reader { - offset: 0, - source: Vec::from("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"), - num: 0, - }; - use ds::{GuardedBuffer, MemGuard}; - let mut guard = GuardedBuffer::new(128, 1024, 128, |_, _| {}); - let empty = guard.read(); - assert_eq!(empty.len(), 0); - reader.num = 24; - let n = guard.write(&mut reader); - assert_eq!(n, guard.len()); - assert_eq!(n, reader.num); - - let data = guard.read(); - assert_eq!(n, data.len()); - assert_eq!(data, reader.source[0..n]); - let len_g0 = 24; - let g0 = guard.take(len_g0); - assert_eq!(g0.len(), len_g0); - assert_eq!(guard.len(), n - len_g0); - let data = guard.read(); - assert_eq!(n - len_g0, data.len()); - g0.read(0); - reader.num = 17; - guard.write(&mut reader); - let g1 = guard.take(10); - let g2 = guard.take(3); - let g3 = guard.take(3); - drop(g2); - drop(g1); - reader.num = 1; - guard.write(&mut reader); - drop(g3); - - drop(g0); - guard.gc(); - - println!("buf:{}", guard); - } +#[test] +fn guarded_buffer() { + // 测试MemGuard + //let data: Vec = "abcdefg".into(); + //let s: &[u8] = &data; + //let slice: RingSlice = s.into(); + //let g0: MemGuard = slice.into(); + //assert_eq!(g0.read(0), &data); + //// 指向同一块内存 + //assert_eq!(g0.read(0).as_ptr() as usize, data.as_ptr() as usize); + //g0.recall(); + //// 内存回收,共享内存被释放。数据被复制,指向不同的内存。 + //assert_ne!(g0.read(0).as_ptr() as usize, data.as_ptr() as usize); + //// 但是数据一致 + //assert_eq!(g0.read(0), &data); + ////assert_eq!(g0.len(), data.len()); + //drop(data); + + let mut reader = Reader { + offset: 0, + source: Vec::from("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"), + num: 0, + }; + use ds::GuardedBuffer; + let mut guard = GuardedBuffer::new(128, 1024, 128, |_, _| {}); + let empty = guard.read(); + assert_eq!(empty.len(), 0); + reader.num = 24; + let n = guard.write(&mut reader); + assert_eq!(n, guard.len()); + assert_eq!(n, reader.num); + + let data = guard.read(); + assert_eq!(n, data.len()); + assert_eq!(data, reader.source[0..n]); + let len_g0 = 24; + let g0 = guard.take(len_g0); + assert_eq!(g0.len(), len_g0); + assert_eq!(guard.len(), n - len_g0); + let data = guard.read(); + assert_eq!(n - len_g0, data.len()); + g0.read(0); + reader.num = 17; + guard.write(&mut reader); + let g1 = guard.take(10); + let g2 = guard.take(3); + let g3 = guard.take(3); + drop(g2); + drop(g1); + reader.num = 1; + guard.write(&mut reader); + drop(g3); + + drop(g0); + guard.gc(); } diff --git a/tests/src/offset.rs b/tests/src/offset.rs deleted file mode 100644 index 7cbf3295e..000000000 --- a/tests/src/offset.rs +++ /dev/null @@ -1,65 +0,0 @@ -#[cfg(test)] -mod offset_tests { - use ds::SeqOffset; - use rand::prelude::*; - use std::collections::HashMap; - - #[test] - fn test_offset() { - //test_seq_offset_one(1, 128, 32); - //test_seq_offset_one(8, 1024, 32); - test_seq_offset_one(64, 1024, 32); - } - - // 一共生成num个offset,每interval次insert检查一次 - fn test_seq_offset_one(cap: usize, num: usize, interval: usize) { - let offset = SeqOffset::with_capacity(cap); - let seqs = gen(num); - let mut cmp = 0; - let mut cached = HashMap::with_capacity(cap * 2); - - let mut rng = rand::thread_rng(); - - for (i, &(start, end)) in seqs.iter().enumerate() { - let id = rng.next_u32() as usize % cap; - offset.insert(id, start, end); - cached.insert(start, end); - - if i % interval == 0 { - while let Some(end) = cached.remove(&cmp) { - cmp = end; - } - assert_eq!(cmp, offset.load()); - } - } - while let Some(end) = cached.remove(&cmp) { - cmp = end; - } - assert_eq!(cmp, offset.load()); - assert_eq!(cached.len(), 0); - } - // 动态生成num个 (start, end)对 - fn gen(num: usize) -> Vec<(usize, usize)> { - let max_len = 1024 * 1024u32; - let mut rng = rand::thread_rng(); - let nums: Vec = (0..num) - .map(|_| 1.max(rng.next_u32() & (max_len - 1)) as usize) - .collect(); - let mut offsets = Vec::with_capacity(num); - let mut offset = 0; - for len in nums[0..nums.len() - 1].iter() { - offsets.push((offset, offset + len)); - offset += len; - } - - let splits = 3; - for i in 0..splits { - let start = i * num / splits; - let end = (start + num / splits).min(num); - let slice = &mut offsets[start..end]; - slice.shuffle(&mut rng); - } - // 分为三段,三段内部分别打乱顺序 - offsets - } -} diff --git a/tests/src/size.rs b/tests/src/size.rs index 38c376925..5d43d5f3e 100644 --- a/tests/src/size.rs +++ b/tests/src/size.rs @@ -1,11 +1,8 @@ -#[cfg(test)] -mod size_test { - #[test] - fn test_size() { - //use crossbeam_channel::{bounded, Receiver, Sender}; - //use std::mem::size_of; - //use stream::{MpmcStream, Request}; - //println!("size of MpmcStream:{}", size_of::()); - //println!("size of request:{}", size_of::()); - } +#[test] +fn test_size() { + //use crossbeam_channel::{bounded, Receiver, Sender}; + //use std::mem::size_of; + //use stream::{MpmcStream, Request}; + //println!("size of MpmcStream:{}", size_of::()); + //println!("size of request:{}", size_of::()); } From 56ef304a29653d6e69841370cdc0cd23a573ee69 Mon Sep 17 00:00:00 2001 From: xinxin22 Date: Mon, 24 Oct 2022 19:49:37 +0800 Subject: [PATCH 02/34] =?UTF-8?q?mget=2010000=E4=B8=AAkey=E9=80=9A?= =?UTF-8?q?=E8=BF=87?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- tests_ci/src/counterservice.rs | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/tests_ci/src/counterservice.rs b/tests_ci/src/counterservice.rs index bbeb1d539..50d4c8755 100644 --- a/tests_ci/src/counterservice.rs +++ b/tests_ci/src/counterservice.rs @@ -318,6 +318,22 @@ fn test_mget() { ); } +//获取10000个key +#[test] +fn test_thousand_mget() { + let mut keys = Vec::new(); + let mut value = Vec::new(); + + for i in 1..=10000 { + keys.push(i); + let all_value = format!("repost:{},like:{},comment:{}", i, i, i); + value.push(all_value); + } + assert_eq!( + redis::cmd("MGET").arg(keys).query(&mut get_conn()), + Ok(value) + ); +} // todo:如果value大于配置的value 为异常case // 测试端口配置了三列 repost:value为12b comment:value为10b like:value为10b From 6b4fd711253412007024824aee8619ccdaf5c0c9 Mon Sep 17 00:00:00 2001 From: FicoHu Date: Mon, 24 Oct 2022 21:51:47 +0800 Subject: [PATCH 03/34] Update rust.yml --- .github/workflows/rust.yml | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/.github/workflows/rust.yml b/.github/workflows/rust.yml index ddbcb1d57..88e245d71 100644 --- a/.github/workflows/rust.yml +++ b/.github/workflows/rust.yml @@ -22,6 +22,11 @@ jobs: - name: Prepare Vintage_MC_Redis run: docker run -d -v /home/runner/work/breeze:/data1/resource/breeze --net="host" --name breeze_github_ci ficohu/breeze:githubci0011 - uses: actions/checkout@v3 + - name: Install stable toolchain + uses: actions-rs/toolchain@v1 + with: + toolchain: stable + override: true - name: Build run: cargo build - name: Check Vintage @@ -59,3 +64,9 @@ jobs: #cat /home/runner/work/breeze/logs/breeze.log - name: Run tests run: cargo test + - name: Run cargo-tarpaulin + uses: actions-rs/tarpaulin@v0.1 + with: + version: '0.15.0' + args: '-- --tests' + out-type: 'Stdout' From f894d72fa9394bf6aae19101ce7422eaa520fb4d Mon Sep 17 00:00:00 2001 From: FicoHu Date: Mon, 24 Oct 2022 21:58:43 +0800 Subject: [PATCH 04/34] Update rust.yml --- .github/workflows/rust.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/rust.yml b/.github/workflows/rust.yml index 88e245d71..06d9c0be4 100644 --- a/.github/workflows/rust.yml +++ b/.github/workflows/rust.yml @@ -62,11 +62,11 @@ jobs: tail -10 /home/runner/work/breeze/logs/breeze.log #cat /home/runner/work/breeze/logs/log.file #cat /home/runner/work/breeze/logs/breeze.log - - name: Run tests - run: cargo test - name: Run cargo-tarpaulin uses: actions-rs/tarpaulin@v0.1 with: version: '0.15.0' args: '-- --tests' out-type: 'Stdout' + - name: Run tests + run: cargo test From 2cfaac05c88ddfb44c80d4dbadda3a39c24ed18e Mon Sep 17 00:00:00 2001 From: FicoHu Date: Mon, 24 Oct 2022 22:11:25 +0800 Subject: [PATCH 05/34] Update rust.yml --- .github/workflows/rust.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/rust.yml b/.github/workflows/rust.yml index 06d9c0be4..b16d6f202 100644 --- a/.github/workflows/rust.yml +++ b/.github/workflows/rust.yml @@ -66,7 +66,7 @@ jobs: uses: actions-rs/tarpaulin@v0.1 with: version: '0.15.0' - args: '-- --tests' + args: '-v' out-type: 'Stdout' - name: Run tests run: cargo test From ef330ca0a321e78ed659a330e3fac16c6f5f9f76 Mon Sep 17 00:00:00 2001 From: FicoHu Date: Mon, 24 Oct 2022 22:34:04 +0800 Subject: [PATCH 06/34] Update rust.yml --- .github/workflows/rust.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/.github/workflows/rust.yml b/.github/workflows/rust.yml index b16d6f202..7b8435aa1 100644 --- a/.github/workflows/rust.yml +++ b/.github/workflows/rust.yml @@ -67,6 +67,5 @@ jobs: with: version: '0.15.0' args: '-v' - out-type: 'Stdout' - name: Run tests run: cargo test From 6334f1cadacd43d3172d00886dbd151197eac893 Mon Sep 17 00:00:00 2001 From: hailong15 Date: Tue, 25 Oct 2022 15:18:45 +0800 Subject: [PATCH 07/34] add test --- tests_ci/src/redis.rs | 33 ++++++++++++++++++++++++++++++++- 1 file changed, 32 insertions(+), 1 deletion(-) diff --git a/tests_ci/src/redis.rs b/tests_ci/src/redis.rs index a14fdc87e..dd7e09d83 100644 --- a/tests_ci/src/redis.rs +++ b/tests_ci/src/redis.rs @@ -2,6 +2,7 @@ //! ## 基本操作验证 //! - basic set //! - set 过期时间后, ttl > 0 +//! - mget 两个key //! - mget 两个key, 其中只有一个set了, 预期应有一个none结果 //! - basic del //! - basic incr @@ -14,7 +15,8 @@ //! - set 1 1, ..., set 10000 10000等一万个key已由java sdk预先写入, //! 从mesh读取, 验证业务写入与mesh读取之间的一致性 //! - value大小数组[4, 40, 400, 4000, 8000, 20000, 3000000],依次set后随机set,验证buffer扩容 -//! - pipiline方式,set 两个key后,mget读取 +//! - key大小数组[4, 40, 400, 4000], 依次set后get +//! - pipiline方式,set 两个key后,mget读取(注释了,暂未验证) use crate::ci::env::*; use crate::redis_helper::*; @@ -314,3 +316,32 @@ fn test_set_value_fix_size() { assert_eq!(redis::cmd("GET").arg(arykey).query(&mut con), Ok(val)); } } + +///依次set key长度为[4, 40, 400, 4000] +#[test] +fn test_set_key_fix_size() { + let mut con = get_conn(&file!().get_host()); + + let key_sizes = [4, 40, 400, 4000]; + for key_size in key_sizes { + let key = vec![1u8; key_size]; + redis::cmd("SET").arg(&key).arg("foo").execute(&mut con); + assert_eq!( + redis::cmd("GET").arg(&key).query(&mut con), + Ok("foo".to_string()) + ); + } +} + +//mget 获取10000个key +#[test] +fn test_mget_10000() { + let mut con = get_conn(&file!().get_host()); + + let maxkey = 10000; + let mut keys = Vec::with_capacity(maxkey); + for i in 1..=maxkey { + keys.push(i); + } + assert_eq!(redis::cmd("MGET").arg(&keys).query(&mut con), Ok(keys)); +} From 527c75ddb2dbf7efc25fa508d28d4a9d42e777e0 Mon Sep 17 00:00:00 2001 From: wanggang9 Date: Tue, 25 Oct 2022 15:54:54 +0800 Subject: [PATCH 08/34] eliminate the warning --- tests/src/proto.rs | 10 +++------- tests/src/shard_test.rs | 7 +++++++ tests_ci/src/counterservice.rs | 5 +++-- tests_ci/src/mc.rs | 14 ++++++++------ 4 files changed, 21 insertions(+), 15 deletions(-) diff --git a/tests/src/proto.rs b/tests/src/proto.rs index 77d568c50..3a840e8cd 100644 --- a/tests/src/proto.rs +++ b/tests/src/proto.rs @@ -1,9 +1,5 @@ #[cfg(test)] mod proto_test { - use std::{ - collections::{HashMap, HashSet}, - io::{Error, ErrorKind, Result}, - }; use protocol::parser::Stream; use std::ptr::copy_nonoverlapping as copy; @@ -49,9 +45,9 @@ mod proto_test { #[test] fn test_redis_panic() { - const CAP: usize = 2048; + const _CAP: usize = 2048; let start = 4636157; - let end = 4637617; + let _end = 4637617; let mut buf = stream::buffer::StreamGuard::raw_init(2048); let mut w = 0; while w < start { @@ -74,7 +70,7 @@ mod proto_test { use protocol::Protocol; let redis = protocol::redis::Redis {}; - redis.parse_response(&mut buf); + let _resp = redis.parse_response(&mut buf); } const DATA: [u8; 0] = []; } diff --git a/tests/src/shard_test.rs b/tests/src/shard_test.rs index 0bc4aec82..87dc29b81 100644 --- a/tests/src/shard_test.rs +++ b/tests/src/shard_test.rs @@ -31,6 +31,7 @@ fn crc32_short() { assert_eq!(h_point, 2642712869, "crc32-point hash"); } +#[allow(dead_code)] fn build_servers() -> Vec { let shard_count = 8; let mut servers = Vec::with_capacity(shard_count); @@ -39,6 +40,7 @@ fn build_servers() -> Vec { } servers } +#[allow(dead_code)] fn root_path() -> &'static str { "./records" } @@ -221,6 +223,7 @@ fn raw_hash() { assert_eq!(hash2, val1); } +#[allow(dead_code)] fn bkdr_check(path: &str) { let file = File::open(path).unwrap(); let mut reader = BufReader::new(file); @@ -327,6 +330,7 @@ fn shard_check(path: &str, hasher: &Hasher, dist: &Distribute) { println!("check crc32 from file: {} completed!", path); } +#[allow(dead_code)] fn consistent_check(path: &str) { let file = File::open(path).unwrap(); let mut reader = BufReader::new(file); @@ -377,12 +381,14 @@ fn consistent_check(path: &str) { println!("check consistent hash from file: {}", path); } +#[allow(dead_code)] struct ConsistentHashInstance { consistent_map: BTreeMap, shards: Vec<&'static str>, } impl ConsistentHashInstance { + #[allow(dead_code)] fn from(shards: Vec<&'static str>) -> Self { let mut consistent_map = BTreeMap::new(); for idx in 0..shards.len() { @@ -418,6 +424,7 @@ impl ConsistentHashInstance { } } + #[allow(dead_code)] fn get_hash_server(&self, key: &str) -> (i64, String) { // 一致性hash,选择hash环的第一个节点,不支持漂移,避免脏数据 fishermen let bk = Bkdr {}; diff --git a/tests_ci/src/counterservice.rs b/tests_ci/src/counterservice.rs index 50d4c8755..e0389a0ef 100644 --- a/tests_ci/src/counterservice.rs +++ b/tests_ci/src/counterservice.rs @@ -7,13 +7,14 @@ use std::collections::HashMap; use std::vec; use crate::ci::env::exists_key_iter; - +#[allow(dead_code)] fn rand_num() -> u32 { let mut rng = rand::thread_rng(); rng.gen::() //rng.gen_range(0..18446744073709551615) //18446744073709551 } +#[allow(dead_code)] fn rand_key(tail: &str) -> String { let mut rng = thread_rng(); let mut s: String = (&mut rng) @@ -24,7 +25,7 @@ fn rand_key(tail: &str) -> String { s.push_str(tail); s } - +#[allow(dead_code)] fn record_max_key() {} // set 1 2, ..., set 10000 10000等一万个key已由java sdk预先写入, diff --git a/tests_ci/src/mc.rs b/tests_ci/src/mc.rs index aec98a6f1..954e00dbf 100644 --- a/tests_ci/src/mc.rs +++ b/tests_ci/src/mc.rs @@ -7,7 +7,6 @@ /// 数据由 java SDK 预先写入:key: 0...9999 value: 0...9999 /// - 模拟简单mc add命令: get -> add -> get /// -use crate::ci::env::*; mod mc_test { @@ -32,9 +31,12 @@ mod mc_test { let mut v_sizes = [1048507, 4, 4000, 40, 8000, 20000, 0, 400]; for v_size in v_sizes { let val = vec![0x41; v_size]; - assert_eq!(client - .set(key, &String::from_utf8_lossy(&val).to_string(), 2) - .is_ok(),true); + assert_eq!( + client + .set(key, &String::from_utf8_lossy(&val).to_string(), 2) + .is_ok(), + true + ); let result: Result = client.get(key); assert!(result.is_ok()); assert_eq!( @@ -68,7 +70,7 @@ mod mc_test { for value in exists_key_iter() { key = value.to_string(); let result: Result, bmemcached::errors::Error> = client.get(key); - assert!(result.is_ok(),"result : {:?}",result); + assert!(result.is_ok(), "result : {:?}", result); assert_eq!(result.expect("ok"), value.to_string().into_bytes()); } } @@ -95,7 +97,7 @@ mod mc_test { assert_eq!(result.expect("ok"), value); } - /// 测试场景:基本的mc get 命令验证 + /// 测试场景:基本的mc get 命令验证 /// 测试步骤:get(key) key 为预先写入的key #[test] fn mc_simple_get() { From 135af0a028f0a664f3f2eac27df9a2666ac9e7a5 Mon Sep 17 00:00:00 2001 From: xinxin22 Date: Wed, 26 Oct 2022 15:16:05 +0800 Subject: [PATCH 09/34] =?UTF-8?q?bigvalue=E6=89=A9=E5=B1=95=E5=AD=98?= =?UTF-8?q?=E5=82=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- tests_ci/src/counterservice.rs | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/tests_ci/src/counterservice.rs b/tests_ci/src/counterservice.rs index 50d4c8755..f402127af 100644 --- a/tests_ci/src/counterservice.rs +++ b/tests_ci/src/counterservice.rs @@ -336,6 +336,11 @@ fn test_thousand_mget() { } // todo:如果value大于配置的value 为异常case // 测试端口配置了三列 repost:value为12b comment:value为10b like:value为10b +// 大于value位数仍然可以存储,有扩展存储 +#[test] +fn test_big_value() { + test_set_key_value(666666, 10000000000000000); +} fn get_conn() -> Connection { let host = file!().get_host(); @@ -354,7 +359,7 @@ fn get_conn() -> Connection { conn } -fn test_set_key_value(key: i32, value: i32) { +fn test_set_key_value(key: i32, value: i64) { let column_cfg = vec![".repost", ".comment", ".like"]; for column in column_cfg.iter() { From 5ac3250a784979e0ac297b1bb9eedde385133c7f Mon Sep 17 00:00:00 2001 From: xiaowang Date: Wed, 26 Oct 2022 17:23:17 +0800 Subject: [PATCH 10/34] =?UTF-8?q?=E6=9B=BF=E6=8D=A2mc=20client?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- tests_ci/Cargo.toml | 2 +- tests_ci/src/mc.rs | 185 +++++++++++++++++++++++++------------------- 2 files changed, 105 insertions(+), 82 deletions(-) diff --git a/tests_ci/Cargo.toml b/tests_ci/Cargo.toml index 8bd241b5a..1f1d39f27 100644 --- a/tests_ci/Cargo.toml +++ b/tests_ci/Cargo.toml @@ -9,7 +9,7 @@ edition = "2021" rand = "0.8.4" rust-crypto = "0.2.36" byteorder = "1.4.3" -bmemcached = "0.5.0" +memcache = "0.16.0" assert-panic = "1.0.1" function_name = "0.3.0" diff --git a/tests_ci/src/mc.rs b/tests_ci/src/mc.rs index 954e00dbf..24247d9d1 100644 --- a/tests_ci/src/mc.rs +++ b/tests_ci/src/mc.rs @@ -3,14 +3,22 @@ /// key: "fooset" value: 每个字符内容为 ‘A’ /// 乱序set: [1048507, 4, 4000, 40, 8000, 20000, 0, 400] /// 顺序set: [0, 4, 40, 400, 4000, 8000, 20000, 1048507] +/// /// - 模拟mc已有10000条数据,通过 mesh 读取,验证数据一致性 /// 数据由 java SDK 预先写入:key: 0...9999 value: 0...9999 -/// - 模拟简单mc add命令: get -> add -> get -/// +/// +/// - 模拟简单mc 基本命令: +/// 包括: add、get、replace、delete、append、prepend、gets、cas、incr、decr +/// set命令未单独测试; +/// +/// - +use crate::ci::env::*; mod mc_test { - use bmemcached::MemcachedClient; + use std::collections::HashMap; + + use memcache::{Client, MemcacheError}; use crate::ci::env::{exists_key_iter, Mesh}; @@ -31,16 +39,18 @@ mod mc_test { let mut v_sizes = [1048507, 4, 4000, 40, 8000, 20000, 0, 400]; for v_size in v_sizes { let val = vec![0x41; v_size]; + let res = client.set(key, &String::from_utf8_lossy(&val).to_string(), 2); + println!("res :{:?}",res); assert_eq!( client .set(key, &String::from_utf8_lossy(&val).to_string(), 2) .is_ok(), true ); - let result: Result = client.get(key); + let result: Result, MemcacheError> = client.get(key); assert!(result.is_ok()); assert_eq!( - result.expect("ok"), + result.expect("ok").expect("ok"), String::from_utf8_lossy(&val).to_string() ); } @@ -50,10 +60,10 @@ mod mc_test { assert!(client .set(key, &String::from_utf8_lossy(&val).to_string(), 2) .is_ok()); - let result: Result = client.get(key); + let result: Result, MemcacheError> = client.get(key); assert!(result.is_ok()); assert_eq!( - result.expect("ok"), + result.expect("ok").expect("ok"), String::from_utf8_lossy(&val).to_string() ); } @@ -69,32 +79,42 @@ mod mc_test { let mut key: String; for value in exists_key_iter() { key = value.to_string(); - let result: Result, bmemcached::errors::Error> = client.get(key); - assert!(result.is_ok(), "result : {:?}", result); - assert_eq!(result.expect("ok"), value.to_string().into_bytes()); + let result: Result, MemcacheError> = client.get(&key); + assert!(result.is_ok()); + assert_eq!(result.expect("ok").expect("ok"), value); } } - fn mc_get_conn() -> MemcachedClient { - let host = file!().get_host(); - let client_rs = MemcachedClient::new(vec![host], 5); - assert_eq!(true, client_rs.is_ok()); - return client_rs.expect("ok"); - } + /// 测试场景: 测试mc 单次最多gets 多少个key + /*#[test] + fn mc_gets_keys() { + let client = mc_get_conn(); + for keycount in 1..=256 { + let key = keycount + } + let client = mc_get_conn(); + let key = "getsfoo"; + let value = "getsbar"; + assert!(client.set(key, value, 2).is_ok()); + assert!(client.set(value, key, 2).is_ok()); + let result: Result, MemcacheError> = + client.gets(&["getsfoo", "getsbar"]); + assert!(result.is_ok()); + assert_eq!(result.expect("ok").len(), 2); + }*/ /// 测试场景:基本的mc add 命令验证 - /// 测试步骤:get(key) -> add(key) -> get(key) #[test] fn mc_simple_add() { let client = mc_get_conn(); let key = "fooadd"; let value = "bar"; - let result: Result = client.get(key); - assert_eq!(true, result.is_err()); - client.add(key, value, 10).unwrap(); - let result: Result = client.get(key); + let result: Result, MemcacheError> = client.get(key); + assert_eq!(true, result.expect("ok").is_none()); + assert!(client.add(key, value, 10).is_ok()); + let result: Result, MemcacheError> = client.get(key); assert_eq!(true, result.is_ok()); - assert_eq!(result.expect("ok"), value); + assert_eq!(result.expect("ok").expect("ok"), value); } /// 测试场景:基本的mc get 命令验证 @@ -102,9 +122,9 @@ mod mc_test { #[test] fn mc_simple_get() { let client = mc_get_conn(); - let result: Result, bmemcached::errors::Error> = client.get("4357"); + let result: Result, MemcacheError> = client.get("307"); assert!(result.is_ok()); - assert_eq!(result.expect("ok"), 4357.to_string().into_bytes()); + assert_eq!(result.expect("ok").expect("ok"), "307"); } /// 测试场景:基本的mc replace 命令验证 @@ -115,20 +135,23 @@ mod mc_test { let value = "bar"; assert!(client.set(key, value, 3).is_ok()); assert_eq!(true, client.replace(key, "baz", 3).is_ok()); - let result: Result = client.get(key); + let result: Result, MemcacheError> = client.get(key); assert_eq!(result.is_ok(), true); - assert_eq!(result.expect("ok"), "baz"); + assert_eq!(result.expect("ok").expect("ok"), "baz"); } + ///测试场景:基本的mc delete 命令验证 #[test] fn mc_simple_delete() { let client = mc_get_conn(); let key = "foodel"; let value = "bar"; + let result: Result, MemcacheError> = client.get(key); + assert_eq!(true, result.expect("ok").is_none()); assert!(client.add(key, value, 2).is_ok()); assert!(client.delete(key).is_ok()); - let result: Result = client.get(key); - assert!(result.is_err()); + let result: Result, MemcacheError> = client.get(key); + assert_eq!(true, result.expect("ok").is_none()); } /* @@ -143,84 +166,84 @@ mod mc_test { assert_eq!(true,result.is_ok()); number += 1; } - } + }*/ + ///测试场景:基本的mc append 命令验证 #[test] - fn mc_test_append() { + fn mc_simple_append() { let client = mc_get_conn(); let key = "append"; let value = "bar"; let append_value = "baz"; - client.set(key, value, 2).unwrap(); - client.append(key, append_value); - let result: String = client.get(key).unwrap().unwrap(); - assert_eq!(result, "barbaz"); - println!("completed mc append test!"); + assert!(client.set(key, value, 3).is_ok()); + assert!(client.append(key, append_value).is_ok()); + let result: Result, MemcacheError> = client.get(key); + assert_eq!(result.is_ok(), true); + assert_eq!(result.expect("ok").expect("ok"), "barbaz"); } + ///测试场景:基本的mc prepend 命令验证 #[test] - fn mc_test_prepend() { + fn mc_simple_prepend() { let client = mc_get_conn(); let key = "prepend"; let value = "bar"; - let append_value = "foo"; - client.set(key, value, 2).unwrap(); - - client.prepend(key, append_value).unwrap(); - let result: String = client.get(key).unwrap().unwrap(); - assert_eq!(result, "foobar"); - println!("completed mc prepend test!"); + let prepend_value = "foo"; + assert!(client.set(key, value, 3).is_ok()); + assert!(client.prepend(key, prepend_value).is_ok()); + let result: Result, MemcacheError> = client.get(key); + assert_eq!(result.is_ok(), true); + assert_eq!(result.expect("ok").expect("ok"), "foobar"); } + ///测试场景:基本的mc cas 命令验证 #[test] - fn mc_test_cas() { + fn mc_simple_cas() { let client = mc_get_conn(); - client.set("foocas", "bar", 10).unwrap(); - let result: HashMap, u32, Option)> = - client.gets(&["foocas"]).unwrap(); - let (_, _, cas) = result.get("foocas").unwrap(); - let cas = cas.unwrap(); - assert_eq!(true, client.cas("foocas", "bar2", 10, cas).unwrap()); + assert!(client.set("foocas", "bar", 10).is_ok()); + let getsres: Result, u32, Option)>, MemcacheError> = + client.gets(&["foocas"]); + assert!(getsres.is_ok()); + let result: HashMap, u32, Option)> = getsres.expect("ok"); + let (_, _, cas) = result.get("foocas").expect("ok"); + let cas = cas.expect("ok"); + assert_eq!(true, client.cas("foocas", "bar2", 10, cas).expect("ok")); } + ///测试场景:基本的mc gets 命令验证 #[test] - fn mc_test_gets() { + fn mc_simple_gets() { + //多个key let client = mc_get_conn(); let key = "getsfoo"; let value = "getsbar"; - client.set(key, value, 2).unwrap(); - client.set(value, key, 2).unwrap(); - let result: HashMap = client.gets(&["getsfoo", "getsbar"]).unwrap(); - assert_eq!(result.len(), 2); - assert_eq!(result["getsfoo"], "getsbar"); - assert_eq!(result["getsbar"], "getsfoo"); - println!("completed mc gets test!"); + assert!(client.set(key, value, 2).is_ok()); + assert!(client.set(value, key, 2).is_ok()); + let result: Result, MemcacheError> = + client.gets(&["getsfoo", "getsbar"]); + assert!(result.is_ok()); + assert_eq!(result.expect("ok").len(), 2); } + ///测试场景:基本的mc incr和decr 命令验证 #[test] - fn mc_test_delete() { + fn mc_simple_incr_decr() { let client = mc_get_conn(); - let key = "foo"; - let value = "bar"; - client.add(key, value, 2).unwrap(); - client.delete(key).unwrap(); - client.add(key, "foobar", 2).unwrap(); - let result: String = client.get(key).unwrap(); - assert_eq!(result, "foobar"); - println!("completed mc delete test!"); + let key = "fooinde"; + assert!(client.set(key, 10, 3).is_ok()); + let res = client.increment(key, 5); + assert!(res.is_ok()); + assert_eq!(res.expect("ok"), 15); + let res = client.decrement(key, 5); + assert!(res.is_ok()); + assert_eq!(res.expect("ok"), 10); } - #[test] - fn mc_test_incr_decr() { - let client = mc_get_conn(); - let key = "barr"; - client.delete(key).unwrap(); - - client.set(key, 10, 3).unwrap(); - let res = client.increment(key, 5).unwrap(); - assert_eq!(res, 15); - let res = client.decrement(key, 5).unwrap(); - assert_eq!(res, 10); - println!("completed mc prepend test!"); - }*/ -} + fn mc_get_conn() -> Client { + let host_ip = file!().get_host(); + let host = String::from("memcache://") + &host_ip; + let client = memcache::connect(host); + assert_eq!(true, client.is_ok()); + return client.expect("ok"); + } +} \ No newline at end of file From 9957ca27710aaf502dd45b6200016efa796e2ac8 Mon Sep 17 00:00:00 2001 From: xiaowang Date: Thu, 27 Oct 2022 19:14:43 +0800 Subject: [PATCH 11/34] =?UTF-8?q?=E6=96=B0=E5=A2=9E=E4=B8=A4=E4=B8=AA?= =?UTF-8?q?=E6=B5=8B=E8=AF=95=E7=94=A8=E4=BE=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- tests_ci/src/mc.rs | 75 ++++++++++++++++++++++++++++++++++++---------- 1 file changed, 60 insertions(+), 15 deletions(-) diff --git a/tests_ci/src/mc.rs b/tests_ci/src/mc.rs index 24247d9d1..762aca28b 100644 --- a/tests_ci/src/mc.rs +++ b/tests_ci/src/mc.rs @@ -39,8 +39,6 @@ mod mc_test { let mut v_sizes = [1048507, 4, 4000, 40, 8000, 20000, 0, 400]; for v_size in v_sizes { let val = vec![0x41; v_size]; - let res = client.set(key, &String::from_utf8_lossy(&val).to_string(), 2); - println!("res :{:?}",res); assert_eq!( client .set(key, &String::from_utf8_lossy(&val).to_string(), 2) @@ -86,22 +84,69 @@ mod mc_test { } /// 测试场景: 测试mc 单次最多gets 多少个key - /*#[test] + #[test] fn mc_gets_keys() { let client = mc_get_conn(); - for keycount in 1..=256 { - let key = keycount + let mut key: Vec = Vec::new(); + for keycount in 10001..=11000u64 { + let k = keycount.to_string(); + let s = client.set(&k, keycount, 1000); + assert!(s.is_ok(), "panic res:{:?}", s); + key.push(k); } + + let mut mkey: Vec<&str> = Vec::new(); + for (count, k) in key.iter().enumerate() { + mkey.push(k.as_str()); + let result: Result, MemcacheError> = + client.gets(mkey.as_slice()); + println!("count is :{}", count + 1); + println!("keys is :{:?}", mkey); + println!("result is: {:?}", result); + assert!(result.is_ok()); + /*if result.expect("ok").len() != count+1 { + for get_k in &mkey { + let result: Result, MemcacheError> = client.get(get_k); + assert!(result.is_ok()); + } + }*/ + assert_eq!(result.expect("ok").len(), count + 1); + } + } + + /// 测试场景: 测试key的长度 + #[test] + fn mc_key_length() { let client = mc_get_conn(); - let key = "getsfoo"; - let value = "getsbar"; - assert!(client.set(key, value, 2).is_ok()); - assert!(client.set(value, key, 2).is_ok()); - let result: Result, MemcacheError> = - client.gets(&["getsfoo", "getsbar"]); - assert!(result.is_ok()); - assert_eq!(result.expect("ok").len(), 2); - }*/ + for k_len in 11000..12000usize { + let key = vec![0x41; k_len]; + assert!(client + .set( + &String::from_utf8_lossy(&key).to_string(), + k_len.to_string(), + 2 + ) + .is_ok()); + let result: Result, MemcacheError> = + client.get(&String::from_utf8_lossy(&key).to_string()); + assert!(result.is_ok()); + assert_eq!(result.expect("ok").expect("ok"), k_len.to_string()); + } + } + + /// 测试场景:基本的mc add 命令验证 + #[test] + fn mc_max_key() { + let client = mc_get_conn(); + let key = "fooadd"; + let value = "bar"; + let result: Result, MemcacheError> = client.get(key); + assert_eq!(true, result.expect("ok").is_none()); + assert!(client.add(key, value, 10).is_ok()); + let result: Result, MemcacheError> = client.get(key); + assert_eq!(true, result.is_ok()); + assert_eq!(result.expect("ok").expect("ok"), value); + } /// 测试场景:基本的mc add 命令验证 #[test] @@ -246,4 +291,4 @@ mod mc_test { assert_eq!(true, client.is_ok()); return client.expect("ok"); } -} \ No newline at end of file +} From c18ff57331696ebcc02b69916abf43f65a370d84 Mon Sep 17 00:00:00 2001 From: xiaowang Date: Thu, 27 Oct 2022 19:33:52 +0800 Subject: [PATCH 12/34] =?UTF-8?q?=E6=96=B0=E5=A2=9E=E4=B8=A4=E4=B8=AA?= =?UTF-8?q?=E6=B5=8B=E8=AF=95=E7=94=A8=E4=BE=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- tests_ci/src/mc.rs | 2 -- 1 file changed, 2 deletions(-) diff --git a/tests_ci/src/mc.rs b/tests_ci/src/mc.rs index 762aca28b..bab0350bb 100644 --- a/tests_ci/src/mc.rs +++ b/tests_ci/src/mc.rs @@ -12,8 +12,6 @@ /// set命令未单独测试; /// /// - -use crate::ci::env::*; - mod mc_test { use std::collections::HashMap; From dd826af65a1fa30edb9cbd9d81febf39a965ef2b Mon Sep 17 00:00:00 2001 From: xiaowang Date: Thu, 27 Oct 2022 20:36:29 +0800 Subject: [PATCH 13/34] =?UTF-8?q?=E8=B0=83=E6=95=B4max=5Fkey=5Flen?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- tests_ci/src/mc.rs | 37 +++++++++++++++++++------------------ 1 file changed, 19 insertions(+), 18 deletions(-) diff --git a/tests_ci/src/mc.rs b/tests_ci/src/mc.rs index bab0350bb..905941660 100644 --- a/tests_ci/src/mc.rs +++ b/tests_ci/src/mc.rs @@ -102,12 +102,6 @@ mod mc_test { println!("keys is :{:?}", mkey); println!("result is: {:?}", result); assert!(result.is_ok()); - /*if result.expect("ok").len() != count+1 { - for get_k in &mkey { - let result: Result, MemcacheError> = client.get(get_k); - assert!(result.is_ok()); - } - }*/ assert_eq!(result.expect("ok").len(), count + 1); } } @@ -116,19 +110,26 @@ mod mc_test { #[test] fn mc_key_length() { let client = mc_get_conn(); - for k_len in 11000..12000usize { - let key = vec![0x41; k_len]; - assert!(client - .set( - &String::from_utf8_lossy(&key).to_string(), - k_len.to_string(), - 2 - ) - .is_ok()); + for k_len in 1..=251usize { + let key = vec![0x42; k_len]; + let set_res = client.set( + &String::from_utf8_lossy(&key).to_string(), + k_len.to_string(), + 2, + ); + if k_len < 251 { + assert!(set_res.is_ok()); + } else { + assert!(set_res.is_err()) + } let result: Result, MemcacheError> = client.get(&String::from_utf8_lossy(&key).to_string()); - assert!(result.is_ok()); - assert_eq!(result.expect("ok").expect("ok"), k_len.to_string()); + if k_len < 251 { + assert!(result.is_ok()); + assert_eq!(result.expect("ok").expect("ok"), k_len.to_string()); + } else { + assert!(result.is_err()) + } } } @@ -136,7 +137,7 @@ mod mc_test { #[test] fn mc_max_key() { let client = mc_get_conn(); - let key = "fooadd"; + let key = "simplefooadd"; let value = "bar"; let result: Result, MemcacheError> = client.get(key); assert_eq!(true, result.expect("ok").is_none()); From f6129901bdb88c1a1670237b51e7baf117c452f9 Mon Sep 17 00:00:00 2001 From: xinxin22 Date: Fri, 28 Oct 2022 20:23:19 +0800 Subject: [PATCH 14/34] =?UTF-8?q?list=20geo=E5=AE=8C=E6=88=90=20todo:longs?= =?UTF-8?q?et?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- nohup.out | 395 ++++++++++++++++++++++++++++++++++++++++++ tests_ci/Cargo.toml | 1 + tests_ci/src/redis.rs | 179 +++++++++++++++++-- 3 files changed, 563 insertions(+), 12 deletions(-) create mode 100644 nohup.out diff --git a/nohup.out b/nohup.out new file mode 100644 index 000000000..e6d9965f4 --- /dev/null +++ b/nohup.out @@ -0,0 +1,395 @@ + Compiling foreign-types-shared v0.1.1 + Compiling openssl-sys v0.9.77 + Compiling context v0.1.0 (/Users/xinxin22/breeze2/context) + Compiling foreign-types v0.3.2 + Compiling openssl v0.10.42 + Compiling metrics v0.1.0 (/Users/xinxin22/breeze2/metrics) + Compiling discovery v0.1.0 (/Users/xinxin22/breeze2/discovery) + Compiling sharding v0.1.0 (/Users/xinxin22/breeze2/sharding) + Compiling memcache v0.16.0 + Compiling protocol v0.1.0 (/Users/xinxin22/breeze2/protocol) + Compiling api v0.1.0 (/Users/xinxin22/breeze2/api) + Compiling rt v0.1.0 (/Users/xinxin22/breeze2/rt) + Compiling stream v0.1.0 (/Users/xinxin22/breeze2/stream) + Compiling endpoint v0.1.0 (/Users/xinxin22/breeze2/endpoint) + Compiling agent v0.0.1 (/Users/xinxin22/breeze2/agent) + Finished dev [unoptimized + debuginfo] target(s) in 11.06s + Running `target/debug/agent --discovery 'vintage://10.182.27.228:8080' --snapshot /Users/xinxin22/Sites/breeze/snapshot --service-path /Users/xinxin22/Sites/breeze/socks --log-dir /Users/xinxin22/Sites/breeze/logs --upgrade --port 9984 --log-level info` + Compiling context v0.1.0 (/Users/xinxin22/breeze2/context) + Compiling metrics v0.1.0 (/Users/xinxin22/breeze2/metrics) + Compiling discovery v0.1.0 (/Users/xinxin22/breeze2/discovery) + Compiling api v0.1.0 (/Users/xinxin22/breeze2/api) + Compiling sharding v0.1.0 (/Users/xinxin22/breeze2/sharding) + Compiling protocol v0.1.0 (/Users/xinxin22/breeze2/protocol) + Compiling rt v0.1.0 (/Users/xinxin22/breeze2/rt) + Compiling stream v0.1.0 (/Users/xinxin22/breeze2/stream) + Compiling endpoint v0.1.0 (/Users/xinxin22/breeze2/endpoint) + Compiling agent v0.0.1 (/Users/xinxin22/breeze2/agent) + Finished dev [unoptimized + debuginfo] target(s) in 6.99s + Running `target/debug/agent --discovery 'vintage://10.182.27.228:8080' --snapshot /Users/xinxin22/Sites/breeze/snapshot --service-path /Users/xinxin22/Sites/breeze/socks --log-dir /Users/xinxin22/Sites/breeze/logs --upgrade --port 9984 --log-level info` + Finished dev [unoptimized + debuginfo] target(s) in 0.29s + Running `target/debug/agent --discovery 'vintage://10.182.27.228:8080' --snapshot /Users/xinxin22/Sites/breeze/snapshot --service-path /Users/xinxin22/Sites/breeze/socks --log-dir /Users/xinxin22/Sites/breeze/logs --upgrade --port 9984 --log-level info` + Finished dev [unoptimized + debuginfo] target(s) in 0.29s + Running `target/debug/agent --discovery 'vintage://10.182.27.228:8080' --snapshot /Users/xinxin22/Sites/breeze/snapshot --service-path /Users/xinxin22/Sites/breeze/socks --log-dir /Users/xinxin22/Sites/breeze/logs --upgrade --port 9984 --log-level info` + Finished dev [unoptimized + debuginfo] target(s) in 0.40s + Running `target/debug/agent --discovery 'vintage://10.182.27.228:8080' --snapshot /Users/xinxin22/Sites/breeze/snapshot --service-path /Users/xinxin22/Sites/breeze/socks --log-dir /Users/xinxin22/Sites/breeze/logs --upgrade --port 9984 --log-level info` + Finished dev [unoptimized + debuginfo] target(s) in 0.42s + Running `target/debug/agent --discovery 'vintage://10.182.27.228:8080' --snapshot /Users/xinxin22/Sites/breeze/snapshot --service-path /Users/xinxin22/Sites/breeze/socks --log-dir /Users/xinxin22/Sites/breeze/logs --upgrade --port 9984 --log-level info` + Finished dev [unoptimized + debuginfo] target(s) in 0.29s + Running `target/debug/agent --discovery 'vintage://10.182.27.228:8080' --snapshot /Users/xinxin22/Sites/breeze/snapshot --service-path /Users/xinxin22/Sites/breeze/socks --log-dir /Users/xinxin22/Sites/breeze/logs --upgrade --port 9984 --log-level info` + Finished dev [unoptimized + debuginfo] target(s) in 0.42s + Running `target/debug/agent --discovery 'vintage://10.182.27.228:8080' --snapshot /Users/xinxin22/Sites/breeze/snapshot --service-path /Users/xinxin22/Sites/breeze/socks --log-dir /Users/xinxin22/Sites/breeze/logs --upgrade --port 9984 --log-level info` + Finished dev [unoptimized + debuginfo] target(s) in 0.30s + Running `target/debug/agent --discovery 'vintage://10.182.27.228:8080' --snapshot /Users/xinxin22/Sites/breeze/snapshot --service-path /Users/xinxin22/Sites/breeze/socks --log-dir /Users/xinxin22/Sites/breeze/logs --upgrade --port 9984 --log-level info` + Finished dev [unoptimized + debuginfo] target(s) in 0.37s + Running `target/debug/agent --discovery 'vintage://10.182.27.228:8080' --snapshot /Users/xinxin22/Sites/breeze/snapshot --service-path /Users/xinxin22/Sites/breeze/socks --log-dir /Users/xinxin22/Sites/breeze/logs --upgrade --port 9984 --log-level info` + Finished dev [unoptimized + debuginfo] target(s) in 0.94s + Running `target/debug/agent --discovery 'vintage://10.182.27.228:8080' --snapshot /Users/xinxin22/Sites/breeze/snapshot --service-path /Users/xinxin22/Sites/breeze/socks --log-dir /Users/xinxin22/Sites/breeze/logs --upgrade --port 9984 --log-level info` + Finished dev [unoptimized + debuginfo] target(s) in 0.29s + Running `target/debug/agent --discovery 'vintage://10.182.27.228:8080' --snapshot /Users/xinxin22/Sites/breeze/snapshot --service-path /Users/xinxin22/Sites/breeze/socks --log-dir /Users/xinxin22/Sites/breeze/logs --upgrade --port 9984 --log-level info` + Finished dev [unoptimized + debuginfo] target(s) in 0.32s + Running `target/debug/agent --discovery 'vintage://10.182.27.228:8080' --snapshot /Users/xinxin22/Sites/breeze/snapshot --service-path /Users/xinxin22/Sites/breeze/socks --log-dir /Users/xinxin22/Sites/breeze/logs --upgrade --port 9984 --log-level info` + Finished dev [unoptimized + debuginfo] target(s) in 0.17s + Running `target/debug/agent --discovery 'vintage://10.182.27.228:8080' --snapshot /Users/xinxin22/Sites/breeze/snapshot --service-path /Users/xinxin22/Sites/breeze/socks --log-dir /Users/xinxin22/Sites/breeze/logs --upgrade --port 9984 --log-level info` +mesh panic /Users/xinxin22/breeze2/protocol/src/redis/packet.rs:103: assertion failed: `(left != right)` + left: `0`, + right: `0`: packet:(packet => len:18 bulk num: 0 op_code:1746 oft:(0 => 18)) first:true data:ptr:3007325648896 start:163 end:181 cap:1024 => "*1\r\n$8\r\nlsgetall\r\n" +panic backtrace: 0: backtrace::backtrace::libunwind::trace + at /Users/xinxin22/.cargo/registry/src/mirrors.ustc.edu.cn-61ef6e0cd06fb9b8/backtrace-0.3.63/src/backtrace/libunwind.rs:93:5 + backtrace::backtrace::trace_unsynchronized + at /Users/xinxin22/.cargo/registry/src/mirrors.ustc.edu.cn-61ef6e0cd06fb9b8/backtrace-0.3.63/src/backtrace/mod.rs:66:5 + 1: backtrace::backtrace::trace + at /Users/xinxin22/.cargo/registry/src/mirrors.ustc.edu.cn-61ef6e0cd06fb9b8/backtrace-0.3.63/src/backtrace/mod.rs:53:14 + 2: backtrace::capture::Backtrace::create + at /Users/xinxin22/.cargo/registry/src/mirrors.ustc.edu.cn-61ef6e0cd06fb9b8/backtrace-0.3.63/src/capture.rs:176:9 + 3: backtrace::capture::Backtrace::new + at /Users/xinxin22/.cargo/registry/src/mirrors.ustc.edu.cn-61ef6e0cd06fb9b8/backtrace-0.3.63/src/capture.rs:140:22 + 4: agent::init::init_panic_hook::{{closure}} + at agent/src/init.rs:44:56 + 5: std::panicking::rust_panic_with_hook + at /rustc/a55dd71d5fb0ec5a6a3a9e8c27b2127ba491ce52/library/std/src/panicking.rs:702:17 + 6: std::panicking::begin_panic_handler::{{closure}} + at /rustc/a55dd71d5fb0ec5a6a3a9e8c27b2127ba491ce52/library/std/src/panicking.rs:588:13 + 7: std::sys_common::backtrace::__rust_end_short_backtrace + at /rustc/a55dd71d5fb0ec5a6a3a9e8c27b2127ba491ce52/library/std/src/sys_common/backtrace.rs:138:18 + 8: rust_begin_unwind + at /rustc/a55dd71d5fb0ec5a6a3a9e8c27b2127ba491ce52/library/std/src/panicking.rs:584:5 + 9: core::panicking::panic_fmt + at /rustc/a55dd71d5fb0ec5a6a3a9e8c27b2127ba491ce52/library/core/src/panicking.rs:142:14 + 10: core::panicking::assert_failed_inner + 11: core::panicking::assert_failed + at /rustc/a55dd71d5fb0ec5a6a3a9e8c27b2127ba491ce52/library/core/src/panicking.rs:181:5 + 12: protocol::redis::packet::RequestPacket::parse_key + at protocol/src/redis/packet.rs:103:9 + 13: protocol::redis::Redis::parse_request_inner + at protocol/src/redis/mod.rs:104:31 + 14: ::parse_request + at protocol/src/redis/mod.rs:250:15 + 15: ::parse_request + at protocol/src/parser.rs:30:1 + 16: stream::pipeline::CopyBidirectional::parse_request + at stream/src/pipeline.rs:160:9 + 17: as core::future::future::Future>::poll + at stream/src/pipeline.rs:95:13 + 18: rt::entry::Entry::poll_run + at rt/src/entry.rs:115:19 + 19: as core::future::future::Future>::poll + at rt/src/entry.rs:146:36 + 20: stream::pipeline::copy_bidirectional::{{closure}} + at stream/src/pipeline.rs:52:55 + 21: as core::future::future::Future>::poll + at /rustc/a55dd71d5fb0ec5a6a3a9e8c27b2127ba491ce52/library/core/src/future/mod.rs:91:19 + 22: agent::service::_process_one::{{closure}}::{{closure}} + at agent/src/service.rs:102:72 + 23: as core::future::future::Future>::poll + at /rustc/a55dd71d5fb0ec5a6a3a9e8c27b2127ba491ce52/library/core/src/future/mod.rs:91:19 + 24: as core::future::future::Future>::poll + at /rustc/a55dd71d5fb0ec5a6a3a9e8c27b2127ba491ce52/library/core/src/future/future.rs:124:9 + 25: tokio::runtime::task::core::CoreStage::poll::{{closure}} + at /Users/xinxin22/.cargo/registry/src/mirrors.ustc.edu.cn-61ef6e0cd06fb9b8/tokio-1.21.2/src/runtime/task/core.rs:184:17 + 26: tokio::loom::std::unsafe_cell::UnsafeCell::with_mut + at /Users/xinxin22/.cargo/registry/src/mirrors.ustc.edu.cn-61ef6e0cd06fb9b8/tokio-1.21.2/src/loom/std/unsafe_cell.rs:14:9 + 27: tokio::runtime::task::core::CoreStage::poll + at /Users/xinxin22/.cargo/registry/src/mirrors.ustc.edu.cn-61ef6e0cd06fb9b8/tokio-1.21.2/src/runtime/task/core.rs:174:13 + 28: tokio::runtime::task::harness::poll_future::{{closure}} + at /Users/xinxin22/.cargo/registry/src/mirrors.ustc.edu.cn-61ef6e0cd06fb9b8/tokio-1.21.2/src/runtime/task/harness.rs:480:19 + 29: as core::ops::function::FnOnce<()>>::call_once + at /rustc/a55dd71d5fb0ec5a6a3a9e8c27b2127ba491ce52/library/core/src/panic/unwind_safe.rs:271:9 + 30: std::panicking::try::do_call + at /rustc/a55dd71d5fb0ec5a6a3a9e8c27b2127ba491ce52/library/std/src/panicking.rs:492:40 + 31: ___rust_try + 32: std::panicking::try + at /rustc/a55dd71d5fb0ec5a6a3a9e8c27b2127ba491ce52/library/std/src/panicking.rs:456:19 + 33: std::panic::catch_unwind + at /rustc/a55dd71d5fb0ec5a6a3a9e8c27b2127ba491ce52/library/std/src/panic.rs:137:14 + 34: tokio::runtime::task::harness::poll_future + at /Users/xinxin22/.cargo/registry/src/mirrors.ustc.edu.cn-61ef6e0cd06fb9b8/tokio-1.21.2/src/runtime/task/harness.rs:468:18 + 35: tokio::runtime::task::harness::Harness::poll_inner + at /Users/xinxin22/.cargo/registry/src/mirrors.ustc.edu.cn-61ef6e0cd06fb9b8/tokio-1.21.2/src/runtime/task/harness.rs:104:27 + 36: tokio::runtime::task::harness::Harness::poll + at /Users/xinxin22/.cargo/registry/src/mirrors.ustc.edu.cn-61ef6e0cd06fb9b8/tokio-1.21.2/src/runtime/task/harness.rs:57:15 + 37: tokio::runtime::task::raw::poll + at /Users/xinxin22/.cargo/registry/src/mirrors.ustc.edu.cn-61ef6e0cd06fb9b8/tokio-1.21.2/src/runtime/task/raw.rs:194:5 + 38: tokio::runtime::task::raw::RawTask::poll + at /Users/xinxin22/.cargo/registry/src/mirrors.ustc.edu.cn-61ef6e0cd06fb9b8/tokio-1.21.2/src/runtime/task/raw.rs:134:18 + 39: tokio::runtime::task::LocalNotified::run + at /Users/xinxin22/.cargo/registry/src/mirrors.ustc.edu.cn-61ef6e0cd06fb9b8/tokio-1.21.2/src/runtime/task/mod.rs:385:9 + 40: tokio::runtime::scheduler::multi_thread::worker::Context::run_task::{{closure}} + at /Users/xinxin22/.cargo/registry/src/mirrors.ustc.edu.cn-61ef6e0cd06fb9b8/tokio-1.21.2/src/runtime/scheduler/multi_thread/worker.rs:421:13 + 41: tokio::coop::with_budget::{{closure}} + at /Users/xinxin22/.cargo/registry/src/mirrors.ustc.edu.cn-61ef6e0cd06fb9b8/tokio-1.21.2/src/coop.rs:102:9 + 42: std::thread::local::LocalKey::try_with + at /rustc/a55dd71d5fb0ec5a6a3a9e8c27b2127ba491ce52/library/std/src/thread/local.rs:445:16 + 43: std::thread::local::LocalKey::with + at /rustc/a55dd71d5fb0ec5a6a3a9e8c27b2127ba491ce52/library/std/src/thread/local.rs:421:9 + 44: tokio::coop::with_budget + at /Users/xinxin22/.cargo/registry/src/mirrors.ustc.edu.cn-61ef6e0cd06fb9b8/tokio-1.21.2/src/coop.rs:95:5 + tokio::coop::budget + at /Users/xinxin22/.cargo/registry/src/mirrors.ustc.edu.cn-61ef6e0cd06fb9b8/tokio-1.21.2/src/coop.rs:72:5 + tokio::runtime::scheduler::multi_thread::worker::Context::run_task + at /Users/xinxin22/.cargo/registry/src/mirrors.ustc.edu.cn-61ef6e0cd06fb9b8/tokio-1.21.2/src/runtime/scheduler/multi_thread/worker.rs:420:9 + 45: tokio::runtime::scheduler::multi_thread::worker::Context::run + at /Users/xinxin22/.cargo/registry/src/mirrors.ustc.edu.cn-61ef6e0cd06fb9b8/tokio-1.21.2/src/runtime/scheduler/multi_thread/worker.rs:387:24 + 46: tokio::runtime::scheduler::multi_thread::worker::run::{{closure}} + at /Users/xinxin22/.cargo/registry/src/mirrors.ustc.edu.cn-61ef6e0cd06fb9b8/tokio-1.21.2/src/runtime/scheduler/multi_thread/worker.rs:372:17 + 47: tokio::macros::scoped_tls::ScopedKey::set + at /Users/xinxin22/.cargo/registry/src/mirrors.ustc.edu.cn-61ef6e0cd06fb9b8/tokio-1.21.2/src/macros/scoped_tls.rs:61:9 + 48: tokio::runtime::scheduler::multi_thread::worker::run + at /Users/xinxin22/.cargo/registry/src/mirrors.ustc.edu.cn-61ef6e0cd06fb9b8/tokio-1.21.2/src/runtime/scheduler/multi_thread/worker.rs:369:5 + 49: tokio::runtime::scheduler::multi_thread::worker::Launch::launch::{{closure}} + at /Users/xinxin22/.cargo/registry/src/mirrors.ustc.edu.cn-61ef6e0cd06fb9b8/tokio-1.21.2/src/runtime/scheduler/multi_thread/worker.rs:348:45 + 50: as core::future::future::Future>::poll + at /Users/xinxin22/.cargo/registry/src/mirrors.ustc.edu.cn-61ef6e0cd06fb9b8/tokio-1.21.2/src/runtime/blocking/task.rs:42:21 + 51: tokio::runtime::task::core::CoreStage::poll::{{closure}} + at /Users/xinxin22/.cargo/registry/src/mirrors.ustc.edu.cn-61ef6e0cd06fb9b8/tokio-1.21.2/src/runtime/task/core.rs:184:17 + 52: tokio::loom::std::unsafe_cell::UnsafeCell::with_mut + at /Users/xinxin22/.cargo/registry/src/mirrors.ustc.edu.cn-61ef6e0cd06fb9b8/tokio-1.21.2/src/loom/std/unsafe_cell.rs:14:9 + 53: tokio::runtime::task::core::CoreStage::poll + at /Users/xinxin22/.cargo/registry/src/mirrors.ustc.edu.cn-61ef6e0cd06fb9b8/tokio-1.21.2/src/runtime/task/core.rs:174:13 + 54: tokio::runtime::task::harness::poll_future::{{closure}} + at /Users/xinxin22/.cargo/registry/src/mirrors.ustc.edu.cn-61ef6e0cd06fb9b8/tokio-1.21.2/src/runtime/task/harness.rs:480:19 + 55: as core::ops::function::FnOnce<()>>::call_once + at /rustc/a55dd71d5fb0ec5a6a3a9e8c27b2127ba491ce52/library/core/src/panic/unwind_safe.rs:271:9 + 56: std::panicking::try::do_call + at /rustc/a55dd71d5fb0ec5a6a3a9e8c27b2127ba491ce52/library/std/src/panicking.rs:492:40 + 57: ___rust_try + 58: std::panicking::try + at /rustc/a55dd71d5fb0ec5a6a3a9e8c27b2127ba491ce52/library/std/src/panicking.rs:456:19 + 59: std::panic::catch_unwind + at /rustc/a55dd71d5fb0ec5a6a3a9e8c27b2127ba491ce52/library/std/src/panic.rs:137:14 + 60: tokio::runtime::task::harness::poll_future + at /Users/xinxin22/.cargo/registry/src/mirrors.ustc.edu.cn-61ef6e0cd06fb9b8/tokio-1.21.2/src/runtime/task/harness.rs:468:18 + 61: tokio::runtime::task::harness::Harness::poll_inner + at /Users/xinxin22/.cargo/registry/src/mirrors.ustc.edu.cn-61ef6e0cd06fb9b8/tokio-1.21.2/src/runtime/task/harness.rs:104:27 + 62: tokio::runtime::task::harness::Harness::poll + at /Users/xinxin22/.cargo/registry/src/mirrors.ustc.edu.cn-61ef6e0cd06fb9b8/tokio-1.21.2/src/runtime/task/harness.rs:57:15 + 63: tokio::runtime::task::raw::poll + at /Users/xinxin22/.cargo/registry/src/mirrors.ustc.edu.cn-61ef6e0cd06fb9b8/tokio-1.21.2/src/runtime/task/raw.rs:194:5 + 64: tokio::runtime::task::raw::RawTask::poll + at /Users/xinxin22/.cargo/registry/src/mirrors.ustc.edu.cn-61ef6e0cd06fb9b8/tokio-1.21.2/src/runtime/task/raw.rs:134:18 + 65: tokio::runtime::task::UnownedTask::run + at /Users/xinxin22/.cargo/registry/src/mirrors.ustc.edu.cn-61ef6e0cd06fb9b8/tokio-1.21.2/src/runtime/task/mod.rs:422:9 + 66: tokio::runtime::blocking::pool::Task::run + at /Users/xinxin22/.cargo/registry/src/mirrors.ustc.edu.cn-61ef6e0cd06fb9b8/tokio-1.21.2/src/runtime/blocking/pool.rs:111:9 + 67: tokio::runtime::blocking::pool::Inner::run + at /Users/xinxin22/.cargo/registry/src/mirrors.ustc.edu.cn-61ef6e0cd06fb9b8/tokio-1.21.2/src/runtime/blocking/pool.rs:346:17 + 68: tokio::runtime::blocking::pool::Spawner::spawn_thread::{{closure}} + at /Users/xinxin22/.cargo/registry/src/mirrors.ustc.edu.cn-61ef6e0cd06fb9b8/tokio-1.21.2/src/runtime/blocking/pool.rs:321:13 + 69: std::sys_common::backtrace::__rust_begin_short_backtrace + at /rustc/a55dd71d5fb0ec5a6a3a9e8c27b2127ba491ce52/library/std/src/sys_common/backtrace.rs:122:18 + 70: std::thread::Builder::spawn_unchecked_::{{closure}}::{{closure}} + at /rustc/a55dd71d5fb0ec5a6a3a9e8c27b2127ba491ce52/library/std/src/thread/mod.rs:505:17 + 71: as core::ops::function::FnOnce<()>>::call_once + at /rustc/a55dd71d5fb0ec5a6a3a9e8c27b2127ba491ce52/library/core/src/panic/unwind_safe.rs:271:9 + 72: std::panicking::try::do_call + at /rustc/a55dd71d5fb0ec5a6a3a9e8c27b2127ba491ce52/library/std/src/panicking.rs:492:40 + 73: ___rust_try + 74: std::panicking::try + at /rustc/a55dd71d5fb0ec5a6a3a9e8c27b2127ba491ce52/library/std/src/panicking.rs:456:19 + 75: std::panic::catch_unwind + at /rustc/a55dd71d5fb0ec5a6a3a9e8c27b2127ba491ce52/library/std/src/panic.rs:137:14 + 76: std::thread::Builder::spawn_unchecked_::{{closure}} + at /rustc/a55dd71d5fb0ec5a6a3a9e8c27b2127ba491ce52/library/std/src/thread/mod.rs:504:30 + 77: core::ops::function::FnOnce::call_once{{vtable.shim}} + at /rustc/a55dd71d5fb0ec5a6a3a9e8c27b2127ba491ce52/library/core/src/ops/function.rs:248:5 + 78: as core::ops::function::FnOnce>::call_once + at /rustc/a55dd71d5fb0ec5a6a3a9e8c27b2127ba491ce52/library/alloc/src/boxed.rs:1935:9 + as core::ops::function::FnOnce>::call_once + at /rustc/a55dd71d5fb0ec5a6a3a9e8c27b2127ba491ce52/library/alloc/src/boxed.rs:1935:9 + std::sys::unix::thread::Thread::new::thread_start + at /rustc/a55dd71d5fb0ec5a6a3a9e8c27b2127ba491ce52/library/std/src/sys/unix/thread.rs:108:17 + 79: __pthread_deallocate + +mesh panic /Users/xinxin22/breeze2/protocol/src/redis/packet.rs:103: assertion failed: `(left != right)` + left: `0`, + right: `0`: packet:(packet => len:18 bulk num: 0 op_code:1746 oft:(0 => 18)) first:true data:ptr:3007312881664 start:0 end:18 cap:1024 => "*1\r\n$8\r\nlsgetall\r\n" +panic backtrace: 0: backtrace::backtrace::libunwind::trace + at /Users/xinxin22/.cargo/registry/src/mirrors.ustc.edu.cn-61ef6e0cd06fb9b8/backtrace-0.3.63/src/backtrace/libunwind.rs:93:5 + backtrace::backtrace::trace_unsynchronized + at /Users/xinxin22/.cargo/registry/src/mirrors.ustc.edu.cn-61ef6e0cd06fb9b8/backtrace-0.3.63/src/backtrace/mod.rs:66:5 + 1: backtrace::backtrace::trace + at /Users/xinxin22/.cargo/registry/src/mirrors.ustc.edu.cn-61ef6e0cd06fb9b8/backtrace-0.3.63/src/backtrace/mod.rs:53:14 + 2: backtrace::capture::Backtrace::create + at /Users/xinxin22/.cargo/registry/src/mirrors.ustc.edu.cn-61ef6e0cd06fb9b8/backtrace-0.3.63/src/capture.rs:176:9 + 3: backtrace::capture::Backtrace::new + at /Users/xinxin22/.cargo/registry/src/mirrors.ustc.edu.cn-61ef6e0cd06fb9b8/backtrace-0.3.63/src/capture.rs:140:22 + 4: agent::init::init_panic_hook::{{closure}} + at agent/src/init.rs:44:56 + 5: std::panicking::rust_panic_with_hook + at /rustc/a55dd71d5fb0ec5a6a3a9e8c27b2127ba491ce52/library/std/src/panicking.rs:702:17 + 6: std::panicking::begin_panic_handler::{{closure}} + at /rustc/a55dd71d5fb0ec5a6a3a9e8c27b2127ba491ce52/library/std/src/panicking.rs:588:13 + 7: std::sys_common::backtrace::__rust_end_short_backtrace + at /rustc/a55dd71d5fb0ec5a6a3a9e8c27b2127ba491ce52/library/std/src/sys_common/backtrace.rs:138:18 + 8: rust_begin_unwind + at /rustc/a55dd71d5fb0ec5a6a3a9e8c27b2127ba491ce52/library/std/src/panicking.rs:584:5 + 9: core::panicking::panic_fmt + at /rustc/a55dd71d5fb0ec5a6a3a9e8c27b2127ba491ce52/library/core/src/panicking.rs:142:14 + 10: core::panicking::assert_failed_inner + 11: core::panicking::assert_failed + at /rustc/a55dd71d5fb0ec5a6a3a9e8c27b2127ba491ce52/library/core/src/panicking.rs:181:5 + 12: protocol::redis::packet::RequestPacket::parse_key + at protocol/src/redis/packet.rs:103:9 + 13: protocol::redis::Redis::parse_request_inner + at protocol/src/redis/mod.rs:104:31 + 14: ::parse_request + at protocol/src/redis/mod.rs:250:15 + 15: ::parse_request + at protocol/src/parser.rs:30:1 + 16: stream::pipeline::CopyBidirectional::parse_request + at stream/src/pipeline.rs:160:9 + 17: as core::future::future::Future>::poll + at stream/src/pipeline.rs:95:13 + 18: rt::entry::Entry::poll_run + at rt/src/entry.rs:115:19 + 19: as core::future::future::Future>::poll + at rt/src/entry.rs:146:36 + 20: stream::pipeline::copy_bidirectional::{{closure}} + at stream/src/pipeline.rs:52:55 + 21: as core::future::future::Future>::poll + at /rustc/a55dd71d5fb0ec5a6a3a9e8c27b2127ba491ce52/library/core/src/future/mod.rs:91:19 + 22: agent::service::_process_one::{{closure}}::{{closure}} + at agent/src/service.rs:102:72 + 23: as core::future::future::Future>::poll + at /rustc/a55dd71d5fb0ec5a6a3a9e8c27b2127ba491ce52/library/core/src/future/mod.rs:91:19 + 24: as core::future::future::Future>::poll + at /rustc/a55dd71d5fb0ec5a6a3a9e8c27b2127ba491ce52/library/core/src/future/future.rs:124:9 + 25: tokio::runtime::task::core::CoreStage::poll::{{closure}} + at /Users/xinxin22/.cargo/registry/src/mirrors.ustc.edu.cn-61ef6e0cd06fb9b8/tokio-1.21.2/src/runtime/task/core.rs:184:17 + 26: tokio::loom::std::unsafe_cell::UnsafeCell::with_mut + at /Users/xinxin22/.cargo/registry/src/mirrors.ustc.edu.cn-61ef6e0cd06fb9b8/tokio-1.21.2/src/loom/std/unsafe_cell.rs:14:9 + 27: tokio::runtime::task::core::CoreStage::poll + at /Users/xinxin22/.cargo/registry/src/mirrors.ustc.edu.cn-61ef6e0cd06fb9b8/tokio-1.21.2/src/runtime/task/core.rs:174:13 + 28: tokio::runtime::task::harness::poll_future::{{closure}} + at /Users/xinxin22/.cargo/registry/src/mirrors.ustc.edu.cn-61ef6e0cd06fb9b8/tokio-1.21.2/src/runtime/task/harness.rs:480:19 + 29: as core::ops::function::FnOnce<()>>::call_once + at /rustc/a55dd71d5fb0ec5a6a3a9e8c27b2127ba491ce52/library/core/src/panic/unwind_safe.rs:271:9 + 30: std::panicking::try::do_call + at /rustc/a55dd71d5fb0ec5a6a3a9e8c27b2127ba491ce52/library/std/src/panicking.rs:492:40 + 31: ___rust_try + 32: std::panicking::try + at /rustc/a55dd71d5fb0ec5a6a3a9e8c27b2127ba491ce52/library/std/src/panicking.rs:456:19 + 33: std::panic::catch_unwind + at /rustc/a55dd71d5fb0ec5a6a3a9e8c27b2127ba491ce52/library/std/src/panic.rs:137:14 + 34: tokio::runtime::task::harness::poll_future + at /Users/xinxin22/.cargo/registry/src/mirrors.ustc.edu.cn-61ef6e0cd06fb9b8/tokio-1.21.2/src/runtime/task/harness.rs:468:18 + 35: tokio::runtime::task::harness::Harness::poll_inner + at /Users/xinxin22/.cargo/registry/src/mirrors.ustc.edu.cn-61ef6e0cd06fb9b8/tokio-1.21.2/src/runtime/task/harness.rs:104:27 + 36: tokio::runtime::task::harness::Harness::poll + at /Users/xinxin22/.cargo/registry/src/mirrors.ustc.edu.cn-61ef6e0cd06fb9b8/tokio-1.21.2/src/runtime/task/harness.rs:57:15 + 37: tokio::runtime::task::raw::poll + at /Users/xinxin22/.cargo/registry/src/mirrors.ustc.edu.cn-61ef6e0cd06fb9b8/tokio-1.21.2/src/runtime/task/raw.rs:194:5 + 38: tokio::runtime::task::raw::RawTask::poll + at /Users/xinxin22/.cargo/registry/src/mirrors.ustc.edu.cn-61ef6e0cd06fb9b8/tokio-1.21.2/src/runtime/task/raw.rs:134:18 + 39: tokio::runtime::task::LocalNotified::run + at /Users/xinxin22/.cargo/registry/src/mirrors.ustc.edu.cn-61ef6e0cd06fb9b8/tokio-1.21.2/src/runtime/task/mod.rs:385:9 + 40: tokio::runtime::scheduler::multi_thread::worker::Context::run_task::{{closure}} + at /Users/xinxin22/.cargo/registry/src/mirrors.ustc.edu.cn-61ef6e0cd06fb9b8/tokio-1.21.2/src/runtime/scheduler/multi_thread/worker.rs:421:13 + 41: tokio::coop::with_budget::{{closure}} + at /Users/xinxin22/.cargo/registry/src/mirrors.ustc.edu.cn-61ef6e0cd06fb9b8/tokio-1.21.2/src/coop.rs:102:9 + 42: std::thread::local::LocalKey::try_with + at /rustc/a55dd71d5fb0ec5a6a3a9e8c27b2127ba491ce52/library/std/src/thread/local.rs:445:16 + 43: std::thread::local::LocalKey::with + at /rustc/a55dd71d5fb0ec5a6a3a9e8c27b2127ba491ce52/library/std/src/thread/local.rs:421:9 + 44: tokio::coop::with_budget + at /Users/xinxin22/.cargo/registry/src/mirrors.ustc.edu.cn-61ef6e0cd06fb9b8/tokio-1.21.2/src/coop.rs:95:5 + tokio::coop::budget + at /Users/xinxin22/.cargo/registry/src/mirrors.ustc.edu.cn-61ef6e0cd06fb9b8/tokio-1.21.2/src/coop.rs:72:5 + tokio::runtime::scheduler::multi_thread::worker::Context::run_task + at /Users/xinxin22/.cargo/registry/src/mirrors.ustc.edu.cn-61ef6e0cd06fb9b8/tokio-1.21.2/src/runtime/scheduler/multi_thread/worker.rs:420:9 + 45: tokio::runtime::scheduler::multi_thread::worker::Context::run + at /Users/xinxin22/.cargo/registry/src/mirrors.ustc.edu.cn-61ef6e0cd06fb9b8/tokio-1.21.2/src/runtime/scheduler/multi_thread/worker.rs:387:24 + 46: tokio::runtime::scheduler::multi_thread::worker::run::{{closure}} + at /Users/xinxin22/.cargo/registry/src/mirrors.ustc.edu.cn-61ef6e0cd06fb9b8/tokio-1.21.2/src/runtime/scheduler/multi_thread/worker.rs:372:17 + 47: tokio::macros::scoped_tls::ScopedKey::set + at /Users/xinxin22/.cargo/registry/src/mirrors.ustc.edu.cn-61ef6e0cd06fb9b8/tokio-1.21.2/src/macros/scoped_tls.rs:61:9 + 48: tokio::runtime::scheduler::multi_thread::worker::run + at /Users/xinxin22/.cargo/registry/src/mirrors.ustc.edu.cn-61ef6e0cd06fb9b8/tokio-1.21.2/src/runtime/scheduler/multi_thread/worker.rs:369:5 + 49: tokio::runtime::scheduler::multi_thread::worker::Launch::launch::{{closure}} + at /Users/xinxin22/.cargo/registry/src/mirrors.ustc.edu.cn-61ef6e0cd06fb9b8/tokio-1.21.2/src/runtime/scheduler/multi_thread/worker.rs:348:45 + 50: as core::future::future::Future>::poll + at /Users/xinxin22/.cargo/registry/src/mirrors.ustc.edu.cn-61ef6e0cd06fb9b8/tokio-1.21.2/src/runtime/blocking/task.rs:42:21 + 51: tokio::runtime::task::core::CoreStage::poll::{{closure}} + at /Users/xinxin22/.cargo/registry/src/mirrors.ustc.edu.cn-61ef6e0cd06fb9b8/tokio-1.21.2/src/runtime/task/core.rs:184:17 + 52: tokio::loom::std::unsafe_cell::UnsafeCell::with_mut + at /Users/xinxin22/.cargo/registry/src/mirrors.ustc.edu.cn-61ef6e0cd06fb9b8/tokio-1.21.2/src/loom/std/unsafe_cell.rs:14:9 + 53: tokio::runtime::task::core::CoreStage::poll + at /Users/xinxin22/.cargo/registry/src/mirrors.ustc.edu.cn-61ef6e0cd06fb9b8/tokio-1.21.2/src/runtime/task/core.rs:174:13 + 54: tokio::runtime::task::harness::poll_future::{{closure}} + at /Users/xinxin22/.cargo/registry/src/mirrors.ustc.edu.cn-61ef6e0cd06fb9b8/tokio-1.21.2/src/runtime/task/harness.rs:480:19 + 55: as core::ops::function::FnOnce<()>>::call_once + at /rustc/a55dd71d5fb0ec5a6a3a9e8c27b2127ba491ce52/library/core/src/panic/unwind_safe.rs:271:9 + 56: std::panicking::try::do_call + at /rustc/a55dd71d5fb0ec5a6a3a9e8c27b2127ba491ce52/library/std/src/panicking.rs:492:40 + 57: ___rust_try + 58: std::panicking::try + at /rustc/a55dd71d5fb0ec5a6a3a9e8c27b2127ba491ce52/library/std/src/panicking.rs:456:19 + 59: std::panic::catch_unwind + at /rustc/a55dd71d5fb0ec5a6a3a9e8c27b2127ba491ce52/library/std/src/panic.rs:137:14 + 60: tokio::runtime::task::harness::poll_future + at /Users/xinxin22/.cargo/registry/src/mirrors.ustc.edu.cn-61ef6e0cd06fb9b8/tokio-1.21.2/src/runtime/task/harness.rs:468:18 + 61: tokio::runtime::task::harness::Harness::poll_inner + at /Users/xinxin22/.cargo/registry/src/mirrors.ustc.edu.cn-61ef6e0cd06fb9b8/tokio-1.21.2/src/runtime/task/harness.rs:104:27 + 62: tokio::runtime::task::harness::Harness::poll + at /Users/xinxin22/.cargo/registry/src/mirrors.ustc.edu.cn-61ef6e0cd06fb9b8/tokio-1.21.2/src/runtime/task/harness.rs:57:15 + 63: tokio::runtime::task::raw::poll + at /Users/xinxin22/.cargo/registry/src/mirrors.ustc.edu.cn-61ef6e0cd06fb9b8/tokio-1.21.2/src/runtime/task/raw.rs:194:5 + 64: tokio::runtime::task::raw::RawTask::poll + at /Users/xinxin22/.cargo/registry/src/mirrors.ustc.edu.cn-61ef6e0cd06fb9b8/tokio-1.21.2/src/runtime/task/raw.rs:134:18 + 65: tokio::runtime::task::UnownedTask::run + at /Users/xinxin22/.cargo/registry/src/mirrors.ustc.edu.cn-61ef6e0cd06fb9b8/tokio-1.21.2/src/runtime/task/mod.rs:422:9 + 66: tokio::runtime::blocking::pool::Task::run + at /Users/xinxin22/.cargo/registry/src/mirrors.ustc.edu.cn-61ef6e0cd06fb9b8/tokio-1.21.2/src/runtime/blocking/pool.rs:111:9 + 67: tokio::runtime::blocking::pool::Inner::run + at /Users/xinxin22/.cargo/registry/src/mirrors.ustc.edu.cn-61ef6e0cd06fb9b8/tokio-1.21.2/src/runtime/blocking/pool.rs:346:17 + 68: tokio::runtime::blocking::pool::Spawner::spawn_thread::{{closure}} + at /Users/xinxin22/.cargo/registry/src/mirrors.ustc.edu.cn-61ef6e0cd06fb9b8/tokio-1.21.2/src/runtime/blocking/pool.rs:321:13 + 69: std::sys_common::backtrace::__rust_begin_short_backtrace + at /rustc/a55dd71d5fb0ec5a6a3a9e8c27b2127ba491ce52/library/std/src/sys_common/backtrace.rs:122:18 + 70: std::thread::Builder::spawn_unchecked_::{{closure}}::{{closure}} + at /rustc/a55dd71d5fb0ec5a6a3a9e8c27b2127ba491ce52/library/std/src/thread/mod.rs:505:17 + 71: as core::ops::function::FnOnce<()>>::call_once + at /rustc/a55dd71d5fb0ec5a6a3a9e8c27b2127ba491ce52/library/core/src/panic/unwind_safe.rs:271:9 + 72: std::panicking::try::do_call + at /rustc/a55dd71d5fb0ec5a6a3a9e8c27b2127ba491ce52/library/std/src/panicking.rs:492:40 + 73: ___rust_try + 74: std::panicking::try + at /rustc/a55dd71d5fb0ec5a6a3a9e8c27b2127ba491ce52/library/std/src/panicking.rs:456:19 + 75: std::panic::catch_unwind + at /rustc/a55dd71d5fb0ec5a6a3a9e8c27b2127ba491ce52/library/std/src/panic.rs:137:14 + 76: std::thread::Builder::spawn_unchecked_::{{closure}} + at /rustc/a55dd71d5fb0ec5a6a3a9e8c27b2127ba491ce52/library/std/src/thread/mod.rs:504:30 + 77: core::ops::function::FnOnce::call_once{{vtable.shim}} + at /rustc/a55dd71d5fb0ec5a6a3a9e8c27b2127ba491ce52/library/core/src/ops/function.rs:248:5 + 78: as core::ops::function::FnOnce>::call_once + at /rustc/a55dd71d5fb0ec5a6a3a9e8c27b2127ba491ce52/library/alloc/src/boxed.rs:1935:9 + as core::ops::function::FnOnce>::call_once + at /rustc/a55dd71d5fb0ec5a6a3a9e8c27b2127ba491ce52/library/alloc/src/boxed.rs:1935:9 + std::sys::unix::thread::Thread::new::thread_start + at /rustc/a55dd71d5fb0ec5a6a3a9e8c27b2127ba491ce52/library/std/src/sys/unix/thread.rs:108:17 + 79: __pthread_deallocate + + Finished dev [unoptimized + debuginfo] target(s) in 0.36s + Running `target/debug/agent --discovery 'vintage://10.182.27.228:8080' --snapshot /Users/xinxin22/Sites/breeze/snapshot --service-path /Users/xinxin22/Sites/breeze/socks --log-dir /Users/xinxin22/Sites/breeze/logs --upgrade --port 9984 --log-level info` + Finished dev [unoptimized + debuginfo] target(s) in 0.34s + Running `target/debug/agent --discovery 'vintage://10.182.27.228:8080' --snapshot /Users/xinxin22/Sites/breeze/snapshot --service-path /Users/xinxin22/Sites/breeze/socks --log-dir /Users/xinxin22/Sites/breeze/logs --upgrade --port 9984 --log-level info` diff --git a/tests_ci/Cargo.toml b/tests_ci/Cargo.toml index 1f1d39f27..0f0554bac 100644 --- a/tests_ci/Cargo.toml +++ b/tests_ci/Cargo.toml @@ -12,6 +12,7 @@ byteorder = "1.4.3" memcache = "0.16.0" assert-panic = "1.0.1" function_name = "0.3.0" +chrono = "0.4" tokio = { version = "1.21.2", features = ["fs"] } redis = { version = "0.22.0", default-features = false, features = [] } diff --git a/tests_ci/src/redis.rs b/tests_ci/src/redis.rs index dd7e09d83..9832e5e0a 100644 --- a/tests_ci/src/redis.rs +++ b/tests_ci/src/redis.rs @@ -23,6 +23,27 @@ use crate::redis_helper::*; use ::function_name::named; use redis::Commands; use std::collections::HashMap; +use std::ffi::c_long; +use std::vec; + +//获取质数 +fn find_primes(n: usize) -> Vec { + let mut result = Vec::new(); + let mut is_prime = vec![true; n + 1]; + + for i in 2..=n { + if is_prime[i] { + result.push(i as c_long); + } + + ((i * 2)..=n).into_iter().step_by(i).for_each(|x| { + is_prime[x] = false; + }); + } + //println!("{:?}", is_prime); + result +} + //基本场景 #[test] fn test_args() { @@ -198,11 +219,25 @@ fn test_set_ops() { } ///list基本操作: -/// - rpush 8个value -/// - llen -/// - lpop +/// - lpush 插入四个 rpush插入4个 +/// - lrange 0 -1 获取所有值 +/// - lpop 弹出第一个 +/// - rpop 弹出最后一个 +/// - llen 长度 +/// - lrange +/// - lset 将指定位置替换 +/// - lindex 获取指定位置值 +/// - linsert_before 在指定值之前插入 +/// - linsert-after 之后插入 +/// - lrange +/// - lrem 移除>0 从head起一个4 +/// - lrem 移除<0 从tail 两个7 +/// - lrem 移除=0 删除所有2 +/// - lrange +/// - ltrim 保留指定区间 +/// - lpushx 头插入一个 +/// - rpushx 尾插入一个 /// - lrange -/// - lset #[named] #[test] fn test_list_ops() { @@ -210,19 +245,139 @@ fn test_list_ops() { let mut con = get_conn(&file!().get_host()); redis::cmd("DEL").arg(arykey).execute(&mut con); - assert_eq!(con.rpush(arykey, &[1, 2, 3, 4]), Ok(4)); - assert_eq!(con.rpush(arykey, &[5, 6, 7, 8]), Ok(8)); - assert_eq!(con.llen(arykey), Ok(8)); + assert_eq!(con.lpush(arykey, &[1, 2]), Ok(2)); + assert_eq!(con.lpush(arykey, &[3, 4]), Ok(4)); + assert_eq!(con.rpush(arykey, &[5, 6]), Ok(6)); + assert_eq!(con.rpush(arykey, &[7, 8]), Ok(8)); - assert_eq!(con.lpop(arykey, Default::default()), Ok(1)); - assert_eq!(con.llen(arykey), Ok(7)); + assert_eq!(con.lrange(arykey, 0, -1), Ok((4, 3, 2, 1, 5, 6, 7, 8))); - assert_eq!(con.lrange(arykey, 0, 2), Ok((2, 3, 4))); + assert_eq!(con.lpop(arykey, Default::default()), Ok(4)); + assert_eq!(con.rpop(arykey, Default::default()), Ok(8)); + assert_eq!(con.llen(arykey), Ok(6)); + assert_eq!(con.lrange(arykey, 0, -1), Ok((3, 2, 1, 5, 6, 7))); assert_eq!(con.lset(arykey, 0, 4), Ok(true)); - assert_eq!(con.lrange(arykey, 0, 2), Ok((4, 3, 4))); + assert_eq!(con.lindex(arykey, 0), Ok(4)); + + assert_eq!(con.linsert_before(arykey, 4, 4), Ok(7)); + assert_eq!(con.linsert_after(arykey, 7, 7), Ok(8)); + assert_eq!(con.lrange(arykey, 0, -1), Ok((4, 4, 2, 1, 5, 6, 7, 7))); + + assert_eq!(con.lrem(arykey, 1, 4), Ok(1)); + assert_eq!(con.lrem(arykey, -2, 7), Ok(2)); + assert_eq!(con.lrem(arykey, 0, 2), Ok(1)); + assert_eq!(con.lrange(arykey, 0, -1), Ok((4, 1, 5, 6))); + + assert_eq!(con.ltrim(arykey, 1, 2), Ok(true)); + assert_eq!(con.lpush_exists(arykey, 1), Ok(3)); + assert_eq!(con.rpush_exists(arykey, 5), Ok(4)); + assert_eq!(con.lrange(arykey, 0, -1), Ok((1, 1, 5, 5))); +} + +#[named] +#[test] +fn test_list_longset_ops() { + // let arykey = function_name!(); + let arykey = "xinxin"; + let mut con = get_conn(&file!().get_host()); + // let mut con_ori = get_conn("10.182.27.228:8080"); + // redis::cmd("LSMALLOC").arg(arykey).execute(&mut con_ori); + // redis::cmd("DEL").arg(arykey).execute(&mut con); + // redis::cmd("LSDSET") + // .arg(arykey) + // .arg(2) + // .arg(16549573) + // .execute(&mut con); + // redis::cmd("LSPUT").arg(arykey).arg(2).execute(&mut con); + // redis::cmd("LSGETALL").arg(arykey).execute(&mut con); + // redis::cmd("LSDUMP").arg(arykey).arg(2).execute(&mut con); + // redis::cmd("LSLEN").arg(arykey).execute(&mut con); + + //assert_eq!(con.lsset(arykey, 5), Ok(4)); +} + +#[named] +#[test] +fn test_geo_ops() { + let arykey = function_name!(); + let mut con = get_conn(&file!().get_host()); + redis::cmd("DEL").arg(arykey).execute(&mut con); + + assert_eq!( + redis::cmd("GEOADD") + .arg(arykey) + .arg(30) + .arg(50) + .arg("Beijing") + .arg(27) + .arg(54) + .arg("Tianjin") + .arg(12) + .arg(15) + .arg("Hebei") + .query(&mut con), + Ok(3) + ); + + assert_eq!( + redis::cmd("GEODIST") + .arg(arykey) + .arg("Beijing") + .arg("Tianjin") + .arg("km") + .query(&mut con), + Ok(489.9349) + ); + + assert_eq!( + redis::cmd("GEOPOS") + .arg(arykey) + .arg("Beijing") + .arg("Tianjin") + .query(&mut con), + Ok(( + ( + "30.00000089406967163".to_string(), + "49.99999957172130394".to_string() + ), + ( + "26.99999839067459106".to_string(), + "53.99999994301438733".to_string() + ), + )) + ); - assert_eq!(con.lrange(arykey, 0, 10), Ok(vec![4, 3, 4, 5, 6, 7, 8])); + assert_eq!( + redis::cmd("GEOHASH") + .arg(arykey) + .arg("Beijing") + .arg("Tianjin") + .query(&mut con), + Ok(("u8vk6wjr4e0".to_string(), "u9e5nqkuc90".to_string())) + ); + // operation not permitted on a read only server + // assert_eq!( + // redis::cmd("GEORADIUS") + // .arg(arykey) + // .arg(28) + // .arg(30) + // .arg(100) + // .arg("km") + // .arg("WITHDIST") + // .arg("WITHCOORD") + // .query(&mut con), + // Ok(0) + // ); + // assert_eq!( + // redis::cmd("GEORADIUSBYMEMBER") + // .arg(arykey) + // .arg("Tianjin") + // .arg(100) + // .arg("km") + // .query(&mut con), + // Ok(0) + // ); } /// 单个zset基本操作, zadd, zrangebyscore withscore From 4059b276f20cf5456273041abe37f601d9bdfbce Mon Sep 17 00:00:00 2001 From: xinxin22 Date: Mon, 31 Oct 2022 12:11:43 +0800 Subject: [PATCH 15/34] =?UTF-8?q?geo=E5=9C=B0=E7=90=86=E4=BD=8D=E7=BD=AE?= =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E6=B3=A8=E9=87=8A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- tests_ci/src/redis.rs | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 deletions(-) diff --git a/tests_ci/src/redis.rs b/tests_ci/src/redis.rs index 9832e5e0a..b13e38d73 100644 --- a/tests_ci/src/redis.rs +++ b/tests_ci/src/redis.rs @@ -23,17 +23,16 @@ use crate::redis_helper::*; use ::function_name::named; use redis::Commands; use std::collections::HashMap; -use std::ffi::c_long; use std::vec; -//获取质数 -fn find_primes(n: usize) -> Vec { +//获i64 +fn find_primes(n: usize) -> Vec { let mut result = Vec::new(); let mut is_prime = vec![true; n + 1]; for i in 2..=n { if is_prime[i] { - result.push(i as c_long); + result.push(i as i64); } ((i * 2)..=n).into_iter().step_by(i).for_each(|x| { @@ -284,10 +283,11 @@ fn test_list_longset_ops() { // let mut con_ori = get_conn("10.182.27.228:8080"); // redis::cmd("LSMALLOC").arg(arykey).execute(&mut con_ori); // redis::cmd("DEL").arg(arykey).execute(&mut con); + // println!("{:?}", find_primes(10).capacity()); // redis::cmd("LSDSET") // .arg(arykey) // .arg(2) - // .arg(16549573) + // .arg(find_primes(10)) // .execute(&mut con); // redis::cmd("LSPUT").arg(arykey).arg(2).execute(&mut con); // redis::cmd("LSGETALL").arg(arykey).execute(&mut con); @@ -297,6 +297,14 @@ fn test_list_longset_ops() { //assert_eq!(con.lsset(arykey, 5), Ok(4)); } +/// - geoadd 添加地理位置经纬度 +/// - geodist 获取km级别两个位置距离 +/// - geopos 获取地理位置的坐标 +/// - geohash:返回一个或多个位置对象的 geohash 值 +/// - georadius 根据用户给定的经纬度坐标来获取100km内的地理位置集合, +/// WITHDIST: 在返回位置元素的同时, 将位置元素与中心之间的距离也一并返回, +// WITHCOORD: 将位置元素的经度和纬度也一并返回。 +/// - georadiusbymember 根据储存在位置集合里面的地点获取范围100km的地理位置集合 #[named] #[test] fn test_geo_ops() { From 240a07eb4e9ca84d616adc4c08c1492332b1fa8b Mon Sep 17 00:00:00 2001 From: xiaowang Date: Mon, 31 Oct 2022 14:54:51 +0800 Subject: [PATCH 16/34] =?UTF-8?q?zset=20=E5=9F=BA=E6=9C=AC=E5=91=BD?= =?UTF-8?q?=E4=BB=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- tests_ci/src/redis.rs | 66 ++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 65 insertions(+), 1 deletion(-) diff --git a/tests_ci/src/redis.rs b/tests_ci/src/redis.rs index b13e38d73..4fc238006 100644 --- a/tests_ci/src/redis.rs +++ b/tests_ci/src/redis.rs @@ -399,18 +399,82 @@ fn test_zset_basic() { let values = &[ (1, "one".to_string()), (2, "two".to_string()), + (3, "three".to_string()), (4, "four".to_string()), ]; - let _: () = con.zadd_multiple(arykey, values).unwrap(); + assert_eq!(con.zadd_multiple(arykey, values),Ok(4)); assert_eq!( con.zrange_withscores(arykey, 0, -1), Ok(vec![ ("one".to_string(), 1), ("two".to_string(), 2), + ("three".to_string(), 3), ("four".to_string(), 4), ]) ); + + assert_eq!( + con.zrevrange_withscores(arykey, 0, -1), + Ok(vec![ + ("four".to_string(), 4), + ("three".to_string(), 3), + ("two".to_string(), 2), + ("one".to_string(), 1), + ]) + ); + + assert_eq!(con.zincr(arykey, "one", 4),Ok("5".to_string())); + assert_eq!(con.zrem(arykey, "four"),Ok(1)); + assert_eq!(con.zremrangebyrank(arykey, 0, 0),Ok(1)); + assert_eq!(con.zrembyscore(arykey, 1, 3),Ok(1)); + + let samescore = &[ + (0, "aaaa".to_string()), + (0, "b".to_string()), + (0, "c".to_string()), + (0, "d".to_string()), + (0, "e".to_string()), + ]; + + assert_eq!(con.zadd_multiple(arykey, samescore),Ok(5)); + assert_eq!(con.zrembylex(arykey, "[b", "(c"),Ok(1)); + assert_eq!(con.zrangebylex(arykey, "-", "(c"),Ok(vec![ + "aaaa".to_string(), + ])); + assert_eq!(con.zrevrangebylex(arykey, "(c", "-"),Ok(vec![ + "aaaa".to_string(), + ])); + assert_eq!(con.zcount(arykey, 0, 2),Ok(4)); + assert_eq!(con.zlexcount(arykey, "-", "+"),Ok(5)); + redis::cmd("DEL").arg(arykey).execute(&mut con); + assert_eq!(con.zadd_multiple(arykey, values),Ok(4)); + + + assert_eq!( + con.zrangebyscore(arykey, 0, 5), + Ok(vec![ + "one".to_string(), + "two".to_string(), + "three".to_string(), + "four".to_string(), + ]) + ); + + assert_eq!( + con.zrevrangebyscore(arykey, 5, 0), + Ok(vec![ + "four".to_string(), + "three".to_string(), + "two".to_string(), + "one".to_string(), + ]) + ); + + assert_eq!(con.zcard(arykey),Ok(4)); + assert_eq!(con.zrank(arykey, "one"),Ok(0)); + assert_eq!(con.zscore(arykey, "one"),Ok(1)); + } //github ci 过不了,本地可以过,不清楚原因 From 4d40f14786275c938790150d5d3416353ce8cf3f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=99=88=E6=B3=A2?= Date: Mon, 31 Oct 2022 15:21:27 +0800 Subject: [PATCH 17/34] =?UTF-8?q?=E6=8C=89=E5=8D=8F=E8=AE=AE=E5=88=86?= =?UTF-8?q?=E6=8B=86test?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- tests_ci/src/redis/cmd/hash.rs | 0 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 tests_ci/src/redis/cmd/hash.rs diff --git a/tests_ci/src/redis/cmd/hash.rs b/tests_ci/src/redis/cmd/hash.rs new file mode 100644 index 000000000..e69de29bb From 3e397589850716f602c6067424e349fd2b7745b7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=99=88=E6=B3=A2?= Date: Mon, 31 Oct 2022 15:24:32 +0800 Subject: [PATCH 18/34] add test sample --- tests_ci/src/redis/integration/consistency.rs | 0 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 tests_ci/src/redis/integration/consistency.rs diff --git a/tests_ci/src/redis/integration/consistency.rs b/tests_ci/src/redis/integration/consistency.rs new file mode 100644 index 000000000..e69de29bb From 8b52e9b0c853d4cec94f38d9235f816ae2cf64fe Mon Sep 17 00:00:00 2001 From: xinxin22 Date: Mon, 31 Oct 2022 15:37:02 +0800 Subject: [PATCH 19/34] hash:todo:hscan hexists --- tests_ci/src/redis.rs | 87 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 87 insertions(+) diff --git a/tests_ci/src/redis.rs b/tests_ci/src/redis.rs index b13e38d73..e0c0c094d 100644 --- a/tests_ci/src/redis.rs +++ b/tests_ci/src/redis.rs @@ -388,6 +388,93 @@ fn test_geo_ops() { // ); } +/// - hash基本操作 +/// - hmset test_hash_ops ("filed1", 1),("filed2", 2),("filed3", 3),("filed4", 4),("filed6", 6), +/// - hgetall test_hash_ops 获取该key下所有字段-值映射表 +/// - hdel 删除字段filed1 +/// - hlen 获取test_hash_ops表中字段数量 5 +/// - hkeys 获取test_hash_ops表中所有字段 +/// - hset 设置一个新字段 "filed5", 5 =》1 +/// - hset 设置一个旧字段 "filed2", 22 =》0 +/// - hmget获取字段filed2 filed5的值 +/// - hincrby filed2 4 =>26 +/// - hincrbyfloat filed5 4.4 =>8.4 +/// - hsetnx不存在的 filed6 =》1 +/// - hsetnx已经存在的 filed6 =》0 +/// - hvals 获取所有test_hash_ops表filed字段的vals +/// - hsetnx不存在的 hash表hashkey =》1 +/// - hget hash表hashkey filed6字段=》6 +#[named] +#[test] +fn test_hash_ops() { + let arykey = function_name!(); + let mut con = get_conn(&file!().get_host()); + redis::cmd("DEL").arg(arykey).execute(&mut con); + redis::cmd("DEL").arg("hashkey").execute(&mut con); + + assert_eq!( + con.hset_multiple( + arykey, + &[("filed1", 1), ("filed2", 2), ("filed3", 3), ("filed4", 4),] + ), + Ok(true) + ); + assert_eq!( + con.hgetall(arykey), + Ok(( + "filed1".to_string(), + 1.to_string(), + "filed2".to_string(), + 2.to_string(), + "filed3".to_string(), + 3.to_string(), + "filed4".to_string(), + 4.to_string(), + )) + ); + + assert_eq!(con.hdel(arykey, "filed1"), Ok(1)); + assert_eq!(con.hlen(arykey), Ok(3)); + assert_eq!( + con.hkeys(arykey), + Ok(( + "filed2".to_string(), + "filed3".to_string(), + "filed4".to_string(), + )) + ); + + assert_eq!(con.hset(arykey, "filed5", 5), Ok(1)); + assert_eq!(con.hset(arykey, "filed2", 22), Ok(0)); + assert_eq!( + con.hget(arykey, &["filed2", "filed5"]), + Ok((22.to_string(), 5.to_string())) + ); + + assert_eq!(con.hincr(arykey, "filed2", 4), Ok(26)); + assert_eq!(con.hincr(arykey, "filed5", 3.4), Ok(8.4)); + + assert_eq!(con.hset_nx(arykey, "filed6", 6), Ok(1)); + assert_eq!(con.hset_nx(arykey, "filed6", 6), Ok(0)); + assert_eq!( + con.hvals(arykey), + Ok(( + 26.to_string(), + 3.to_string(), + 4.to_string(), + 8.4.to_string(), + 6.to_string() + )) + ); + + assert_eq!(con.hset_nx("hashkey", "hashfiled6", 6), Ok(1)); + //assert_eq!(con.hget("hashkey", "filed6"), Ok(6.to_string())); + + //let _a: = con.hscan_match(arykey, "filed"); + + // assert_eq!(con.hscan(arykey, "filed"), Ok((0.to_string()))); +} + /// 单个zset基本操作, zadd, zrangebyscore withscore #[named] #[test] From 533bf23d3bf3fc11389b0f5313aea8aa0a888418 Mon Sep 17 00:00:00 2001 From: xinxin22 Date: Mon, 31 Oct 2022 19:16:32 +0800 Subject: [PATCH 20/34] hash:todo:hscan list:todo:longset stringtodo:mincr --- tests_ci/src/redis.rs | 188 ++++++++++++++++++++++++++++++++++++------ 1 file changed, 164 insertions(+), 24 deletions(-) diff --git a/tests_ci/src/redis.rs b/tests_ci/src/redis.rs index d3aa30d82..e5d831a3f 100644 --- a/tests_ci/src/redis.rs +++ b/tests_ci/src/redis.rs @@ -21,9 +21,12 @@ use crate::ci::env::*; use crate::redis_helper::*; use ::function_name::named; +use chrono::prelude::*; use redis::Commands; use std::collections::HashMap; +use std::time::Instant; use std::vec; +use std::{thread, time}; //获i64 fn find_primes(n: usize) -> Vec { @@ -399,11 +402,13 @@ fn test_geo_ops() { /// - hmget获取字段filed2 filed5的值 /// - hincrby filed2 4 =>26 /// - hincrbyfloat filed5 4.4 =>8.4 +/// - hexists 不存在的filed6=>0 /// - hsetnx不存在的 filed6 =》1 /// - hsetnx已经存在的 filed6 =》0 /// - hvals 获取所有test_hash_ops表filed字段的vals /// - hsetnx不存在的 hash表hashkey =》1 -/// - hget hash表hashkey filed6字段=》6 +/// - hget hash表hashkey hashfiled6=》6 +/// #[named] #[test] fn test_hash_ops() { @@ -454,8 +459,10 @@ fn test_hash_ops() { assert_eq!(con.hincr(arykey, "filed2", 4), Ok(26)); assert_eq!(con.hincr(arykey, "filed5", 3.4), Ok(8.4)); + assert_eq!(con.hexists(arykey, "filed6"), Ok(0)); assert_eq!(con.hset_nx(arykey, "filed6", 6), Ok(1)); assert_eq!(con.hset_nx(arykey, "filed6", 6), Ok(0)); + assert_eq!( con.hvals(arykey), Ok(( @@ -468,13 +475,146 @@ fn test_hash_ops() { ); assert_eq!(con.hset_nx("hashkey", "hashfiled6", 6), Ok(1)); - //assert_eq!(con.hget("hashkey", "filed6"), Ok(6.to_string())); + assert_eq!(con.hget("hashkey", "hashfiled6"), Ok(6.to_string())); //let _a: = con.hscan_match(arykey, "filed"); - + // assert_eq!( + // con.hscan_match(arykey, "filed"), + // // redis::cmd("HSCAN") + // // .arg(arykey) + // // .arg(0) + // // .arg("match") + // // .arg("filed") + // // .arg("count") + // // .arg(5) + // // .execute(&mut con), + // ); // assert_eq!(con.hscan(arykey, "filed"), Ok((0.to_string()))); } +//getset key不存在时 返回nil 并set key +//get key =2 +//getset key 1 返回旧值2 +//get key =1 +#[named] +#[test] +fn getset_sample() { + let arykey = function_name!(); + let mut con = get_conn(&file!().get_host()); + redis::cmd("DEL").arg(arykey).execute(&mut con); + + assert_eq!(con.getset(arykey, 2), Ok(())); + assert_eq!(con.get(arykey), Ok(2)); + assert_eq!(con.getset(arykey, 1), Ok(2)); + assert_eq!(con.get(arykey), Ok(1)); +} + +/// - mset ("xinxinkey1", 1), ("xinxinkey2", 2), ("xinxinkey3", 3),(arykey, 4) +/// - expire_at 设置xinxinkey1的过期时间为当前秒级别时间戳+2s +/// - setex key2 4 22 将key2 value 改成22并设置过期时间4s +/// - ttl/pttl key3存在 但是没有设置过期时间=》-1 +/// - ttl key1没过期 +/// - sleep 2s +/// - pttl key2 没过期 +/// - get value为22 +/// - exists 检查key1不存在 因为已经过期 =》0 +/// - ttl/pttl key1不存在时=》-2 +/// - setnx key1 2 =>1 key1不存在(因为已经过期被删掉)才能setnx成功 +/// - get key1 =>11 +/// - setnx 已经存在的key3 =>0 +/// - expire key3过期时间为1s +/// - incrby 4 =>8 +/// - decrby 2 =>6 +/// - decr =>5 +/// - incrbyfloat 4.4 =>9.4 +/// - pexpireat 设置arykey的过期时间为当前时间戳+2000ms p都是ms级别 +/// - sleep 1s +/// - pexpire 设置arykey过期时间为5000ms +/// - ttl arykey过期时间》2000 由于pexpire把key3过期时间覆盖 +/// - exists key3 0 已经过期 +/// - persist arykey 移除过期时间 +/// - ttl arykey -1 已经移除 + +#[named] +#[test] +fn string_sample() { + let arykey = function_name!(); + let mut con = get_conn(&file!().get_host()); + redis::cmd("DEL").arg(arykey).execute(&mut con); + redis::cmd("DEL").arg("xinxinkey1").execute(&mut con); + redis::cmd("DEL").arg("xinxinkey2").execute(&mut con); + redis::cmd("DEL").arg("xinxinkey3").execute(&mut con); + assert_eq!( + con.set_multiple(&[ + ("xinxinkey1", 1), + ("xinxinkey2", 2), + ("xinxinkey3", 3), + (arykey, 4) + ]), + Ok(true) + ); + + let now = Local::now().timestamp(); + let pttl_now = Instant::now(); + assert_eq!(con.expire_at("xinxinkey1", (now + 2) as usize), Ok(1)); + assert_eq!(con.set_ex("xinxinkey2", 22, 4), Ok(())); + + assert_eq!(con.ttl("xinxinkey3"), Ok(-1)); + assert_eq!(con.pttl("xinxinkey3"), Ok(-1)); + + assert_eq!( + con.ttl("xinxinkey1"), + Ok(4 - pttl_now.elapsed().as_secs() > 0) + ); + + thread::sleep(time::Duration::from_secs(2)); + + assert_eq!( + con.pttl("xinxinkey2"), + Ok(4000 - pttl_now.elapsed().as_millis() > 0) + ); + assert_eq!(con.get("xinxinkey2"), Ok(22)); + + assert_eq!(con.exists("xinxinkey1"), Ok(0)); + assert_eq!(con.ttl("xinxinkey1"), Ok(-2)); + assert_eq!(con.pttl("xinxinkey1"), Ok(-2)); + + assert_eq!(con.set_nx("xinxinkey1", 11), Ok(1)); + assert_eq!(con.get("xinxinkey1"), Ok(11)); + assert_eq!(con.set_nx("xinxinkey3", 2), Ok(0)); + + assert_eq!(con.expire("xinxinkey3", 1), Ok(1)); + + assert_eq!(con.incr(arykey, 4), Ok(8)); + assert_eq!(con.decr(arykey, 2), Ok(6)); + assert_eq!(redis::cmd("DECR").arg(arykey).query(&mut con), Ok(5)); + assert_eq!(con.incr(arykey, 4.4), Ok(9.4)); + + assert_eq!( + con.pexpire_at(arykey, (Local::now().timestamp_millis() + 2000) as usize), + Ok(1) + ); + thread::sleep(time::Duration::from_secs(1)); + assert_eq!(con.pexpire(arykey, 5000 as usize), Ok(1)); + assert_eq!( + con.ttl(arykey), + Ok(5000 - Instant::now().elapsed().as_millis() > 2000) + ); + assert_eq!(con.exists("xinxinkey3"), Ok(0)); + + assert_eq!(con.persist(arykey), Ok(1)); + assert_eq!(con.ttl(arykey), Ok(-1)); + + // assert_eq!( + // redis::cmd("MINCR") + // .arg(arykey) + // .arg(2) + // .arg(3) + // .query(&mut con), + // Ok(14.4) + // ); +} + /// 单个zset基本操作, zadd, zrangebyscore withscore #[named] #[test] @@ -490,7 +630,7 @@ fn test_zset_basic() { (4, "four".to_string()), ]; - assert_eq!(con.zadd_multiple(arykey, values),Ok(4)); + assert_eq!(con.zadd_multiple(arykey, values), Ok(4)); assert_eq!( con.zrange_withscores(arykey, 0, -1), Ok(vec![ @@ -511,10 +651,10 @@ fn test_zset_basic() { ]) ); - assert_eq!(con.zincr(arykey, "one", 4),Ok("5".to_string())); - assert_eq!(con.zrem(arykey, "four"),Ok(1)); - assert_eq!(con.zremrangebyrank(arykey, 0, 0),Ok(1)); - assert_eq!(con.zrembyscore(arykey, 1, 3),Ok(1)); + assert_eq!(con.zincr(arykey, "one", 4), Ok("5".to_string())); + assert_eq!(con.zrem(arykey, "four"), Ok(1)); + assert_eq!(con.zremrangebyrank(arykey, 0, 0), Ok(1)); + assert_eq!(con.zrembyscore(arykey, 1, 3), Ok(1)); let samescore = &[ (0, "aaaa".to_string()), @@ -524,19 +664,20 @@ fn test_zset_basic() { (0, "e".to_string()), ]; - assert_eq!(con.zadd_multiple(arykey, samescore),Ok(5)); - assert_eq!(con.zrembylex(arykey, "[b", "(c"),Ok(1)); - assert_eq!(con.zrangebylex(arykey, "-", "(c"),Ok(vec![ - "aaaa".to_string(), - ])); - assert_eq!(con.zrevrangebylex(arykey, "(c", "-"),Ok(vec![ - "aaaa".to_string(), - ])); - assert_eq!(con.zcount(arykey, 0, 2),Ok(4)); - assert_eq!(con.zlexcount(arykey, "-", "+"),Ok(5)); + assert_eq!(con.zadd_multiple(arykey, samescore), Ok(5)); + assert_eq!(con.zrembylex(arykey, "[b", "(c"), Ok(1)); + assert_eq!( + con.zrangebylex(arykey, "-", "(c"), + Ok(vec!["aaaa".to_string(),]) + ); + assert_eq!( + con.zrevrangebylex(arykey, "(c", "-"), + Ok(vec!["aaaa".to_string(),]) + ); + assert_eq!(con.zcount(arykey, 0, 2), Ok(4)); + assert_eq!(con.zlexcount(arykey, "-", "+"), Ok(5)); redis::cmd("DEL").arg(arykey).execute(&mut con); - assert_eq!(con.zadd_multiple(arykey, values),Ok(4)); - + assert_eq!(con.zadd_multiple(arykey, values), Ok(4)); assert_eq!( con.zrangebyscore(arykey, 0, 5), @@ -558,10 +699,9 @@ fn test_zset_basic() { ]) ); - assert_eq!(con.zcard(arykey),Ok(4)); - assert_eq!(con.zrank(arykey, "one"),Ok(0)); - assert_eq!(con.zscore(arykey, "one"),Ok(1)); - + assert_eq!(con.zcard(arykey), Ok(4)); + assert_eq!(con.zrank(arykey, "one"), Ok(0)); + assert_eq!(con.zscore(arykey, "one"), Ok(1)); } //github ci 过不了,本地可以过,不清楚原因 From a16cc3f92a5d0965470e5dffcfe2c8beeaec3089 Mon Sep 17 00:00:00 2001 From: xinxin22 Date: Tue, 1 Nov 2022 10:56:53 +0800 Subject: [PATCH 21/34] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E8=BF=94=E5=9B=9E?= =?UTF-8?q?=E7=BB=93=E6=9E=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- tests_ci/src/redis.rs | 19 ++++++++++++++++--- 1 file changed, 16 insertions(+), 3 deletions(-) diff --git a/tests_ci/src/redis.rs b/tests_ci/src/redis.rs index e5d831a3f..fdf0da56a 100644 --- a/tests_ci/src/redis.rs +++ b/tests_ci/src/redis.rs @@ -477,7 +477,15 @@ fn test_hash_ops() { assert_eq!(con.hset_nx("hashkey", "hashfiled6", 6), Ok(1)); assert_eq!(con.hget("hashkey", "hashfiled6"), Ok(6.to_string())); - //let _a: = con.hscan_match(arykey, "filed"); + // let _a = redis::cmd("HSCAN") + // .arg(arykey) + // .arg(0) + // .arg("match") + // .arg("filed") + // .arg("count") + // .arg(5) + // .query(&mut con); + // assert_eq!( // con.hscan_match(arykey, "filed"), // // redis::cmd("HSCAN") @@ -503,7 +511,12 @@ fn getset_sample() { let mut con = get_conn(&file!().get_host()); redis::cmd("DEL").arg(arykey).execute(&mut con); - assert_eq!(con.getset(arykey, 2), Ok(())); + assert_eq!( + con.getset::<&str, i32, Option>(arykey, 2) + .map_err(|e| panic!("set error:{:?}", e)) + .expect("set err"), + None + ); assert_eq!(con.get(arykey), Ok(2)); assert_eq!(con.getset(arykey, 1), Ok(2)); assert_eq!(con.get(arykey), Ok(1)); @@ -557,7 +570,7 @@ fn string_sample() { let now = Local::now().timestamp(); let pttl_now = Instant::now(); assert_eq!(con.expire_at("xinxinkey1", (now + 2) as usize), Ok(1)); - assert_eq!(con.set_ex("xinxinkey2", 22, 4), Ok(())); + assert_eq!(con.set_ex("xinxinkey2", 22, 4), Ok(true)); assert_eq!(con.ttl("xinxinkey3"), Ok(-1)); assert_eq!(con.pttl("xinxinkey3"), Ok(-1)); From b3b0d914d6055db1a608863a61e36d43c6b1e56e Mon Sep 17 00:00:00 2001 From: wanggang9 Date: Tue, 1 Nov 2022 14:16:42 +0800 Subject: [PATCH 22/34] change githubci image --- .github/workflows/rust.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/rust.yml b/.github/workflows/rust.yml index 7b8435aa1..1d3541628 100644 --- a/.github/workflows/rust.yml +++ b/.github/workflows/rust.yml @@ -20,7 +20,7 @@ jobs: steps: - name: Prepare Vintage_MC_Redis - run: docker run -d -v /home/runner/work/breeze:/data1/resource/breeze --net="host" --name breeze_github_ci ficohu/breeze:githubci0011 + run: docker run -d -v /home/runner/work/breeze:/data1/resource/breeze --net="host" --name breeze_github_ci 12323312323223/breeze:githubci105 - uses: actions/checkout@v3 - name: Install stable toolchain uses: actions-rs/toolchain@v1 From ef57751f9a98120c83b1fffa8d94b48b1db708ce Mon Sep 17 00:00:00 2001 From: xinxin22 Date: Tue, 1 Nov 2022 14:49:07 +0800 Subject: [PATCH 23/34] mincr hscan --- tests_ci/src/counterservice.rs | 37 ++++++++++++++++++++++++ tests_ci/src/redis.rs | 53 +++++++++++++--------------------- 2 files changed, 57 insertions(+), 33 deletions(-) diff --git a/tests_ci/src/counterservice.rs b/tests_ci/src/counterservice.rs index 241a7a914..bab2c9710 100644 --- a/tests_ci/src/counterservice.rs +++ b/tests_ci/src/counterservice.rs @@ -244,6 +244,43 @@ fn test_sample_incrby() { assert_panic!(panic!( "{:?}", get_conn().incr::(key, 2)), String, contains "Invalid key"); } +//set 111111 222222 +//mincr key1 key2 +// mget key1 key2 +#[test] +fn test_sample_mincr() { + let v1 = 1111111; + let v2 = 2222222; + redis::cmd("DEL").arg(v1).arg(v2).execute(&mut get_conn()); + + test_set_key_value(v1, v1 as i64); + test_set_key_value(v2, v2 as i64); + + let column_cfg = vec![".repost", ".comment", ".like"]; + let mut mincr_keys = vec![]; + for column in column_cfg.iter() { + let mut key1 = v1.to_string(); + let mut key2 = v2.to_string(); + key1.push_str(column); + key2.push_str(column); + mincr_keys.push(key1); + mincr_keys.push(key2); + } + let value1 = format!("repost:{},like:{},comment:{}", v1 + 1, v1 + 1, v1 + 1); + let value2 = format!("repost:{},like:{},comment:{}", v2 + 1, v2 + 1, v2 + 1); + + let _: () = redis::cmd("MINCR") + .arg(mincr_keys) + .query(&mut get_conn()) + .map_err(|e| panic!("set error:{:?}", e)) + .expect("mincr err"); + + assert_eq!( + redis::cmd("MGET").arg(v1).arg(v2).query(&mut get_conn()), + Ok((value1, value2)) + ); +} + //测试场景:decrby只能decby 指定key的指定列 decr 323456789.repost 3 //单独decrby某一列 get到的value为value-1 diff --git a/tests_ci/src/redis.rs b/tests_ci/src/redis.rs index fdf0da56a..cc7f740a2 100644 --- a/tests_ci/src/redis.rs +++ b/tests_ci/src/redis.rs @@ -23,7 +23,7 @@ use crate::redis_helper::*; use ::function_name::named; use chrono::prelude::*; use redis::Commands; -use std::collections::HashMap; +use std::collections::{HashMap, HashSet}; use std::time::Instant; use std::vec; use std::{thread, time}; @@ -42,7 +42,6 @@ fn find_primes(n: usize) -> Vec { is_prime[x] = false; }); } - //println!("{:?}", is_prime); result } @@ -406,9 +405,12 @@ fn test_geo_ops() { /// - hsetnx不存在的 filed6 =》1 /// - hsetnx已经存在的 filed6 =》0 /// - hvals 获取所有test_hash_ops表filed字段的vals +/// 当前filed2 22 filed3 3 filed4 4 filed 5 8.4 filede 6 6 +/// /// - hsetnx不存在的 hash表hashkey =》1 /// - hget hash表hashkey hashfiled6=》6 -/// +/// - hscan 获取hash表hashkey 所有的字段和value 的元组 +/// - hscan_match 获取hash表test_hash_ops 和filed6相关的元组 #[named] #[test] fn test_hash_ops() { @@ -477,27 +479,21 @@ fn test_hash_ops() { assert_eq!(con.hset_nx("hashkey", "hashfiled6", 6), Ok(1)); assert_eq!(con.hget("hashkey", "hashfiled6"), Ok(6.to_string())); - // let _a = redis::cmd("HSCAN") - // .arg(arykey) - // .arg(0) - // .arg("match") - // .arg("filed") - // .arg("count") - // .arg(5) - // .query(&mut con); - - // assert_eq!( - // con.hscan_match(arykey, "filed"), - // // redis::cmd("HSCAN") - // // .arg(arykey) - // // .arg(0) - // // .arg("match") - // // .arg("filed") - // // .arg("count") - // // .arg(5) - // // .execute(&mut con), - // ); - // assert_eq!(con.hscan(arykey, "filed"), Ok((0.to_string()))); + let iter: redis::Iter<'_, (String, i64)> = con.hscan("hashkey").expect("hscan error"); + let mut found = HashSet::new(); + for item in iter { + found.insert(item); + } + assert!(found.contains(&("hashfiled6".to_string(), 6))); + + let iter = con + .hscan_match::<&str, &str, (String, i64)>(arykey, "filed6") + .expect("hscan match error"); + let mut hscan_match_found = HashSet::new(); + for item in iter { + hscan_match_found.insert(item); + } + assert!(hscan_match_found.contains(&("filed6".to_string(), 6))); } //getset key不存在时 返回nil 并set key @@ -617,15 +613,6 @@ fn string_sample() { assert_eq!(con.persist(arykey), Ok(1)); assert_eq!(con.ttl(arykey), Ok(-1)); - - // assert_eq!( - // redis::cmd("MINCR") - // .arg(arykey) - // .arg(2) - // .arg(3) - // .query(&mut con), - // Ok(14.4) - // ); } /// 单个zset基本操作, zadd, zrangebyscore withscore From a7653d9dd8603fe91aeb9b91a85625193cf41e0c Mon Sep 17 00:00:00 2001 From: xinxin22 Date: Tue, 1 Nov 2022 14:50:01 +0800 Subject: [PATCH 24/34] =?UTF-8?q?=E5=88=A0=E9=99=A4=E9=94=99=E8=AF=AF?= =?UTF-8?q?=E6=96=87=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- nohup.out | 395 ------------------------------------------------------ 1 file changed, 395 deletions(-) delete mode 100644 nohup.out diff --git a/nohup.out b/nohup.out deleted file mode 100644 index e6d9965f4..000000000 --- a/nohup.out +++ /dev/null @@ -1,395 +0,0 @@ - Compiling foreign-types-shared v0.1.1 - Compiling openssl-sys v0.9.77 - Compiling context v0.1.0 (/Users/xinxin22/breeze2/context) - Compiling foreign-types v0.3.2 - Compiling openssl v0.10.42 - Compiling metrics v0.1.0 (/Users/xinxin22/breeze2/metrics) - Compiling discovery v0.1.0 (/Users/xinxin22/breeze2/discovery) - Compiling sharding v0.1.0 (/Users/xinxin22/breeze2/sharding) - Compiling memcache v0.16.0 - Compiling protocol v0.1.0 (/Users/xinxin22/breeze2/protocol) - Compiling api v0.1.0 (/Users/xinxin22/breeze2/api) - Compiling rt v0.1.0 (/Users/xinxin22/breeze2/rt) - Compiling stream v0.1.0 (/Users/xinxin22/breeze2/stream) - Compiling endpoint v0.1.0 (/Users/xinxin22/breeze2/endpoint) - Compiling agent v0.0.1 (/Users/xinxin22/breeze2/agent) - Finished dev [unoptimized + debuginfo] target(s) in 11.06s - Running `target/debug/agent --discovery 'vintage://10.182.27.228:8080' --snapshot /Users/xinxin22/Sites/breeze/snapshot --service-path /Users/xinxin22/Sites/breeze/socks --log-dir /Users/xinxin22/Sites/breeze/logs --upgrade --port 9984 --log-level info` - Compiling context v0.1.0 (/Users/xinxin22/breeze2/context) - Compiling metrics v0.1.0 (/Users/xinxin22/breeze2/metrics) - Compiling discovery v0.1.0 (/Users/xinxin22/breeze2/discovery) - Compiling api v0.1.0 (/Users/xinxin22/breeze2/api) - Compiling sharding v0.1.0 (/Users/xinxin22/breeze2/sharding) - Compiling protocol v0.1.0 (/Users/xinxin22/breeze2/protocol) - Compiling rt v0.1.0 (/Users/xinxin22/breeze2/rt) - Compiling stream v0.1.0 (/Users/xinxin22/breeze2/stream) - Compiling endpoint v0.1.0 (/Users/xinxin22/breeze2/endpoint) - Compiling agent v0.0.1 (/Users/xinxin22/breeze2/agent) - Finished dev [unoptimized + debuginfo] target(s) in 6.99s - Running `target/debug/agent --discovery 'vintage://10.182.27.228:8080' --snapshot /Users/xinxin22/Sites/breeze/snapshot --service-path /Users/xinxin22/Sites/breeze/socks --log-dir /Users/xinxin22/Sites/breeze/logs --upgrade --port 9984 --log-level info` - Finished dev [unoptimized + debuginfo] target(s) in 0.29s - Running `target/debug/agent --discovery 'vintage://10.182.27.228:8080' --snapshot /Users/xinxin22/Sites/breeze/snapshot --service-path /Users/xinxin22/Sites/breeze/socks --log-dir /Users/xinxin22/Sites/breeze/logs --upgrade --port 9984 --log-level info` - Finished dev [unoptimized + debuginfo] target(s) in 0.29s - Running `target/debug/agent --discovery 'vintage://10.182.27.228:8080' --snapshot /Users/xinxin22/Sites/breeze/snapshot --service-path /Users/xinxin22/Sites/breeze/socks --log-dir /Users/xinxin22/Sites/breeze/logs --upgrade --port 9984 --log-level info` - Finished dev [unoptimized + debuginfo] target(s) in 0.40s - Running `target/debug/agent --discovery 'vintage://10.182.27.228:8080' --snapshot /Users/xinxin22/Sites/breeze/snapshot --service-path /Users/xinxin22/Sites/breeze/socks --log-dir /Users/xinxin22/Sites/breeze/logs --upgrade --port 9984 --log-level info` - Finished dev [unoptimized + debuginfo] target(s) in 0.42s - Running `target/debug/agent --discovery 'vintage://10.182.27.228:8080' --snapshot /Users/xinxin22/Sites/breeze/snapshot --service-path /Users/xinxin22/Sites/breeze/socks --log-dir /Users/xinxin22/Sites/breeze/logs --upgrade --port 9984 --log-level info` - Finished dev [unoptimized + debuginfo] target(s) in 0.29s - Running `target/debug/agent --discovery 'vintage://10.182.27.228:8080' --snapshot /Users/xinxin22/Sites/breeze/snapshot --service-path /Users/xinxin22/Sites/breeze/socks --log-dir /Users/xinxin22/Sites/breeze/logs --upgrade --port 9984 --log-level info` - Finished dev [unoptimized + debuginfo] target(s) in 0.42s - Running `target/debug/agent --discovery 'vintage://10.182.27.228:8080' --snapshot /Users/xinxin22/Sites/breeze/snapshot --service-path /Users/xinxin22/Sites/breeze/socks --log-dir /Users/xinxin22/Sites/breeze/logs --upgrade --port 9984 --log-level info` - Finished dev [unoptimized + debuginfo] target(s) in 0.30s - Running `target/debug/agent --discovery 'vintage://10.182.27.228:8080' --snapshot /Users/xinxin22/Sites/breeze/snapshot --service-path /Users/xinxin22/Sites/breeze/socks --log-dir /Users/xinxin22/Sites/breeze/logs --upgrade --port 9984 --log-level info` - Finished dev [unoptimized + debuginfo] target(s) in 0.37s - Running `target/debug/agent --discovery 'vintage://10.182.27.228:8080' --snapshot /Users/xinxin22/Sites/breeze/snapshot --service-path /Users/xinxin22/Sites/breeze/socks --log-dir /Users/xinxin22/Sites/breeze/logs --upgrade --port 9984 --log-level info` - Finished dev [unoptimized + debuginfo] target(s) in 0.94s - Running `target/debug/agent --discovery 'vintage://10.182.27.228:8080' --snapshot /Users/xinxin22/Sites/breeze/snapshot --service-path /Users/xinxin22/Sites/breeze/socks --log-dir /Users/xinxin22/Sites/breeze/logs --upgrade --port 9984 --log-level info` - Finished dev [unoptimized + debuginfo] target(s) in 0.29s - Running `target/debug/agent --discovery 'vintage://10.182.27.228:8080' --snapshot /Users/xinxin22/Sites/breeze/snapshot --service-path /Users/xinxin22/Sites/breeze/socks --log-dir /Users/xinxin22/Sites/breeze/logs --upgrade --port 9984 --log-level info` - Finished dev [unoptimized + debuginfo] target(s) in 0.32s - Running `target/debug/agent --discovery 'vintage://10.182.27.228:8080' --snapshot /Users/xinxin22/Sites/breeze/snapshot --service-path /Users/xinxin22/Sites/breeze/socks --log-dir /Users/xinxin22/Sites/breeze/logs --upgrade --port 9984 --log-level info` - Finished dev [unoptimized + debuginfo] target(s) in 0.17s - Running `target/debug/agent --discovery 'vintage://10.182.27.228:8080' --snapshot /Users/xinxin22/Sites/breeze/snapshot --service-path /Users/xinxin22/Sites/breeze/socks --log-dir /Users/xinxin22/Sites/breeze/logs --upgrade --port 9984 --log-level info` -mesh panic /Users/xinxin22/breeze2/protocol/src/redis/packet.rs:103: assertion failed: `(left != right)` - left: `0`, - right: `0`: packet:(packet => len:18 bulk num: 0 op_code:1746 oft:(0 => 18)) first:true data:ptr:3007325648896 start:163 end:181 cap:1024 => "*1\r\n$8\r\nlsgetall\r\n" -panic backtrace: 0: backtrace::backtrace::libunwind::trace - at /Users/xinxin22/.cargo/registry/src/mirrors.ustc.edu.cn-61ef6e0cd06fb9b8/backtrace-0.3.63/src/backtrace/libunwind.rs:93:5 - backtrace::backtrace::trace_unsynchronized - at /Users/xinxin22/.cargo/registry/src/mirrors.ustc.edu.cn-61ef6e0cd06fb9b8/backtrace-0.3.63/src/backtrace/mod.rs:66:5 - 1: backtrace::backtrace::trace - at /Users/xinxin22/.cargo/registry/src/mirrors.ustc.edu.cn-61ef6e0cd06fb9b8/backtrace-0.3.63/src/backtrace/mod.rs:53:14 - 2: backtrace::capture::Backtrace::create - at /Users/xinxin22/.cargo/registry/src/mirrors.ustc.edu.cn-61ef6e0cd06fb9b8/backtrace-0.3.63/src/capture.rs:176:9 - 3: backtrace::capture::Backtrace::new - at /Users/xinxin22/.cargo/registry/src/mirrors.ustc.edu.cn-61ef6e0cd06fb9b8/backtrace-0.3.63/src/capture.rs:140:22 - 4: agent::init::init_panic_hook::{{closure}} - at agent/src/init.rs:44:56 - 5: std::panicking::rust_panic_with_hook - at /rustc/a55dd71d5fb0ec5a6a3a9e8c27b2127ba491ce52/library/std/src/panicking.rs:702:17 - 6: std::panicking::begin_panic_handler::{{closure}} - at /rustc/a55dd71d5fb0ec5a6a3a9e8c27b2127ba491ce52/library/std/src/panicking.rs:588:13 - 7: std::sys_common::backtrace::__rust_end_short_backtrace - at /rustc/a55dd71d5fb0ec5a6a3a9e8c27b2127ba491ce52/library/std/src/sys_common/backtrace.rs:138:18 - 8: rust_begin_unwind - at /rustc/a55dd71d5fb0ec5a6a3a9e8c27b2127ba491ce52/library/std/src/panicking.rs:584:5 - 9: core::panicking::panic_fmt - at /rustc/a55dd71d5fb0ec5a6a3a9e8c27b2127ba491ce52/library/core/src/panicking.rs:142:14 - 10: core::panicking::assert_failed_inner - 11: core::panicking::assert_failed - at /rustc/a55dd71d5fb0ec5a6a3a9e8c27b2127ba491ce52/library/core/src/panicking.rs:181:5 - 12: protocol::redis::packet::RequestPacket::parse_key - at protocol/src/redis/packet.rs:103:9 - 13: protocol::redis::Redis::parse_request_inner - at protocol/src/redis/mod.rs:104:31 - 14: ::parse_request - at protocol/src/redis/mod.rs:250:15 - 15: ::parse_request - at protocol/src/parser.rs:30:1 - 16: stream::pipeline::CopyBidirectional::parse_request - at stream/src/pipeline.rs:160:9 - 17: as core::future::future::Future>::poll - at stream/src/pipeline.rs:95:13 - 18: rt::entry::Entry::poll_run - at rt/src/entry.rs:115:19 - 19: as core::future::future::Future>::poll - at rt/src/entry.rs:146:36 - 20: stream::pipeline::copy_bidirectional::{{closure}} - at stream/src/pipeline.rs:52:55 - 21: as core::future::future::Future>::poll - at /rustc/a55dd71d5fb0ec5a6a3a9e8c27b2127ba491ce52/library/core/src/future/mod.rs:91:19 - 22: agent::service::_process_one::{{closure}}::{{closure}} - at agent/src/service.rs:102:72 - 23: as core::future::future::Future>::poll - at /rustc/a55dd71d5fb0ec5a6a3a9e8c27b2127ba491ce52/library/core/src/future/mod.rs:91:19 - 24: as core::future::future::Future>::poll - at /rustc/a55dd71d5fb0ec5a6a3a9e8c27b2127ba491ce52/library/core/src/future/future.rs:124:9 - 25: tokio::runtime::task::core::CoreStage::poll::{{closure}} - at /Users/xinxin22/.cargo/registry/src/mirrors.ustc.edu.cn-61ef6e0cd06fb9b8/tokio-1.21.2/src/runtime/task/core.rs:184:17 - 26: tokio::loom::std::unsafe_cell::UnsafeCell::with_mut - at /Users/xinxin22/.cargo/registry/src/mirrors.ustc.edu.cn-61ef6e0cd06fb9b8/tokio-1.21.2/src/loom/std/unsafe_cell.rs:14:9 - 27: tokio::runtime::task::core::CoreStage::poll - at /Users/xinxin22/.cargo/registry/src/mirrors.ustc.edu.cn-61ef6e0cd06fb9b8/tokio-1.21.2/src/runtime/task/core.rs:174:13 - 28: tokio::runtime::task::harness::poll_future::{{closure}} - at /Users/xinxin22/.cargo/registry/src/mirrors.ustc.edu.cn-61ef6e0cd06fb9b8/tokio-1.21.2/src/runtime/task/harness.rs:480:19 - 29: as core::ops::function::FnOnce<()>>::call_once - at /rustc/a55dd71d5fb0ec5a6a3a9e8c27b2127ba491ce52/library/core/src/panic/unwind_safe.rs:271:9 - 30: std::panicking::try::do_call - at /rustc/a55dd71d5fb0ec5a6a3a9e8c27b2127ba491ce52/library/std/src/panicking.rs:492:40 - 31: ___rust_try - 32: std::panicking::try - at /rustc/a55dd71d5fb0ec5a6a3a9e8c27b2127ba491ce52/library/std/src/panicking.rs:456:19 - 33: std::panic::catch_unwind - at /rustc/a55dd71d5fb0ec5a6a3a9e8c27b2127ba491ce52/library/std/src/panic.rs:137:14 - 34: tokio::runtime::task::harness::poll_future - at /Users/xinxin22/.cargo/registry/src/mirrors.ustc.edu.cn-61ef6e0cd06fb9b8/tokio-1.21.2/src/runtime/task/harness.rs:468:18 - 35: tokio::runtime::task::harness::Harness::poll_inner - at /Users/xinxin22/.cargo/registry/src/mirrors.ustc.edu.cn-61ef6e0cd06fb9b8/tokio-1.21.2/src/runtime/task/harness.rs:104:27 - 36: tokio::runtime::task::harness::Harness::poll - at /Users/xinxin22/.cargo/registry/src/mirrors.ustc.edu.cn-61ef6e0cd06fb9b8/tokio-1.21.2/src/runtime/task/harness.rs:57:15 - 37: tokio::runtime::task::raw::poll - at /Users/xinxin22/.cargo/registry/src/mirrors.ustc.edu.cn-61ef6e0cd06fb9b8/tokio-1.21.2/src/runtime/task/raw.rs:194:5 - 38: tokio::runtime::task::raw::RawTask::poll - at /Users/xinxin22/.cargo/registry/src/mirrors.ustc.edu.cn-61ef6e0cd06fb9b8/tokio-1.21.2/src/runtime/task/raw.rs:134:18 - 39: tokio::runtime::task::LocalNotified::run - at /Users/xinxin22/.cargo/registry/src/mirrors.ustc.edu.cn-61ef6e0cd06fb9b8/tokio-1.21.2/src/runtime/task/mod.rs:385:9 - 40: tokio::runtime::scheduler::multi_thread::worker::Context::run_task::{{closure}} - at /Users/xinxin22/.cargo/registry/src/mirrors.ustc.edu.cn-61ef6e0cd06fb9b8/tokio-1.21.2/src/runtime/scheduler/multi_thread/worker.rs:421:13 - 41: tokio::coop::with_budget::{{closure}} - at /Users/xinxin22/.cargo/registry/src/mirrors.ustc.edu.cn-61ef6e0cd06fb9b8/tokio-1.21.2/src/coop.rs:102:9 - 42: std::thread::local::LocalKey::try_with - at /rustc/a55dd71d5fb0ec5a6a3a9e8c27b2127ba491ce52/library/std/src/thread/local.rs:445:16 - 43: std::thread::local::LocalKey::with - at /rustc/a55dd71d5fb0ec5a6a3a9e8c27b2127ba491ce52/library/std/src/thread/local.rs:421:9 - 44: tokio::coop::with_budget - at /Users/xinxin22/.cargo/registry/src/mirrors.ustc.edu.cn-61ef6e0cd06fb9b8/tokio-1.21.2/src/coop.rs:95:5 - tokio::coop::budget - at /Users/xinxin22/.cargo/registry/src/mirrors.ustc.edu.cn-61ef6e0cd06fb9b8/tokio-1.21.2/src/coop.rs:72:5 - tokio::runtime::scheduler::multi_thread::worker::Context::run_task - at /Users/xinxin22/.cargo/registry/src/mirrors.ustc.edu.cn-61ef6e0cd06fb9b8/tokio-1.21.2/src/runtime/scheduler/multi_thread/worker.rs:420:9 - 45: tokio::runtime::scheduler::multi_thread::worker::Context::run - at /Users/xinxin22/.cargo/registry/src/mirrors.ustc.edu.cn-61ef6e0cd06fb9b8/tokio-1.21.2/src/runtime/scheduler/multi_thread/worker.rs:387:24 - 46: tokio::runtime::scheduler::multi_thread::worker::run::{{closure}} - at /Users/xinxin22/.cargo/registry/src/mirrors.ustc.edu.cn-61ef6e0cd06fb9b8/tokio-1.21.2/src/runtime/scheduler/multi_thread/worker.rs:372:17 - 47: tokio::macros::scoped_tls::ScopedKey::set - at /Users/xinxin22/.cargo/registry/src/mirrors.ustc.edu.cn-61ef6e0cd06fb9b8/tokio-1.21.2/src/macros/scoped_tls.rs:61:9 - 48: tokio::runtime::scheduler::multi_thread::worker::run - at /Users/xinxin22/.cargo/registry/src/mirrors.ustc.edu.cn-61ef6e0cd06fb9b8/tokio-1.21.2/src/runtime/scheduler/multi_thread/worker.rs:369:5 - 49: tokio::runtime::scheduler::multi_thread::worker::Launch::launch::{{closure}} - at /Users/xinxin22/.cargo/registry/src/mirrors.ustc.edu.cn-61ef6e0cd06fb9b8/tokio-1.21.2/src/runtime/scheduler/multi_thread/worker.rs:348:45 - 50: as core::future::future::Future>::poll - at /Users/xinxin22/.cargo/registry/src/mirrors.ustc.edu.cn-61ef6e0cd06fb9b8/tokio-1.21.2/src/runtime/blocking/task.rs:42:21 - 51: tokio::runtime::task::core::CoreStage::poll::{{closure}} - at /Users/xinxin22/.cargo/registry/src/mirrors.ustc.edu.cn-61ef6e0cd06fb9b8/tokio-1.21.2/src/runtime/task/core.rs:184:17 - 52: tokio::loom::std::unsafe_cell::UnsafeCell::with_mut - at /Users/xinxin22/.cargo/registry/src/mirrors.ustc.edu.cn-61ef6e0cd06fb9b8/tokio-1.21.2/src/loom/std/unsafe_cell.rs:14:9 - 53: tokio::runtime::task::core::CoreStage::poll - at /Users/xinxin22/.cargo/registry/src/mirrors.ustc.edu.cn-61ef6e0cd06fb9b8/tokio-1.21.2/src/runtime/task/core.rs:174:13 - 54: tokio::runtime::task::harness::poll_future::{{closure}} - at /Users/xinxin22/.cargo/registry/src/mirrors.ustc.edu.cn-61ef6e0cd06fb9b8/tokio-1.21.2/src/runtime/task/harness.rs:480:19 - 55: as core::ops::function::FnOnce<()>>::call_once - at /rustc/a55dd71d5fb0ec5a6a3a9e8c27b2127ba491ce52/library/core/src/panic/unwind_safe.rs:271:9 - 56: std::panicking::try::do_call - at /rustc/a55dd71d5fb0ec5a6a3a9e8c27b2127ba491ce52/library/std/src/panicking.rs:492:40 - 57: ___rust_try - 58: std::panicking::try - at /rustc/a55dd71d5fb0ec5a6a3a9e8c27b2127ba491ce52/library/std/src/panicking.rs:456:19 - 59: std::panic::catch_unwind - at /rustc/a55dd71d5fb0ec5a6a3a9e8c27b2127ba491ce52/library/std/src/panic.rs:137:14 - 60: tokio::runtime::task::harness::poll_future - at /Users/xinxin22/.cargo/registry/src/mirrors.ustc.edu.cn-61ef6e0cd06fb9b8/tokio-1.21.2/src/runtime/task/harness.rs:468:18 - 61: tokio::runtime::task::harness::Harness::poll_inner - at /Users/xinxin22/.cargo/registry/src/mirrors.ustc.edu.cn-61ef6e0cd06fb9b8/tokio-1.21.2/src/runtime/task/harness.rs:104:27 - 62: tokio::runtime::task::harness::Harness::poll - at /Users/xinxin22/.cargo/registry/src/mirrors.ustc.edu.cn-61ef6e0cd06fb9b8/tokio-1.21.2/src/runtime/task/harness.rs:57:15 - 63: tokio::runtime::task::raw::poll - at /Users/xinxin22/.cargo/registry/src/mirrors.ustc.edu.cn-61ef6e0cd06fb9b8/tokio-1.21.2/src/runtime/task/raw.rs:194:5 - 64: tokio::runtime::task::raw::RawTask::poll - at /Users/xinxin22/.cargo/registry/src/mirrors.ustc.edu.cn-61ef6e0cd06fb9b8/tokio-1.21.2/src/runtime/task/raw.rs:134:18 - 65: tokio::runtime::task::UnownedTask::run - at /Users/xinxin22/.cargo/registry/src/mirrors.ustc.edu.cn-61ef6e0cd06fb9b8/tokio-1.21.2/src/runtime/task/mod.rs:422:9 - 66: tokio::runtime::blocking::pool::Task::run - at /Users/xinxin22/.cargo/registry/src/mirrors.ustc.edu.cn-61ef6e0cd06fb9b8/tokio-1.21.2/src/runtime/blocking/pool.rs:111:9 - 67: tokio::runtime::blocking::pool::Inner::run - at /Users/xinxin22/.cargo/registry/src/mirrors.ustc.edu.cn-61ef6e0cd06fb9b8/tokio-1.21.2/src/runtime/blocking/pool.rs:346:17 - 68: tokio::runtime::blocking::pool::Spawner::spawn_thread::{{closure}} - at /Users/xinxin22/.cargo/registry/src/mirrors.ustc.edu.cn-61ef6e0cd06fb9b8/tokio-1.21.2/src/runtime/blocking/pool.rs:321:13 - 69: std::sys_common::backtrace::__rust_begin_short_backtrace - at /rustc/a55dd71d5fb0ec5a6a3a9e8c27b2127ba491ce52/library/std/src/sys_common/backtrace.rs:122:18 - 70: std::thread::Builder::spawn_unchecked_::{{closure}}::{{closure}} - at /rustc/a55dd71d5fb0ec5a6a3a9e8c27b2127ba491ce52/library/std/src/thread/mod.rs:505:17 - 71: as core::ops::function::FnOnce<()>>::call_once - at /rustc/a55dd71d5fb0ec5a6a3a9e8c27b2127ba491ce52/library/core/src/panic/unwind_safe.rs:271:9 - 72: std::panicking::try::do_call - at /rustc/a55dd71d5fb0ec5a6a3a9e8c27b2127ba491ce52/library/std/src/panicking.rs:492:40 - 73: ___rust_try - 74: std::panicking::try - at /rustc/a55dd71d5fb0ec5a6a3a9e8c27b2127ba491ce52/library/std/src/panicking.rs:456:19 - 75: std::panic::catch_unwind - at /rustc/a55dd71d5fb0ec5a6a3a9e8c27b2127ba491ce52/library/std/src/panic.rs:137:14 - 76: std::thread::Builder::spawn_unchecked_::{{closure}} - at /rustc/a55dd71d5fb0ec5a6a3a9e8c27b2127ba491ce52/library/std/src/thread/mod.rs:504:30 - 77: core::ops::function::FnOnce::call_once{{vtable.shim}} - at /rustc/a55dd71d5fb0ec5a6a3a9e8c27b2127ba491ce52/library/core/src/ops/function.rs:248:5 - 78: as core::ops::function::FnOnce>::call_once - at /rustc/a55dd71d5fb0ec5a6a3a9e8c27b2127ba491ce52/library/alloc/src/boxed.rs:1935:9 - as core::ops::function::FnOnce>::call_once - at /rustc/a55dd71d5fb0ec5a6a3a9e8c27b2127ba491ce52/library/alloc/src/boxed.rs:1935:9 - std::sys::unix::thread::Thread::new::thread_start - at /rustc/a55dd71d5fb0ec5a6a3a9e8c27b2127ba491ce52/library/std/src/sys/unix/thread.rs:108:17 - 79: __pthread_deallocate - -mesh panic /Users/xinxin22/breeze2/protocol/src/redis/packet.rs:103: assertion failed: `(left != right)` - left: `0`, - right: `0`: packet:(packet => len:18 bulk num: 0 op_code:1746 oft:(0 => 18)) first:true data:ptr:3007312881664 start:0 end:18 cap:1024 => "*1\r\n$8\r\nlsgetall\r\n" -panic backtrace: 0: backtrace::backtrace::libunwind::trace - at /Users/xinxin22/.cargo/registry/src/mirrors.ustc.edu.cn-61ef6e0cd06fb9b8/backtrace-0.3.63/src/backtrace/libunwind.rs:93:5 - backtrace::backtrace::trace_unsynchronized - at /Users/xinxin22/.cargo/registry/src/mirrors.ustc.edu.cn-61ef6e0cd06fb9b8/backtrace-0.3.63/src/backtrace/mod.rs:66:5 - 1: backtrace::backtrace::trace - at /Users/xinxin22/.cargo/registry/src/mirrors.ustc.edu.cn-61ef6e0cd06fb9b8/backtrace-0.3.63/src/backtrace/mod.rs:53:14 - 2: backtrace::capture::Backtrace::create - at /Users/xinxin22/.cargo/registry/src/mirrors.ustc.edu.cn-61ef6e0cd06fb9b8/backtrace-0.3.63/src/capture.rs:176:9 - 3: backtrace::capture::Backtrace::new - at /Users/xinxin22/.cargo/registry/src/mirrors.ustc.edu.cn-61ef6e0cd06fb9b8/backtrace-0.3.63/src/capture.rs:140:22 - 4: agent::init::init_panic_hook::{{closure}} - at agent/src/init.rs:44:56 - 5: std::panicking::rust_panic_with_hook - at /rustc/a55dd71d5fb0ec5a6a3a9e8c27b2127ba491ce52/library/std/src/panicking.rs:702:17 - 6: std::panicking::begin_panic_handler::{{closure}} - at /rustc/a55dd71d5fb0ec5a6a3a9e8c27b2127ba491ce52/library/std/src/panicking.rs:588:13 - 7: std::sys_common::backtrace::__rust_end_short_backtrace - at /rustc/a55dd71d5fb0ec5a6a3a9e8c27b2127ba491ce52/library/std/src/sys_common/backtrace.rs:138:18 - 8: rust_begin_unwind - at /rustc/a55dd71d5fb0ec5a6a3a9e8c27b2127ba491ce52/library/std/src/panicking.rs:584:5 - 9: core::panicking::panic_fmt - at /rustc/a55dd71d5fb0ec5a6a3a9e8c27b2127ba491ce52/library/core/src/panicking.rs:142:14 - 10: core::panicking::assert_failed_inner - 11: core::panicking::assert_failed - at /rustc/a55dd71d5fb0ec5a6a3a9e8c27b2127ba491ce52/library/core/src/panicking.rs:181:5 - 12: protocol::redis::packet::RequestPacket::parse_key - at protocol/src/redis/packet.rs:103:9 - 13: protocol::redis::Redis::parse_request_inner - at protocol/src/redis/mod.rs:104:31 - 14: ::parse_request - at protocol/src/redis/mod.rs:250:15 - 15: ::parse_request - at protocol/src/parser.rs:30:1 - 16: stream::pipeline::CopyBidirectional::parse_request - at stream/src/pipeline.rs:160:9 - 17: as core::future::future::Future>::poll - at stream/src/pipeline.rs:95:13 - 18: rt::entry::Entry::poll_run - at rt/src/entry.rs:115:19 - 19: as core::future::future::Future>::poll - at rt/src/entry.rs:146:36 - 20: stream::pipeline::copy_bidirectional::{{closure}} - at stream/src/pipeline.rs:52:55 - 21: as core::future::future::Future>::poll - at /rustc/a55dd71d5fb0ec5a6a3a9e8c27b2127ba491ce52/library/core/src/future/mod.rs:91:19 - 22: agent::service::_process_one::{{closure}}::{{closure}} - at agent/src/service.rs:102:72 - 23: as core::future::future::Future>::poll - at /rustc/a55dd71d5fb0ec5a6a3a9e8c27b2127ba491ce52/library/core/src/future/mod.rs:91:19 - 24: as core::future::future::Future>::poll - at /rustc/a55dd71d5fb0ec5a6a3a9e8c27b2127ba491ce52/library/core/src/future/future.rs:124:9 - 25: tokio::runtime::task::core::CoreStage::poll::{{closure}} - at /Users/xinxin22/.cargo/registry/src/mirrors.ustc.edu.cn-61ef6e0cd06fb9b8/tokio-1.21.2/src/runtime/task/core.rs:184:17 - 26: tokio::loom::std::unsafe_cell::UnsafeCell::with_mut - at /Users/xinxin22/.cargo/registry/src/mirrors.ustc.edu.cn-61ef6e0cd06fb9b8/tokio-1.21.2/src/loom/std/unsafe_cell.rs:14:9 - 27: tokio::runtime::task::core::CoreStage::poll - at /Users/xinxin22/.cargo/registry/src/mirrors.ustc.edu.cn-61ef6e0cd06fb9b8/tokio-1.21.2/src/runtime/task/core.rs:174:13 - 28: tokio::runtime::task::harness::poll_future::{{closure}} - at /Users/xinxin22/.cargo/registry/src/mirrors.ustc.edu.cn-61ef6e0cd06fb9b8/tokio-1.21.2/src/runtime/task/harness.rs:480:19 - 29: as core::ops::function::FnOnce<()>>::call_once - at /rustc/a55dd71d5fb0ec5a6a3a9e8c27b2127ba491ce52/library/core/src/panic/unwind_safe.rs:271:9 - 30: std::panicking::try::do_call - at /rustc/a55dd71d5fb0ec5a6a3a9e8c27b2127ba491ce52/library/std/src/panicking.rs:492:40 - 31: ___rust_try - 32: std::panicking::try - at /rustc/a55dd71d5fb0ec5a6a3a9e8c27b2127ba491ce52/library/std/src/panicking.rs:456:19 - 33: std::panic::catch_unwind - at /rustc/a55dd71d5fb0ec5a6a3a9e8c27b2127ba491ce52/library/std/src/panic.rs:137:14 - 34: tokio::runtime::task::harness::poll_future - at /Users/xinxin22/.cargo/registry/src/mirrors.ustc.edu.cn-61ef6e0cd06fb9b8/tokio-1.21.2/src/runtime/task/harness.rs:468:18 - 35: tokio::runtime::task::harness::Harness::poll_inner - at /Users/xinxin22/.cargo/registry/src/mirrors.ustc.edu.cn-61ef6e0cd06fb9b8/tokio-1.21.2/src/runtime/task/harness.rs:104:27 - 36: tokio::runtime::task::harness::Harness::poll - at /Users/xinxin22/.cargo/registry/src/mirrors.ustc.edu.cn-61ef6e0cd06fb9b8/tokio-1.21.2/src/runtime/task/harness.rs:57:15 - 37: tokio::runtime::task::raw::poll - at /Users/xinxin22/.cargo/registry/src/mirrors.ustc.edu.cn-61ef6e0cd06fb9b8/tokio-1.21.2/src/runtime/task/raw.rs:194:5 - 38: tokio::runtime::task::raw::RawTask::poll - at /Users/xinxin22/.cargo/registry/src/mirrors.ustc.edu.cn-61ef6e0cd06fb9b8/tokio-1.21.2/src/runtime/task/raw.rs:134:18 - 39: tokio::runtime::task::LocalNotified::run - at /Users/xinxin22/.cargo/registry/src/mirrors.ustc.edu.cn-61ef6e0cd06fb9b8/tokio-1.21.2/src/runtime/task/mod.rs:385:9 - 40: tokio::runtime::scheduler::multi_thread::worker::Context::run_task::{{closure}} - at /Users/xinxin22/.cargo/registry/src/mirrors.ustc.edu.cn-61ef6e0cd06fb9b8/tokio-1.21.2/src/runtime/scheduler/multi_thread/worker.rs:421:13 - 41: tokio::coop::with_budget::{{closure}} - at /Users/xinxin22/.cargo/registry/src/mirrors.ustc.edu.cn-61ef6e0cd06fb9b8/tokio-1.21.2/src/coop.rs:102:9 - 42: std::thread::local::LocalKey::try_with - at /rustc/a55dd71d5fb0ec5a6a3a9e8c27b2127ba491ce52/library/std/src/thread/local.rs:445:16 - 43: std::thread::local::LocalKey::with - at /rustc/a55dd71d5fb0ec5a6a3a9e8c27b2127ba491ce52/library/std/src/thread/local.rs:421:9 - 44: tokio::coop::with_budget - at /Users/xinxin22/.cargo/registry/src/mirrors.ustc.edu.cn-61ef6e0cd06fb9b8/tokio-1.21.2/src/coop.rs:95:5 - tokio::coop::budget - at /Users/xinxin22/.cargo/registry/src/mirrors.ustc.edu.cn-61ef6e0cd06fb9b8/tokio-1.21.2/src/coop.rs:72:5 - tokio::runtime::scheduler::multi_thread::worker::Context::run_task - at /Users/xinxin22/.cargo/registry/src/mirrors.ustc.edu.cn-61ef6e0cd06fb9b8/tokio-1.21.2/src/runtime/scheduler/multi_thread/worker.rs:420:9 - 45: tokio::runtime::scheduler::multi_thread::worker::Context::run - at /Users/xinxin22/.cargo/registry/src/mirrors.ustc.edu.cn-61ef6e0cd06fb9b8/tokio-1.21.2/src/runtime/scheduler/multi_thread/worker.rs:387:24 - 46: tokio::runtime::scheduler::multi_thread::worker::run::{{closure}} - at /Users/xinxin22/.cargo/registry/src/mirrors.ustc.edu.cn-61ef6e0cd06fb9b8/tokio-1.21.2/src/runtime/scheduler/multi_thread/worker.rs:372:17 - 47: tokio::macros::scoped_tls::ScopedKey::set - at /Users/xinxin22/.cargo/registry/src/mirrors.ustc.edu.cn-61ef6e0cd06fb9b8/tokio-1.21.2/src/macros/scoped_tls.rs:61:9 - 48: tokio::runtime::scheduler::multi_thread::worker::run - at /Users/xinxin22/.cargo/registry/src/mirrors.ustc.edu.cn-61ef6e0cd06fb9b8/tokio-1.21.2/src/runtime/scheduler/multi_thread/worker.rs:369:5 - 49: tokio::runtime::scheduler::multi_thread::worker::Launch::launch::{{closure}} - at /Users/xinxin22/.cargo/registry/src/mirrors.ustc.edu.cn-61ef6e0cd06fb9b8/tokio-1.21.2/src/runtime/scheduler/multi_thread/worker.rs:348:45 - 50: as core::future::future::Future>::poll - at /Users/xinxin22/.cargo/registry/src/mirrors.ustc.edu.cn-61ef6e0cd06fb9b8/tokio-1.21.2/src/runtime/blocking/task.rs:42:21 - 51: tokio::runtime::task::core::CoreStage::poll::{{closure}} - at /Users/xinxin22/.cargo/registry/src/mirrors.ustc.edu.cn-61ef6e0cd06fb9b8/tokio-1.21.2/src/runtime/task/core.rs:184:17 - 52: tokio::loom::std::unsafe_cell::UnsafeCell::with_mut - at /Users/xinxin22/.cargo/registry/src/mirrors.ustc.edu.cn-61ef6e0cd06fb9b8/tokio-1.21.2/src/loom/std/unsafe_cell.rs:14:9 - 53: tokio::runtime::task::core::CoreStage::poll - at /Users/xinxin22/.cargo/registry/src/mirrors.ustc.edu.cn-61ef6e0cd06fb9b8/tokio-1.21.2/src/runtime/task/core.rs:174:13 - 54: tokio::runtime::task::harness::poll_future::{{closure}} - at /Users/xinxin22/.cargo/registry/src/mirrors.ustc.edu.cn-61ef6e0cd06fb9b8/tokio-1.21.2/src/runtime/task/harness.rs:480:19 - 55: as core::ops::function::FnOnce<()>>::call_once - at /rustc/a55dd71d5fb0ec5a6a3a9e8c27b2127ba491ce52/library/core/src/panic/unwind_safe.rs:271:9 - 56: std::panicking::try::do_call - at /rustc/a55dd71d5fb0ec5a6a3a9e8c27b2127ba491ce52/library/std/src/panicking.rs:492:40 - 57: ___rust_try - 58: std::panicking::try - at /rustc/a55dd71d5fb0ec5a6a3a9e8c27b2127ba491ce52/library/std/src/panicking.rs:456:19 - 59: std::panic::catch_unwind - at /rustc/a55dd71d5fb0ec5a6a3a9e8c27b2127ba491ce52/library/std/src/panic.rs:137:14 - 60: tokio::runtime::task::harness::poll_future - at /Users/xinxin22/.cargo/registry/src/mirrors.ustc.edu.cn-61ef6e0cd06fb9b8/tokio-1.21.2/src/runtime/task/harness.rs:468:18 - 61: tokio::runtime::task::harness::Harness::poll_inner - at /Users/xinxin22/.cargo/registry/src/mirrors.ustc.edu.cn-61ef6e0cd06fb9b8/tokio-1.21.2/src/runtime/task/harness.rs:104:27 - 62: tokio::runtime::task::harness::Harness::poll - at /Users/xinxin22/.cargo/registry/src/mirrors.ustc.edu.cn-61ef6e0cd06fb9b8/tokio-1.21.2/src/runtime/task/harness.rs:57:15 - 63: tokio::runtime::task::raw::poll - at /Users/xinxin22/.cargo/registry/src/mirrors.ustc.edu.cn-61ef6e0cd06fb9b8/tokio-1.21.2/src/runtime/task/raw.rs:194:5 - 64: tokio::runtime::task::raw::RawTask::poll - at /Users/xinxin22/.cargo/registry/src/mirrors.ustc.edu.cn-61ef6e0cd06fb9b8/tokio-1.21.2/src/runtime/task/raw.rs:134:18 - 65: tokio::runtime::task::UnownedTask::run - at /Users/xinxin22/.cargo/registry/src/mirrors.ustc.edu.cn-61ef6e0cd06fb9b8/tokio-1.21.2/src/runtime/task/mod.rs:422:9 - 66: tokio::runtime::blocking::pool::Task::run - at /Users/xinxin22/.cargo/registry/src/mirrors.ustc.edu.cn-61ef6e0cd06fb9b8/tokio-1.21.2/src/runtime/blocking/pool.rs:111:9 - 67: tokio::runtime::blocking::pool::Inner::run - at /Users/xinxin22/.cargo/registry/src/mirrors.ustc.edu.cn-61ef6e0cd06fb9b8/tokio-1.21.2/src/runtime/blocking/pool.rs:346:17 - 68: tokio::runtime::blocking::pool::Spawner::spawn_thread::{{closure}} - at /Users/xinxin22/.cargo/registry/src/mirrors.ustc.edu.cn-61ef6e0cd06fb9b8/tokio-1.21.2/src/runtime/blocking/pool.rs:321:13 - 69: std::sys_common::backtrace::__rust_begin_short_backtrace - at /rustc/a55dd71d5fb0ec5a6a3a9e8c27b2127ba491ce52/library/std/src/sys_common/backtrace.rs:122:18 - 70: std::thread::Builder::spawn_unchecked_::{{closure}}::{{closure}} - at /rustc/a55dd71d5fb0ec5a6a3a9e8c27b2127ba491ce52/library/std/src/thread/mod.rs:505:17 - 71: as core::ops::function::FnOnce<()>>::call_once - at /rustc/a55dd71d5fb0ec5a6a3a9e8c27b2127ba491ce52/library/core/src/panic/unwind_safe.rs:271:9 - 72: std::panicking::try::do_call - at /rustc/a55dd71d5fb0ec5a6a3a9e8c27b2127ba491ce52/library/std/src/panicking.rs:492:40 - 73: ___rust_try - 74: std::panicking::try - at /rustc/a55dd71d5fb0ec5a6a3a9e8c27b2127ba491ce52/library/std/src/panicking.rs:456:19 - 75: std::panic::catch_unwind - at /rustc/a55dd71d5fb0ec5a6a3a9e8c27b2127ba491ce52/library/std/src/panic.rs:137:14 - 76: std::thread::Builder::spawn_unchecked_::{{closure}} - at /rustc/a55dd71d5fb0ec5a6a3a9e8c27b2127ba491ce52/library/std/src/thread/mod.rs:504:30 - 77: core::ops::function::FnOnce::call_once{{vtable.shim}} - at /rustc/a55dd71d5fb0ec5a6a3a9e8c27b2127ba491ce52/library/core/src/ops/function.rs:248:5 - 78: as core::ops::function::FnOnce>::call_once - at /rustc/a55dd71d5fb0ec5a6a3a9e8c27b2127ba491ce52/library/alloc/src/boxed.rs:1935:9 - as core::ops::function::FnOnce>::call_once - at /rustc/a55dd71d5fb0ec5a6a3a9e8c27b2127ba491ce52/library/alloc/src/boxed.rs:1935:9 - std::sys::unix::thread::Thread::new::thread_start - at /rustc/a55dd71d5fb0ec5a6a3a9e8c27b2127ba491ce52/library/std/src/sys/unix/thread.rs:108:17 - 79: __pthread_deallocate - - Finished dev [unoptimized + debuginfo] target(s) in 0.36s - Running `target/debug/agent --discovery 'vintage://10.182.27.228:8080' --snapshot /Users/xinxin22/Sites/breeze/snapshot --service-path /Users/xinxin22/Sites/breeze/socks --log-dir /Users/xinxin22/Sites/breeze/logs --upgrade --port 9984 --log-level info` - Finished dev [unoptimized + debuginfo] target(s) in 0.34s - Running `target/debug/agent --discovery 'vintage://10.182.27.228:8080' --snapshot /Users/xinxin22/Sites/breeze/snapshot --service-path /Users/xinxin22/Sites/breeze/socks --log-dir /Users/xinxin22/Sites/breeze/logs --upgrade --port 9984 --log-level info` From 2145ffed3d95ce6b423d32389815d8c88013819a Mon Sep 17 00:00:00 2001 From: xinxin22 Date: Tue, 1 Nov 2022 14:53:35 +0800 Subject: [PATCH 25/34] =?UTF-8?q?=E5=87=BD=E6=95=B0=E5=90=8D=E5=AD=97?= =?UTF-8?q?=E6=9B=B4=E6=94=B9sample->basic?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- tests_ci/src/counterservice.rs | 12 ++++++------ tests_ci/src/redis.rs | 4 ++-- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/tests_ci/src/counterservice.rs b/tests_ci/src/counterservice.rs index bab2c9710..702a7a0df 100644 --- a/tests_ci/src/counterservice.rs +++ b/tests_ci/src/counterservice.rs @@ -62,7 +62,7 @@ fn test_consum_diff_write() { //轮询向指定列里发送 value为20 的key //再get 做断言 判断get到的val和set进去的val是否相等 #[test] -fn test_sample_set() { +fn test_basic_set() { test_set_key_value(44, 44); } @@ -123,7 +123,7 @@ fn test_diffkey_set() { // get key=> 得到所有列的值 // get 64 =>"repost:30,comment:30,like:30" #[test] -fn test_sample_get() { +fn test_basic_get() { test_set_key_value(6666666, 64); assert_eq!( @@ -145,7 +145,7 @@ fn test_sample_get() { // 6.del 1234567 验证结果是否为“” // 7. get key。repost 验证结果是否为nil #[test] -fn test_sample_del() { +fn test_basic_del() { let key = 123456789; let value = 456; assert_eq!( @@ -209,7 +209,7 @@ fn test_sample_del() { //4. incr整个key incr 223456789 报 Invalid key #[test] -fn test_sample_incrby() { +fn test_basic_incrby() { let key: u32 = 223456789; let value = 456; let incr_num = 2; @@ -248,7 +248,7 @@ fn test_sample_incrby() { //mincr key1 key2 // mget key1 key2 #[test] -fn test_sample_mincr() { +fn test_basic_mincr() { let v1 = 1111111; let v2 = 2222222; redis::cmd("DEL").arg(v1).arg(v2).execute(&mut get_conn()); @@ -291,7 +291,7 @@ fn test_sample_mincr() { //4. decr整个key decr 323456789 报 Invalid key #[test] -fn test_sample_decr() { +fn test_basic_decr() { let key: u32 = 323456789; let value = 456; let decr_num = 4; diff --git a/tests_ci/src/redis.rs b/tests_ci/src/redis.rs index cc7f740a2..5fe14de3b 100644 --- a/tests_ci/src/redis.rs +++ b/tests_ci/src/redis.rs @@ -502,7 +502,7 @@ fn test_hash_ops() { //get key =1 #[named] #[test] -fn getset_sample() { +fn getset_basic() { let arykey = function_name!(); let mut con = get_conn(&file!().get_host()); redis::cmd("DEL").arg(arykey).execute(&mut con); @@ -546,7 +546,7 @@ fn getset_sample() { #[named] #[test] -fn string_sample() { +fn string_basic() { let arykey = function_name!(); let mut con = get_conn(&file!().get_host()); redis::cmd("DEL").arg(arykey).execute(&mut con); From 61fbeb7d38d1c9d1ef5e6fa468d9216c108a491f Mon Sep 17 00:00:00 2001 From: xinxin22 Date: Tue, 1 Nov 2022 15:11:25 +0800 Subject: [PATCH 26/34] =?UTF-8?q?=E6=B5=8B=E8=AF=95=E5=9C=BA=E6=99=AF?= =?UTF-8?q?=E5=9C=A8=E6=96=87=E4=BB=B6=E5=BC=80=E5=A4=B4=E6=8F=8F=E8=BF=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- tests_ci/src/counterservice.rs | 12 ++++++++++++ tests_ci/src/redis.rs | 6 +++++- 2 files changed, 17 insertions(+), 1 deletion(-) diff --git a/tests_ci/src/counterservice.rs b/tests_ci/src/counterservice.rs index 702a7a0df..29b18cbdb 100644 --- a/tests_ci/src/counterservice.rs +++ b/tests_ci/src/counterservice.rs @@ -1,3 +1,14 @@ +//! # 已测试场景 +//! ## 基本操作验证 +//! - get set incr incrby del mincr decr +//! - mget 1w个key 少量key +//! # 异常场景 +//! - max-diff 当下一个setkey 超过当前最大key 提示too big +//! - key 类型错误(非long/没加配置列) 提示invaild key +//! 配置列错误 提示配置列错误 +//! ## 复杂场景 +//! - set 1 1, ..., set 10000 10000等一万个key已由java sdk预先写入, +//! 从mesh读取, 验证业务写入与mesh读取之间的一致性 use crate::ci::env::Mesh; use assert_panic::assert_panic; use rand::distributions::Alphanumeric; @@ -7,6 +18,7 @@ use std::collections::HashMap; use std::vec; use crate::ci::env::exists_key_iter; + #[allow(dead_code)] fn rand_num() -> u32 { let mut rng = rand::thread_rng(); diff --git a/tests_ci/src/redis.rs b/tests_ci/src/redis.rs index 5fe14de3b..a4f5be97f 100644 --- a/tests_ci/src/redis.rs +++ b/tests_ci/src/redis.rs @@ -6,10 +6,14 @@ //! - mget 两个key, 其中只有一个set了, 预期应有一个none结果 //! - basic del //! - basic incr +//! - 基础操作 decr, incrby, mset, exists, ttl, pttl, setnx, setex, expire, pexpire, expreat, pexpireat, persist //! - hash基本操作, set 两个field后,hgetall //! - hash基本操作, hmset 两个field后,hget +//! - hash基本操作hset, hsetnx, hmset, hincrby, hincrbyfloat, hdel, hget, hgetall, hlen, hkeys, hmget, hvals, hexists, hcan +//! - 地理位置相关 geoadd geohash geopos geodist +//! georadius georadiusbymember存在问题 //! - set基本操作, sadd 1, 2, 3后, smembers -//! - list基本操作, rpush, llen, lpop, lrange, lset +//! - list基本操作, lpush,rpush, rpushx, lpushx, linsert, lset, rpop, lpop, llen, lindex, lrange, ltrim, lrem //! - 单个zset基本操作, zadd, zrangebyscore withscore //!## 复杂场景 //! - set 1 1, ..., set 10000 10000等一万个key已由java sdk预先写入, From 1dac099dc7104bc5670b03dcbe9ff2140f90f850 Mon Sep 17 00:00:00 2001 From: xiaowang Date: Tue, 1 Nov 2022 15:59:24 +0800 Subject: [PATCH 27/34] =?UTF-8?q?=E5=9F=BA=E6=9C=AC=E5=91=BD=E4=BB=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- tests_ci/src/redis.rs | 161 ++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 157 insertions(+), 4 deletions(-) diff --git a/tests_ci/src/redis.rs b/tests_ci/src/redis.rs index a4f5be97f..fa1806c25 100644 --- a/tests_ci/src/redis.rs +++ b/tests_ci/src/redis.rs @@ -14,7 +14,19 @@ //! georadius georadiusbymember存在问题 //! - set基本操作, sadd 1, 2, 3后, smembers //! - list基本操作, lpush,rpush, rpushx, lpushx, linsert, lset, rpop, lpop, llen, lindex, lrange, ltrim, lrem -//! - 单个zset基本操作, zadd, zrangebyscore withscore +//! - 单个zset基本操作: +//! zadd、zincrby、zrem、zremrangebyrank、zremrangebyscore、 +//! zremrangebylex、zrevrange、zcard、zrange、zrangebyscore、 +//! zrevrank、zrevrangebyscore、zrangebylex、zrevrangebylex、 +//! zcount、zlexcount、zscore、zscan +//! - set基本操作: +//! sadd、smembers、srem、sismember、scard、spop、sscan +//! - Bitmap基本操作: +//! setbit、getbit、bitcount、bitpos、bitfield +//! - conn基本操作: +//! ping、command、select、quit +//! - string基本操作: +//! set、append、setrange、getrange、getset、strlen //!## 复杂场景 //! - set 1 1, ..., set 10000 10000等一万个key已由java sdk预先写入, //! 从mesh读取, 验证业务写入与mesh读取之间的一致性 @@ -24,9 +36,9 @@ use crate::ci::env::*; use crate::redis_helper::*; -use ::function_name::named; use chrono::prelude::*; -use redis::Commands; +use function_name::named; +use redis::{Commands, RedisError}; use std::collections::{HashMap, HashSet}; use std::time::Instant; use std::vec; @@ -619,7 +631,11 @@ fn string_basic() { assert_eq!(con.ttl(arykey), Ok(-1)); } -/// 单个zset基本操作, zadd, zrangebyscore withscore +/// 单个zset基本操作: +/// zadd、zincrby、zrem、zremrangebyrank、zremrangebyscore、 +/// zremrangebylex、zrevrange、zcard、zrange、zrangebyscore、 +/// zrevrank、zrevrangebyscore、zrangebylex、zrevrangebylex、 +/// zcount、zlexcount、zscore、zscan #[named] #[test] fn test_zset_basic() { @@ -706,6 +722,143 @@ fn test_zset_basic() { assert_eq!(con.zcard(arykey), Ok(4)); assert_eq!(con.zrank(arykey, "one"), Ok(0)); assert_eq!(con.zscore(arykey, "one"), Ok(1)); + + redis::cmd("DEL").arg(arykey).execute(&mut con); + let values = &[(1, "one".to_string()), (2, "two".to_string())]; + assert_eq!(con.zadd_multiple(arykey, values), Ok(2)); + + let res: Result<(i32, Vec), RedisError> = + redis::cmd("ZSCAN").arg(arykey).arg(0).query(&mut con); + assert!(res.is_ok()); + let (cur, mut s): (i32, Vec) = res.expect("ok"); + + s.sort_unstable(); + assert_eq!(cur, 0i32); + assert_eq!(s.len(), 4); + assert_eq!( + &s, + &[ + "1".to_string(), + "2".to_string(), + "one".to_string(), + "two".to_string() + ] + ); +} + +/// set基本操作: +/// sadd、smembers、srem、sismember、scard、spop、sscan +#[named] +#[test] +fn set_basic() { + let arykey = function_name!(); + let mut con = get_conn(&file!().get_host()); + redis::cmd("DEL").arg(arykey).execute(&mut con); + + assert_eq!(con.sadd(arykey, "one"), Ok(1)); + assert_eq!(con.sadd(arykey, "two"), Ok(1)); + + assert_eq!( + con.smembers(arykey), + Ok(vec!["two".to_string(), "one".to_string(),]) + ); + + assert_eq!(con.srem(arykey, "one"), Ok(1)); + assert_eq!(con.sismember(arykey, "one"), Ok(0)); + + assert_eq!(con.scard(arykey), Ok(1)); + + assert_eq!(con.srandmember(arykey), Ok("two".to_string())); + assert_eq!(con.spop(arykey), Ok("two".to_string())); + + assert_eq!(con.sadd(arykey, "hello"), Ok(1)); + assert_eq!(con.sadd(arykey, "hi"), Ok(1)); + + redis::cmd("DEL").arg("foo").execute(&mut con); + assert_eq!(con.sadd("foo", &[1, 2, 3]), Ok(3)); + let res: Result<(i32, Vec), RedisError> = + redis::cmd("SSCAN").arg("foo").arg(0).query(&mut con); + assert!(res.is_ok()); + let (cur, mut s): (i32, Vec) = res.expect("ok"); + + s.sort_unstable(); + assert_eq!(cur, 0i32); + assert_eq!(s.len(), 3); + assert_eq!(&s, &[1, 2, 3]); +} + +/// Bitmap基本操作: +/// setbit、getbit、bitcount、bitpos、bitfield +#[named] +#[test] +fn bit_basic() { + let arykey = function_name!(); + let mut con = get_conn(&file!().get_host()); + redis::cmd("DEL").arg(arykey).execute(&mut con); + + assert_eq!(con.setbit(arykey, 10086, true), Ok(0)); + assert_eq!(con.getbit(arykey, 10086), Ok(1)); + assert_eq!(con.bitcount(arykey), Ok(1)); + + let res: Result = redis::cmd("BITPOS") + .arg(arykey) + .arg(1) + .arg(0) + .query(&mut con); + assert!(res.is_ok()); + assert_eq!(res.expect("ok"), 10086); + + let res: Result, RedisError> = redis::cmd("BITFIELD") + .arg(arykey) + .arg("GET") + .arg("u4") + .arg("0") + .query(&mut con); + assert!(res.is_ok()); + assert_eq!(res.expect("ok"), &[0u8]); +} + +/// conn基本操作: +/// ping、command、select、quit +#[named] +#[test] +fn sys_basic() { + // hello、master 未实现 + let arykey = function_name!(); + let mut con = get_conn(&file!().get_host()); + redis::cmd("DEL").arg(arykey).execute(&mut con); + + let res: Result = redis::cmd("COMMAND").query(&mut con); + assert_eq!(res.expect("ok"), "OK".to_string()); + let res: Result = redis::cmd("PING").query(&mut con); + assert!(res.is_ok()); + assert_eq!(res.expect("ok"), "PONG".to_string()); + + let res: Result = redis::cmd("SELECT").arg(0).query(&mut con); + assert!(res.is_ok()); + assert_eq!(res.expect("ok"), "OK".to_string()); + + assert_eq!(redis::cmd("quit").query(&mut con), Ok("OK".to_string())); +} + +/// string基本操作: +/// set、append、setrange、getrange、getset、strlen +#[named] +#[test] +fn str_basic() { + let arykey = function_name!(); + let mut con = get_conn(&file!().get_host()); + redis::cmd("DEL").arg(arykey).execute(&mut con); + + assert_eq!(con.set(arykey, "Hello World"), Ok("OK".to_string())); + assert_eq!(con.setrange(arykey, 6, "Redis"), Ok(11)); + assert_eq!(con.getrange(arykey, 6, 10), Ok("Redis".to_string())); + assert_eq!( + con.getset(arykey, "Hello World"), + Ok("Hello Redis".to_string()) + ); + assert_eq!(con.append(arykey, "!"), Ok(12)); + assert_eq!(con.strlen(arykey), Ok(12)); } //github ci 过不了,本地可以过,不清楚原因 From 00739367455971ef8ae820d54c2c89c23be2ae5e Mon Sep 17 00:00:00 2001 From: hailong15 Date: Tue, 1 Nov 2022 16:13:53 +0800 Subject: [PATCH 28/34] add longset test --- tests_ci/src/redis.rs | 85 +++++++++++++++++++++++++++++++------------ 1 file changed, 62 insertions(+), 23 deletions(-) diff --git a/tests_ci/src/redis.rs b/tests_ci/src/redis.rs index fa1806c25..76ad50fa3 100644 --- a/tests_ci/src/redis.rs +++ b/tests_ci/src/redis.rs @@ -21,6 +21,9 @@ //! zcount、zlexcount、zscore、zscan //! - set基本操作: //! sadd、smembers、srem、sismember、scard、spop、sscan +//! - list基本操作, rpush, llen, lpop, lrange, lset +//! - 单个zset基本操作, zadd, zrangebyscore withscore +//! - 单个long set基本操作, lsset, lsdump, lsput, lsgetall, lsdel, lslen, lsmexists, lsdset //! - Bitmap基本操作: //! setbit、getbit、bitcount、bitpos、bitfield //! - conn基本操作: @@ -292,29 +295,6 @@ fn test_list_ops() { assert_eq!(con.lrange(arykey, 0, -1), Ok((1, 1, 5, 5))); } -#[named] -#[test] -fn test_list_longset_ops() { - // let arykey = function_name!(); - let arykey = "xinxin"; - let mut con = get_conn(&file!().get_host()); - // let mut con_ori = get_conn("10.182.27.228:8080"); - // redis::cmd("LSMALLOC").arg(arykey).execute(&mut con_ori); - // redis::cmd("DEL").arg(arykey).execute(&mut con); - // println!("{:?}", find_primes(10).capacity()); - // redis::cmd("LSDSET") - // .arg(arykey) - // .arg(2) - // .arg(find_primes(10)) - // .execute(&mut con); - // redis::cmd("LSPUT").arg(arykey).arg(2).execute(&mut con); - // redis::cmd("LSGETALL").arg(arykey).execute(&mut con); - // redis::cmd("LSDUMP").arg(arykey).arg(2).execute(&mut con); - // redis::cmd("LSLEN").arg(arykey).execute(&mut con); - - //assert_eq!(con.lsset(arykey, 5), Ok(4)); -} - /// - geoadd 添加地理位置经纬度 /// - geodist 获取km级别两个位置距离 /// - geopos 获取地理位置的坐标 @@ -631,6 +611,65 @@ fn string_basic() { assert_eq!(con.ttl(arykey), Ok(-1)); } +/// 单个long set基本操作, lsset, lsdump, lsput, lsgetall, lsdel, lslen, lsmexists, lsdset +#[named] +#[test] +fn test_lsset_basic() { + let arykey = function_name!(); + let mut con = get_conn(&file!().get_host()); + redis::cmd("DEL").arg(arykey).execute(&mut con); + + // lsmalloc arykey 8, lsput argkey 1后的实际内存表现 + let lsset = vec![ + 1u8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + ]; + redis::cmd("lsset") + .arg(arykey) + .arg(1) + .arg(&lsset) + .execute(&mut con); + assert_eq!( + redis::cmd("lsdump").arg(arykey).query(&mut con), + Ok(lsset.clone()) + ); + + assert_eq!( + redis::cmd("lsput").arg(arykey).arg(2).query(&mut con), + Ok(1) + ); + assert_eq!( + redis::cmd("lsgetall").arg(arykey).query(&mut con), + Ok((1, 2)) + ); + + assert_eq!( + redis::cmd("lsdel").arg(arykey).arg(2).query(&mut con), + Ok(1) + ); + assert_eq!(redis::cmd("lslen").arg(arykey).query(&mut con), Ok(1)); + assert_eq!( + redis::cmd("lsmexists") + .arg(arykey) + .arg(1) + .arg(2) + .query(&mut con), + Ok("10".to_string()) + ); + + let arykey = arykey.to_string() + "dset"; + redis::cmd("lsdset") + .arg(&arykey) + .arg(1) + .arg(&lsset) + .execute(&mut con); + assert_eq!( + redis::cmd("lsgetall").arg(&arykey).query(&mut con), + Ok((1,)) + ); +} + /// 单个zset基本操作: /// zadd、zincrby、zrem、zremrangebyrank、zremrangebyscore、 /// zremrangebylex、zrevrange、zcard、zrange、zrangebyscore、 From 0b1da081c46f552197e47698438aabc74db53f24 Mon Sep 17 00:00:00 2001 From: xiaowang Date: Tue, 1 Nov 2022 16:30:17 +0800 Subject: [PATCH 29/34] fix bug --- tests_ci/src/redis.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests_ci/src/redis.rs b/tests_ci/src/redis.rs index 76ad50fa3..ff92cbeaf 100644 --- a/tests_ci/src/redis.rs +++ b/tests_ci/src/redis.rs @@ -677,7 +677,7 @@ fn test_lsset_basic() { /// zcount、zlexcount、zscore、zscan #[named] #[test] -fn test_zset_basic() { +fn zset_basic() { let arykey = function_name!(); let mut con = get_conn(&file!().get_host()); redis::cmd("DEL").arg(arykey).execute(&mut con); @@ -799,7 +799,7 @@ fn set_basic() { assert_eq!( con.smembers(arykey), - Ok(vec!["two".to_string(), "one".to_string(),]) + Ok(vec!["one".to_string(), "two".to_string(),]) ); assert_eq!(con.srem(arykey, "one"), Ok(1)); From 826e6f4104f9fa8aea343b0ae5b938e531f25962 Mon Sep 17 00:00:00 2001 From: hailong15 Date: Tue, 1 Nov 2022 17:48:23 +0800 Subject: [PATCH 30/34] split mod --- Cargo.toml | 2 +- tests_ci/src/redis/cmd/hash.rs | 0 tests_ci/src/redis/integration/consistency.rs | 0 {tests_ci => tests_integration}/Cargo.toml | 2 +- {tests_ci => tests_integration}/src/all.rs | 0 {tests_ci => tests_integration}/src/ci.rs | 0 .../src/counterservice.rs | 0 {tests_ci => tests_integration}/src/mc.rs | 0 .../src/redis/basic/collection.rs | 511 +----------------- tests_integration/src/redis/basic/conn.rs | 29 + tests_integration/src/redis/basic/key.rs | 188 +++++++ tests_integration/src/redis/basic/mod.rs | 3 + tests_integration/src/redis/mod.rs | 141 +++++ .../src/redis_helper.rs | 0 14 files changed, 384 insertions(+), 492 deletions(-) delete mode 100644 tests_ci/src/redis/cmd/hash.rs delete mode 100644 tests_ci/src/redis/integration/consistency.rs rename {tests_ci => tests_integration}/Cargo.toml (94%) rename {tests_ci => tests_integration}/src/all.rs (100%) rename {tests_ci => tests_integration}/src/ci.rs (100%) rename {tests_ci => tests_integration}/src/counterservice.rs (100%) rename {tests_ci => tests_integration}/src/mc.rs (100%) rename tests_ci/src/redis.rs => tests_integration/src/redis/basic/collection.rs (51%) create mode 100644 tests_integration/src/redis/basic/conn.rs create mode 100644 tests_integration/src/redis/basic/key.rs create mode 100644 tests_integration/src/redis/basic/mod.rs create mode 100644 tests_integration/src/redis/mod.rs rename {tests_ci => tests_integration}/src/redis_helper.rs (100%) diff --git a/Cargo.toml b/Cargo.toml index 9f7c7a41b..0884ec81a 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -13,7 +13,7 @@ members = [ "ds", "rt", "tests", - "tests_ci", + "tests_integration", ] exclude = ["api", "tests"] diff --git a/tests_ci/src/redis/cmd/hash.rs b/tests_ci/src/redis/cmd/hash.rs deleted file mode 100644 index e69de29bb..000000000 diff --git a/tests_ci/src/redis/integration/consistency.rs b/tests_ci/src/redis/integration/consistency.rs deleted file mode 100644 index e69de29bb..000000000 diff --git a/tests_ci/Cargo.toml b/tests_integration/Cargo.toml similarity index 94% rename from tests_ci/Cargo.toml rename to tests_integration/Cargo.toml index 0f0554bac..cf7761eda 100644 --- a/tests_ci/Cargo.toml +++ b/tests_integration/Cargo.toml @@ -1,5 +1,5 @@ [package] -name = "tests_ci" +name = "tests_integration" version = "0.1.0" edition = "2021" diff --git a/tests_ci/src/all.rs b/tests_integration/src/all.rs similarity index 100% rename from tests_ci/src/all.rs rename to tests_integration/src/all.rs diff --git a/tests_ci/src/ci.rs b/tests_integration/src/ci.rs similarity index 100% rename from tests_ci/src/ci.rs rename to tests_integration/src/ci.rs diff --git a/tests_ci/src/counterservice.rs b/tests_integration/src/counterservice.rs similarity index 100% rename from tests_ci/src/counterservice.rs rename to tests_integration/src/counterservice.rs diff --git a/tests_ci/src/mc.rs b/tests_integration/src/mc.rs similarity index 100% rename from tests_ci/src/mc.rs rename to tests_integration/src/mc.rs diff --git a/tests_ci/src/redis.rs b/tests_integration/src/redis/basic/collection.rs similarity index 51% rename from tests_ci/src/redis.rs rename to tests_integration/src/redis/basic/collection.rs index ff92cbeaf..b44852a1e 100644 --- a/tests_ci/src/redis.rs +++ b/tests_integration/src/redis/basic/collection.rs @@ -1,242 +1,11 @@ -//! # 已测试场景 -//! ## 基本操作验证 -//! - basic set -//! - set 过期时间后, ttl > 0 -//! - mget 两个key -//! - mget 两个key, 其中只有一个set了, 预期应有一个none结果 -//! - basic del -//! - basic incr -//! - 基础操作 decr, incrby, mset, exists, ttl, pttl, setnx, setex, expire, pexpire, expreat, pexpireat, persist -//! - hash基本操作, set 两个field后,hgetall -//! - hash基本操作, hmset 两个field后,hget -//! - hash基本操作hset, hsetnx, hmset, hincrby, hincrbyfloat, hdel, hget, hgetall, hlen, hkeys, hmget, hvals, hexists, hcan -//! - 地理位置相关 geoadd geohash geopos geodist -//! georadius georadiusbymember存在问题 -//! - set基本操作, sadd 1, 2, 3后, smembers -//! - list基本操作, lpush,rpush, rpushx, lpushx, linsert, lset, rpop, lpop, llen, lindex, lrange, ltrim, lrem -//! - 单个zset基本操作: -//! zadd、zincrby、zrem、zremrangebyrank、zremrangebyscore、 -//! zremrangebylex、zrevrange、zcard、zrange、zrangebyscore、 -//! zrevrank、zrevrangebyscore、zrangebylex、zrevrangebylex、 -//! zcount、zlexcount、zscore、zscan -//! - set基本操作: -//! sadd、smembers、srem、sismember、scard、spop、sscan -//! - list基本操作, rpush, llen, lpop, lrange, lset -//! - 单个zset基本操作, zadd, zrangebyscore withscore -//! - 单个long set基本操作, lsset, lsdump, lsput, lsgetall, lsdel, lslen, lsmexists, lsdset -//! - Bitmap基本操作: -//! setbit、getbit、bitcount、bitpos、bitfield -//! - conn基本操作: -//! ping、command、select、quit -//! - string基本操作: -//! set、append、setrange、getrange、getset、strlen -//!## 复杂场景 -//! - set 1 1, ..., set 10000 10000等一万个key已由java sdk预先写入, -//! 从mesh读取, 验证业务写入与mesh读取之间的一致性 -//! - value大小数组[4, 40, 400, 4000, 8000, 20000, 3000000],依次set后随机set,验证buffer扩容 -//! - key大小数组[4, 40, 400, 4000], 依次set后get -//! - pipiline方式,set 两个key后,mget读取(注释了,暂未验证) - +//! 各种数据结构的测试 use crate::ci::env::*; +use crate::redis::RESTYPE; use crate::redis_helper::*; -use chrono::prelude::*; use function_name::named; use redis::{Commands, RedisError}; -use std::collections::{HashMap, HashSet}; -use std::time::Instant; +use std::collections::HashSet; use std::vec; -use std::{thread, time}; - -//获i64 -fn find_primes(n: usize) -> Vec { - let mut result = Vec::new(); - let mut is_prime = vec![true; n + 1]; - - for i in 2..=n { - if is_prime[i] { - result.push(i as i64); - } - - ((i * 2)..=n).into_iter().step_by(i).for_each(|x| { - is_prime[x] = false; - }); - } - result -} - -//基本场景 -#[test] -fn test_args() { - let mut con = get_conn(&file!().get_host()); - - redis::cmd("SET") - .arg("key1args") - .arg(b"foo") - .execute(&mut con); - redis::cmd("SET") - .arg(&["key2args", "bar"]) - .execute(&mut con); - - assert_eq!( - redis::cmd("MGET") - .arg(&["key1args", "key2args"]) - .query(&mut con), - Ok(("foo".to_string(), b"bar".to_vec())) - ); -} - -//基本set场景,key固定为foo或bar,value为简单数字或字符串 -#[test] -fn test_basic_set() { - let mut con = get_conn(&file!().get_host()); - - redis::cmd("SET").arg("fooset").arg(42).execute(&mut con); - assert_eq!(redis::cmd("GET").arg("fooset").query(&mut con), Ok(42)); - - redis::cmd("SET").arg("barset").arg("foo").execute(&mut con); - assert_eq!( - redis::cmd("GET").arg("barset").query(&mut con), - Ok(b"foo".to_vec()) - ); -} - -// set 过期时间后, ttl > 0 -#[named] -#[test] -fn test_set_expire() { - let arykey = function_name!(); - let mut con = get_conn(&file!().get_host()); - - redis::cmd("SET") - .arg(arykey) - .arg(42usize) - .arg("EX") - .arg(3) - .execute(&mut con); - let ttl: usize = redis::cmd("TTL") - .arg(arykey) - .query(&mut con) - .expect("ttl err"); - assert!(ttl > 0); -} - -/// mget 两个key, 其中只有一个set了, 预期应有一个none结果 -#[named] -#[test] -fn test_set_optionals() { - let arykey = function_name!(); - let mut con = get_conn(&file!().get_host()); - - redis::cmd("SET").arg(arykey).arg(1).execute(&mut con); - - let (a, b): (Option, Option) = redis::cmd("MGET") - .arg(arykey) - .arg("missing") - .query(&mut con) - .unwrap(); - assert_eq!(a, Some(1i32)); - assert_eq!(b, None); -} - -#[named] -#[test] -fn test_basic_del() { - let arykey = function_name!(); - let mut con = get_conn(&file!().get_host()); - - redis::cmd("SET").arg(arykey).arg(42).execute(&mut con); - - assert_eq!(redis::cmd("GET").arg(arykey).query(&mut con), Ok(42)); - - redis::cmd("DEL").arg(arykey).execute(&mut con); - - assert_eq!( - redis::cmd("GET").arg(arykey).query(&mut con), - Ok(None::) - ); -} - -#[named] -#[test] -fn test_basic_incr() { - let arykey = function_name!(); - let mut con = get_conn(&file!().get_host()); - - redis::cmd("SET").arg(arykey).arg(42).execute(&mut con); - assert_eq!(redis::cmd("INCR").arg(arykey).query(&mut con), Ok(43usize)); -} - -/// hset 两个field后,hgetall -#[named] -#[test] -fn test_hash_hset_hgetall() { - let arykey = function_name!(); - let mut con = get_conn(&file!().get_host()); - - redis::cmd("HSET") - .arg(arykey) - .arg("key_1") - .arg(1) - .execute(&mut con); - redis::cmd("HSET") - .arg(arykey) - .arg("key_2") - .arg(2) - .execute(&mut con); - - let h: HashMap = redis::cmd("HGETALL") - .arg(arykey) - .query(&mut con) - .expect("hgetall err"); - assert_eq!(h.len(), 2); - assert_eq!(h.get("key_1"), Some(&1i32)); - assert_eq!(h.get("key_2"), Some(&2i32)); -} - -/// hmset 两个field后,hget -#[named] -#[test] -fn test_hash_hmset() { - let arykey = function_name!(); - let mut con = get_conn(&file!().get_host()); - redis::cmd("DEL").arg(arykey).execute(&mut con); - - redis::cmd("HMSET") - .arg(arykey) - .arg(&[("field_1", 42), ("field_2", 23)]) - .execute(&mut con); - - assert_eq!( - redis::cmd("HGET") - .arg(arykey) - .arg("field_1") - .query(&mut con), - Ok(42) - ); - assert_eq!( - redis::cmd("HGET") - .arg(arykey) - .arg("field_2") - .query(&mut con), - Ok(23) - ); -} - -///sadd 1, 2, 3后, smembers -#[named] -#[test] -fn test_set_ops() { - let arykey = function_name!(); - let mut con = get_conn(&file!().get_host()); - redis::cmd("DEL").arg(arykey).execute(&mut con); - - assert_eq!(con.sadd(arykey, &[1, 2, 3]), Ok(3)); - - let mut s: Vec = con.smembers(arykey).unwrap(); - s.sort_unstable(); - assert_eq!(s.len(), 3); - assert_eq!(&s, &[1, 2, 3]); -} ///list基本操作: /// - lpush 插入四个 rpush插入4个 @@ -262,7 +31,7 @@ fn test_set_ops() { #[test] fn test_list_ops() { let arykey = function_name!(); - let mut con = get_conn(&file!().get_host()); + let mut con = get_conn(&RESTYPE.get_host()); redis::cmd("DEL").arg(arykey).execute(&mut con); assert_eq!(con.lpush(arykey, &[1, 2]), Ok(2)); @@ -307,7 +76,7 @@ fn test_list_ops() { #[test] fn test_geo_ops() { let arykey = function_name!(); - let mut con = get_conn(&file!().get_host()); + let mut con = get_conn(&RESTYPE.get_host()); redis::cmd("DEL").arg(arykey).execute(&mut con); assert_eq!( @@ -411,7 +180,7 @@ fn test_geo_ops() { #[test] fn test_hash_ops() { let arykey = function_name!(); - let mut con = get_conn(&file!().get_host()); + let mut con = get_conn(&RESTYPE.get_host()); redis::cmd("DEL").arg(arykey).execute(&mut con); redis::cmd("DEL").arg("hashkey").execute(&mut con); @@ -492,123 +261,24 @@ fn test_hash_ops() { assert!(hscan_match_found.contains(&("filed6".to_string(), 6))); } -//getset key不存在时 返回nil 并set key -//get key =2 -//getset key 1 返回旧值2 -//get key =1 -#[named] -#[test] -fn getset_basic() { - let arykey = function_name!(); - let mut con = get_conn(&file!().get_host()); - redis::cmd("DEL").arg(arykey).execute(&mut con); - - assert_eq!( - con.getset::<&str, i32, Option>(arykey, 2) - .map_err(|e| panic!("set error:{:?}", e)) - .expect("set err"), - None - ); - assert_eq!(con.get(arykey), Ok(2)); - assert_eq!(con.getset(arykey, 1), Ok(2)); - assert_eq!(con.get(arykey), Ok(1)); -} - -/// - mset ("xinxinkey1", 1), ("xinxinkey2", 2), ("xinxinkey3", 3),(arykey, 4) -/// - expire_at 设置xinxinkey1的过期时间为当前秒级别时间戳+2s -/// - setex key2 4 22 将key2 value 改成22并设置过期时间4s -/// - ttl/pttl key3存在 但是没有设置过期时间=》-1 -/// - ttl key1没过期 -/// - sleep 2s -/// - pttl key2 没过期 -/// - get value为22 -/// - exists 检查key1不存在 因为已经过期 =》0 -/// - ttl/pttl key1不存在时=》-2 -/// - setnx key1 2 =>1 key1不存在(因为已经过期被删掉)才能setnx成功 -/// - get key1 =>11 -/// - setnx 已经存在的key3 =>0 -/// - expire key3过期时间为1s -/// - incrby 4 =>8 -/// - decrby 2 =>6 -/// - decr =>5 -/// - incrbyfloat 4.4 =>9.4 -/// - pexpireat 设置arykey的过期时间为当前时间戳+2000ms p都是ms级别 -/// - sleep 1s -/// - pexpire 设置arykey过期时间为5000ms -/// - ttl arykey过期时间》2000 由于pexpire把key3过期时间覆盖 -/// - exists key3 0 已经过期 -/// - persist arykey 移除过期时间 -/// - ttl arykey -1 已经移除 - +/// string基本操作: +/// set、append、setrange、getrange、getset、strlen #[named] #[test] -fn string_basic() { +fn str_basic() { let arykey = function_name!(); - let mut con = get_conn(&file!().get_host()); + let mut con = get_conn(&RESTYPE.get_host()); redis::cmd("DEL").arg(arykey).execute(&mut con); - redis::cmd("DEL").arg("xinxinkey1").execute(&mut con); - redis::cmd("DEL").arg("xinxinkey2").execute(&mut con); - redis::cmd("DEL").arg("xinxinkey3").execute(&mut con); - assert_eq!( - con.set_multiple(&[ - ("xinxinkey1", 1), - ("xinxinkey2", 2), - ("xinxinkey3", 3), - (arykey, 4) - ]), - Ok(true) - ); - - let now = Local::now().timestamp(); - let pttl_now = Instant::now(); - assert_eq!(con.expire_at("xinxinkey1", (now + 2) as usize), Ok(1)); - assert_eq!(con.set_ex("xinxinkey2", 22, 4), Ok(true)); - - assert_eq!(con.ttl("xinxinkey3"), Ok(-1)); - assert_eq!(con.pttl("xinxinkey3"), Ok(-1)); - - assert_eq!( - con.ttl("xinxinkey1"), - Ok(4 - pttl_now.elapsed().as_secs() > 0) - ); - - thread::sleep(time::Duration::from_secs(2)); - - assert_eq!( - con.pttl("xinxinkey2"), - Ok(4000 - pttl_now.elapsed().as_millis() > 0) - ); - assert_eq!(con.get("xinxinkey2"), Ok(22)); - - assert_eq!(con.exists("xinxinkey1"), Ok(0)); - assert_eq!(con.ttl("xinxinkey1"), Ok(-2)); - assert_eq!(con.pttl("xinxinkey1"), Ok(-2)); - assert_eq!(con.set_nx("xinxinkey1", 11), Ok(1)); - assert_eq!(con.get("xinxinkey1"), Ok(11)); - assert_eq!(con.set_nx("xinxinkey3", 2), Ok(0)); - - assert_eq!(con.expire("xinxinkey3", 1), Ok(1)); - - assert_eq!(con.incr(arykey, 4), Ok(8)); - assert_eq!(con.decr(arykey, 2), Ok(6)); - assert_eq!(redis::cmd("DECR").arg(arykey).query(&mut con), Ok(5)); - assert_eq!(con.incr(arykey, 4.4), Ok(9.4)); - - assert_eq!( - con.pexpire_at(arykey, (Local::now().timestamp_millis() + 2000) as usize), - Ok(1) - ); - thread::sleep(time::Duration::from_secs(1)); - assert_eq!(con.pexpire(arykey, 5000 as usize), Ok(1)); + assert_eq!(con.set(arykey, "Hello World"), Ok("OK".to_string())); + assert_eq!(con.setrange(arykey, 6, "Redis"), Ok(11)); + assert_eq!(con.getrange(arykey, 6, 10), Ok("Redis".to_string())); assert_eq!( - con.ttl(arykey), - Ok(5000 - Instant::now().elapsed().as_millis() > 2000) + con.getset(arykey, "Hello World"), + Ok("Hello Redis".to_string()) ); - assert_eq!(con.exists("xinxinkey3"), Ok(0)); - - assert_eq!(con.persist(arykey), Ok(1)); - assert_eq!(con.ttl(arykey), Ok(-1)); + assert_eq!(con.append(arykey, "!"), Ok(12)); + assert_eq!(con.strlen(arykey), Ok(12)); } /// 单个long set基本操作, lsset, lsdump, lsput, lsgetall, lsdel, lslen, lsmexists, lsdset @@ -616,7 +286,7 @@ fn string_basic() { #[test] fn test_lsset_basic() { let arykey = function_name!(); - let mut con = get_conn(&file!().get_host()); + let mut con = get_conn(&RESTYPE.get_host()); redis::cmd("DEL").arg(arykey).execute(&mut con); // lsmalloc arykey 8, lsput argkey 1后的实际内存表现 @@ -679,7 +349,7 @@ fn test_lsset_basic() { #[test] fn zset_basic() { let arykey = function_name!(); - let mut con = get_conn(&file!().get_host()); + let mut con = get_conn(&RESTYPE.get_host()); redis::cmd("DEL").arg(arykey).execute(&mut con); let values = &[ @@ -791,7 +461,7 @@ fn zset_basic() { #[test] fn set_basic() { let arykey = function_name!(); - let mut con = get_conn(&file!().get_host()); + let mut con = get_conn(&RESTYPE.get_host()); redis::cmd("DEL").arg(arykey).execute(&mut con); assert_eq!(con.sadd(arykey, "one"), Ok(1)); @@ -832,7 +502,7 @@ fn set_basic() { #[test] fn bit_basic() { let arykey = function_name!(); - let mut con = get_conn(&file!().get_host()); + let mut con = get_conn(&RESTYPE.get_host()); redis::cmd("DEL").arg(arykey).execute(&mut con); assert_eq!(con.setbit(arykey, 10086, true), Ok(0)); @@ -856,142 +526,3 @@ fn bit_basic() { assert!(res.is_ok()); assert_eq!(res.expect("ok"), &[0u8]); } - -/// conn基本操作: -/// ping、command、select、quit -#[named] -#[test] -fn sys_basic() { - // hello、master 未实现 - let arykey = function_name!(); - let mut con = get_conn(&file!().get_host()); - redis::cmd("DEL").arg(arykey).execute(&mut con); - - let res: Result = redis::cmd("COMMAND").query(&mut con); - assert_eq!(res.expect("ok"), "OK".to_string()); - let res: Result = redis::cmd("PING").query(&mut con); - assert!(res.is_ok()); - assert_eq!(res.expect("ok"), "PONG".to_string()); - - let res: Result = redis::cmd("SELECT").arg(0).query(&mut con); - assert!(res.is_ok()); - assert_eq!(res.expect("ok"), "OK".to_string()); - - assert_eq!(redis::cmd("quit").query(&mut con), Ok("OK".to_string())); -} - -/// string基本操作: -/// set、append、setrange、getrange、getset、strlen -#[named] -#[test] -fn str_basic() { - let arykey = function_name!(); - let mut con = get_conn(&file!().get_host()); - redis::cmd("DEL").arg(arykey).execute(&mut con); - - assert_eq!(con.set(arykey, "Hello World"), Ok("OK".to_string())); - assert_eq!(con.setrange(arykey, 6, "Redis"), Ok(11)); - assert_eq!(con.getrange(arykey, 6, 10), Ok("Redis".to_string())); - assert_eq!( - con.getset(arykey, "Hello World"), - Ok("Hello Redis".to_string()) - ); - assert_eq!(con.append(arykey, "!"), Ok(12)); - assert_eq!(con.strlen(arykey), Ok(12)); -} - -//github ci 过不了,本地可以过,不清楚原因 -/// pipiline方式,set 两个key后,mget读取 -// #[test] -// fn test_pipeline() { -// let mut con = get_conn(&file!().get_host()); - -// let ((k1, k2),): ((i32, i32),) = redis::pipe() -// .cmd("SET") -// .arg("pipelinekey_1") -// .arg(42) -// .ignore() -// .cmd("SET") -// .arg("pipelinekey_2") -// .arg(43) -// .ignore() -// .cmd("MGET") -// .arg(&["pipelinekey_1", "pipelinekey_2"]) -// .query(&mut con) -// .unwrap(); - -// assert_eq!(k1, 42); -// assert_eq!(k2, 43); -// } - -/// set 1 1, ..., set 10000 10000等一万个key已由java sdk预先写入, -/// 从mesh读取, 验证业务写入与mesh读取之间的一致性 -#[test] -fn test_get_write_by_sdk() { - let mut con = get_conn(&file!().get_host()); - for i in exists_key_iter() { - assert_eq!(redis::cmd("GET").arg(i).query(&mut con), Ok(i)); - } -} - -///依次set [4, 40, 400, 4000, 8000, 20000, 3000000]大小的value -///验证buffer扩容,buffer初始容量4K,扩容每次扩容两倍 -///后将[4, 40, 400, 4000, 8000, 20000, 3000000] shuffle后再依次set -///测试步骤: -/// 1. set, key value size 4k以下,4次 -/// 3. set key value size 4k~8k,一次, buffer由4k扩容到8k -/// 4. set key value size 8k~16k,一次,buffer在一次请求中扩容两次,由8k扩容到16k,16k扩容到32k, -/// 5. set, key value size 2M以上,1次 -/// 6. 以上set请求乱序set一遍 -#[named] -#[test] -fn test_set_value_fix_size() { - let arykey = function_name!(); - let mut con = get_conn(&file!().get_host()); - - let mut v_sizes = [4, 40, 400, 4000, 8000, 20000, 3000000]; - for v_size in v_sizes { - let val = vec![1u8; v_size]; - redis::cmd("SET").arg(arykey).arg(&val).execute(&mut con); - assert_eq!(redis::cmd("GET").arg(arykey).query(&mut con), Ok(val)); - } - - //todo random iter - use rand::seq::SliceRandom; - let mut rng = rand::thread_rng(); - v_sizes.shuffle(&mut rng); - for v_size in v_sizes { - let val = vec![1u8; v_size]; - redis::cmd("SET").arg(arykey).arg(&val).execute(&mut con); - assert_eq!(redis::cmd("GET").arg(arykey).query(&mut con), Ok(val)); - } -} - -///依次set key长度为[4, 40, 400, 4000] -#[test] -fn test_set_key_fix_size() { - let mut con = get_conn(&file!().get_host()); - - let key_sizes = [4, 40, 400, 4000]; - for key_size in key_sizes { - let key = vec![1u8; key_size]; - redis::cmd("SET").arg(&key).arg("foo").execute(&mut con); - assert_eq!( - redis::cmd("GET").arg(&key).query(&mut con), - Ok("foo".to_string()) - ); - } -} - -//mget 获取10000个key -#[test] -fn test_mget_10000() { - let mut con = get_conn(&file!().get_host()); - - let maxkey = 10000; - let mut keys = Vec::with_capacity(maxkey); - for i in 1..=maxkey { - keys.push(i); - } - assert_eq!(redis::cmd("MGET").arg(&keys).query(&mut con), Ok(keys)); -} diff --git a/tests_integration/src/redis/basic/conn.rs b/tests_integration/src/redis/basic/conn.rs new file mode 100644 index 000000000..39ac808a4 --- /dev/null +++ b/tests_integration/src/redis/basic/conn.rs @@ -0,0 +1,29 @@ +//! 针对连接的测试 +use crate::ci::env::*; +use crate::redis::RESTYPE; +use crate::redis_helper::*; +use function_name::named; +use redis::RedisError; + +/// conn基本操作: +/// ping、command、select、quit +#[named] +#[test] +fn sys_basic() { + // hello、master 未实现 + let arykey = function_name!(); + let mut con = get_conn(&RESTYPE.get_host()); + redis::cmd("DEL").arg(arykey).execute(&mut con); + + let res: Result = redis::cmd("COMMAND").query(&mut con); + assert_eq!(res.expect("ok"), "OK".to_string()); + let res: Result = redis::cmd("PING").query(&mut con); + assert!(res.is_ok()); + assert_eq!(res.expect("ok"), "PONG".to_string()); + + let res: Result = redis::cmd("SELECT").arg(0).query(&mut con); + assert!(res.is_ok()); + assert_eq!(res.expect("ok"), "OK".to_string()); + + assert_eq!(redis::cmd("quit").query(&mut con), Ok("OK".to_string())); +} diff --git a/tests_integration/src/redis/basic/key.rs b/tests_integration/src/redis/basic/key.rs new file mode 100644 index 000000000..8b2429a9a --- /dev/null +++ b/tests_integration/src/redis/basic/key.rs @@ -0,0 +1,188 @@ +//! 针对key相关基本测试,如set,get,过期等 +use crate::ci::env::*; +use crate::redis::RESTYPE; +use crate::redis_helper::*; +use chrono::prelude::*; +use function_name::named; +use redis::Commands; +use std::time::Instant; +use std::{thread, time}; + +//基本set场景,key固定为foo或bar,value为简单数字或字符串 +#[test] +fn test_basic_set() { + let mut con = get_conn(&RESTYPE.get_host()); + + redis::cmd("SET").arg("fooset").arg(42).execute(&mut con); + assert_eq!(redis::cmd("GET").arg("fooset").query(&mut con), Ok(42)); + + redis::cmd("SET").arg("barset").arg("foo").execute(&mut con); + assert_eq!( + redis::cmd("GET").arg("barset").query(&mut con), + Ok(b"foo".to_vec()) + ); +} + +/// mget 两个key, 其中只有一个set了, 预期应有一个none结果 +#[named] +#[test] +fn test_set_optionals() { + let arykey = function_name!(); + let mut con = get_conn(&RESTYPE.get_host()); + + redis::cmd("SET").arg(arykey).arg(1).execute(&mut con); + + let (a, b): (Option, Option) = redis::cmd("MGET") + .arg(arykey) + .arg("missing") + .query(&mut con) + .unwrap(); + assert_eq!(a, Some(1i32)); + assert_eq!(b, None); +} + +#[named] +#[test] +fn test_basic_del() { + let arykey = function_name!(); + let mut con = get_conn(&RESTYPE.get_host()); + + redis::cmd("SET").arg(arykey).arg(42).execute(&mut con); + + assert_eq!(redis::cmd("GET").arg(arykey).query(&mut con), Ok(42)); + + redis::cmd("DEL").arg(arykey).execute(&mut con); + + assert_eq!( + redis::cmd("GET").arg(arykey).query(&mut con), + Ok(None::) + ); +} + +#[named] +#[test] +fn test_basic_incr() { + let arykey = function_name!(); + let mut con = get_conn(&RESTYPE.get_host()); + + redis::cmd("SET").arg(arykey).arg(42).execute(&mut con); + assert_eq!(redis::cmd("INCR").arg(arykey).query(&mut con), Ok(43usize)); +} + +//getset key不存在时 返回nil 并set key +//get key =2 +//getset key 1 返回旧值2 +//get key =1 +#[named] +#[test] +fn getset_basic() { + let arykey = function_name!(); + let mut con = get_conn(&RESTYPE.get_host()); + redis::cmd("DEL").arg(arykey).execute(&mut con); + + assert_eq!( + con.getset::<&str, i32, Option>(arykey, 2) + .map_err(|e| panic!("set error:{:?}", e)) + .expect("set err"), + None + ); + assert_eq!(con.get(arykey), Ok(2)); + assert_eq!(con.getset(arykey, 1), Ok(2)); + assert_eq!(con.get(arykey), Ok(1)); +} + +/// - mset ("xinxinkey1", 1), ("xinxinkey2", 2), ("xinxinkey3", 3),(arykey, 4) +/// - expire_at 设置xinxinkey1的过期时间为当前秒级别时间戳+2s +/// - setex key2 4 22 将key2 value 改成22并设置过期时间4s +/// - ttl/pttl key3存在 但是没有设置过期时间=》-1 +/// - ttl key1没过期 +/// - sleep 2s +/// - pttl key2 没过期 +/// - get value为22 +/// - exists 检查key1不存在 因为已经过期 =》0 +/// - ttl/pttl key1不存在时=》-2 +/// - setnx key1 2 =>1 key1不存在(因为已经过期被删掉)才能setnx成功 +/// - get key1 =>11 +/// - setnx 已经存在的key3 =>0 +/// - expire key3过期时间为1s +/// - incrby 4 =>8 +/// - decrby 2 =>6 +/// - decr =>5 +/// - incrbyfloat 4.4 =>9.4 +/// - pexpireat 设置arykey的过期时间为当前时间戳+2000ms p都是ms级别 +/// - sleep 1s +/// - pexpire 设置arykey过期时间为5000ms +/// - ttl arykey过期时间》2000 由于pexpire把key3过期时间覆盖 +/// - exists key3 0 已经过期 +/// - persist arykey 移除过期时间 +/// - ttl arykey -1 已经移除 +#[named] +#[test] +fn string_basic() { + let arykey = function_name!(); + let mut con = get_conn(&RESTYPE.get_host()); + redis::cmd("DEL").arg(arykey).execute(&mut con); + redis::cmd("DEL").arg("xinxinkey1").execute(&mut con); + redis::cmd("DEL").arg("xinxinkey2").execute(&mut con); + redis::cmd("DEL").arg("xinxinkey3").execute(&mut con); + assert_eq!( + con.set_multiple(&[ + ("xinxinkey1", 1), + ("xinxinkey2", 2), + ("xinxinkey3", 3), + (arykey, 4) + ]), + Ok(true) + ); + + let now = Local::now().timestamp(); + let pttl_now = Instant::now(); + assert_eq!(con.expire_at("xinxinkey1", (now + 2) as usize), Ok(1)); + assert_eq!(con.set_ex("xinxinkey2", 22, 4), Ok(true)); + + assert_eq!(con.ttl("xinxinkey3"), Ok(-1)); + assert_eq!(con.pttl("xinxinkey3"), Ok(-1)); + + assert_eq!( + con.ttl("xinxinkey1"), + Ok(4 - pttl_now.elapsed().as_secs() > 0) + ); + + thread::sleep(time::Duration::from_secs(2)); + + assert_eq!( + con.pttl("xinxinkey2"), + Ok(4000 - pttl_now.elapsed().as_millis() > 0) + ); + assert_eq!(con.get("xinxinkey2"), Ok(22)); + + assert_eq!(con.exists("xinxinkey1"), Ok(0)); + assert_eq!(con.ttl("xinxinkey1"), Ok(-2)); + assert_eq!(con.pttl("xinxinkey1"), Ok(-2)); + + assert_eq!(con.set_nx("xinxinkey1", 11), Ok(1)); + assert_eq!(con.get("xinxinkey1"), Ok(11)); + assert_eq!(con.set_nx("xinxinkey3", 2), Ok(0)); + + assert_eq!(con.expire("xinxinkey3", 1), Ok(1)); + + assert_eq!(con.incr(arykey, 4), Ok(8)); + assert_eq!(con.decr(arykey, 2), Ok(6)); + assert_eq!(redis::cmd("DECR").arg(arykey).query(&mut con), Ok(5)); + assert_eq!(con.incr(arykey, 4.4), Ok(9.4)); + + assert_eq!( + con.pexpire_at(arykey, (Local::now().timestamp_millis() + 2000) as usize), + Ok(1) + ); + thread::sleep(time::Duration::from_secs(1)); + assert_eq!(con.pexpire(arykey, 5000 as usize), Ok(1)); + assert_eq!( + con.ttl(arykey), + Ok(5000 - Instant::now().elapsed().as_millis() > 2000) + ); + assert_eq!(con.exists("xinxinkey3"), Ok(0)); + + assert_eq!(con.persist(arykey), Ok(1)); + assert_eq!(con.ttl(arykey), Ok(-1)); +} diff --git a/tests_integration/src/redis/basic/mod.rs b/tests_integration/src/redis/basic/mod.rs new file mode 100644 index 000000000..f2a644d63 --- /dev/null +++ b/tests_integration/src/redis/basic/mod.rs @@ -0,0 +1,3 @@ +mod collection; +mod conn; +mod key; diff --git a/tests_integration/src/redis/mod.rs b/tests_integration/src/redis/mod.rs new file mode 100644 index 000000000..3e1361bc3 --- /dev/null +++ b/tests_integration/src/redis/mod.rs @@ -0,0 +1,141 @@ +//! # 已测试场景 +//! ## 基本操作验证 +//! ### key +//! - basic set +//! - mget 两个key, 其中只有一个set了, 预期应有一个none结果 +//! - basic del +//! - basic incr +//! - 基础操作 decr, incrby, mset, exists, ttl, pttl, setnx, setex, expire, pexpire, expreat, pexpireat, persist +//! ### collection +//! - hash基本操作hset, hsetnx, hmset, hincrby, hincrbyfloat, hdel, hget, hgetall, hlen, hkeys, hmget, hvals, hexists, hcan +//! - 地理位置相关 geoadd geohash geopos geodist +//! georadius georadiusbymember存在问题 +//! - list基本操作, lpush,rpush, rpushx, lpushx, linsert, lset, rpop, lpop, llen, lindex, lrange, ltrim, lrem +//! - 单个zset基本操作: +//! zadd、zincrby、zrem、zremrangebyrank、zremrangebyscore、 +//! zremrangebylex、zrevrange、zcard、zrange、zrangebyscore、 +//! zrevrank、zrevrangebyscore、zrangebylex、zrevrangebylex、 +//! zcount、zlexcount、zscore、zscan +//! - set基本操作: +//! sadd、smembers、srem、sismember、scard、spop、sscan +//! - list基本操作, rpush, llen, lpop, lrange, lset +//! - 单个zset基本操作, zadd, zrangebyscore withscore +//! - 单个long set基本操作, lsset, lsdump, lsput, lsgetall, lsdel, lslen, lsmexists, lsdset +//! - Bitmap基本操作: +//! setbit、getbit、bitcount、bitpos、bitfield +//! - string基本操作: +//! set、append、setrange、getrange、getset、strlen +//! ### conn +//! - conn基本操作: +//! ping、command、select、quit +//!## 复杂场景 +//! - set 1 1, ..., set 10000 10000等一万个key已由java sdk预先写入, +//! 从mesh读取, 验证业务写入与mesh读取之间的一致性 +//! - value大小数组[4, 40, 400, 4000, 8000, 20000, 3000000],依次set后随机set,验证buffer扩容 +//! - key大小数组[4, 40, 400, 4000], 依次set后get +//! - pipiline方式,set 两个key后,mget读取(注释了,暂未验证) + +mod basic; + +const RESTYPE: &str = "redis"; + +use crate::ci::env::*; +use crate::redis_helper::*; +use function_name::named; +use std::vec; + +//github ci 过不了,本地可以过,不清楚原因 +/// pipiline方式,set 两个key后,mget读取 +// #[test] +// fn test_pipeline() { +// let mut con = get_conn(&RESTYPE.get_host()); + +// let ((k1, k2),): ((i32, i32),) = redis::pipe() +// .cmd("SET") +// .arg("pipelinekey_1") +// .arg(42) +// .ignore() +// .cmd("SET") +// .arg("pipelinekey_2") +// .arg(43) +// .ignore() +// .cmd("MGET") +// .arg(&["pipelinekey_1", "pipelinekey_2"]) +// .query(&mut con) +// .unwrap(); + +// assert_eq!(k1, 42); +// assert_eq!(k2, 43); +// } + +/// set 1 1, ..., set 10000 10000等一万个key已由java sdk预先写入, +/// 从mesh读取, 验证业务写入与mesh读取之间的一致性 +#[test] +fn test_get_write_by_sdk() { + let mut con = get_conn(&RESTYPE.get_host()); + for i in exists_key_iter() { + assert_eq!(redis::cmd("GET").arg(i).query(&mut con), Ok(i)); + } +} + +///依次set [4, 40, 400, 4000, 8000, 20000, 3000000]大小的value +///验证buffer扩容,buffer初始容量4K,扩容每次扩容两倍 +///后将[4, 40, 400, 4000, 8000, 20000, 3000000] shuffle后再依次set +///测试步骤: +/// 1. set, key value size 4k以下,4次 +/// 3. set key value size 4k~8k,一次, buffer由4k扩容到8k +/// 4. set key value size 8k~16k,一次,buffer在一次请求中扩容两次,由8k扩容到16k,16k扩容到32k, +/// 5. set, key value size 2M以上,1次 +/// 6. 以上set请求乱序set一遍 +#[named] +#[test] +fn test_set_value_fix_size() { + let arykey = function_name!(); + let mut con = get_conn(&RESTYPE.get_host()); + + let mut v_sizes = [4, 40, 400, 4000, 8000, 20000, 3000000]; + for v_size in v_sizes { + let val = vec![1u8; v_size]; + redis::cmd("SET").arg(arykey).arg(&val).execute(&mut con); + assert_eq!(redis::cmd("GET").arg(arykey).query(&mut con), Ok(val)); + } + + //todo random iter + use rand::seq::SliceRandom; + let mut rng = rand::thread_rng(); + v_sizes.shuffle(&mut rng); + for v_size in v_sizes { + let val = vec![1u8; v_size]; + redis::cmd("SET").arg(arykey).arg(&val).execute(&mut con); + assert_eq!(redis::cmd("GET").arg(arykey).query(&mut con), Ok(val)); + } +} + +///依次set key长度为[4, 40, 400, 4000] +#[test] +fn test_set_key_fix_size() { + let mut con = get_conn(&RESTYPE.get_host()); + + let key_sizes = [4, 40, 400, 4000]; + for key_size in key_sizes { + let key = vec![1u8; key_size]; + redis::cmd("SET").arg(&key).arg("foo").execute(&mut con); + assert_eq!( + redis::cmd("GET").arg(&key).query(&mut con), + Ok("foo".to_string()) + ); + } +} + +//mget 获取10000个key +#[test] +fn test_mget_10000() { + let mut con = get_conn(&RESTYPE.get_host()); + + let maxkey = 10000; + let mut keys = Vec::with_capacity(maxkey); + for i in 1..=maxkey { + keys.push(i); + } + assert_eq!(redis::cmd("MGET").arg(&keys).query(&mut con), Ok(keys)); +} diff --git a/tests_ci/src/redis_helper.rs b/tests_integration/src/redis_helper.rs similarity index 100% rename from tests_ci/src/redis_helper.rs rename to tests_integration/src/redis_helper.rs From e74bfb2fd489f14896cd31c2ef9460b76b322174 Mon Sep 17 00:00:00 2001 From: wanggang9 Date: Tue, 1 Nov 2022 18:00:31 +0800 Subject: [PATCH 31/34] phantom --- .github/workflows/rust.yml | 4 ++ tests_ci/src/all.rs | 1 + tests_ci/src/phantom.rs | 115 +++++++++++++++++++++++++++++++++++++ 3 files changed, 120 insertions(+) create mode 100644 tests_ci/src/phantom.rs diff --git a/.github/workflows/rust.yml b/.github/workflows/rust.yml index 1d3541628..2ef4f7d49 100644 --- a/.github/workflows/rust.yml +++ b/.github/workflows/rust.yml @@ -11,6 +11,7 @@ env: redis: localhost:56810 counterservice: localhost:9302 mc: localhost:9301 + phantom: localhost:9303 min_key: 1 max_key: 10000 @@ -35,6 +36,8 @@ jobs: curl http://127.0.0.1:8080/config/cloud/redis/testbreeze/redismeshtest curl http://127.0.0.1:8080/config/v1/cache.service.testbreeze.pool.yf/all curl http://127.0.0.1:8080/config/cloud/counterservice/testbreeze/meshtest + curl http://127.0.0.1:8080/config/cloud/phantom/testbreeze/phantomtest + curl http://127.0.0.1:8080/config/cloud/mq/testbreeze/mcqmeshtest - name: Create Socks run: | #ps -aux|grep breeze @@ -44,6 +47,7 @@ jobs: touch /home/runner/work/breeze/socks/config+cloud+redis+testbreeze+redismeshtest@redis:56810@rs touch /home/runner/work/breeze/socks/config+v1+cache.service.testbreeze.pool.yf+all:meshtest@mc:9301@cs touch /home/runner/work/breeze/socks/config+cloud+counterservice+testbreeze+meshtest@redis:9302@rs + touch /home/runner/work/breeze/socks/config+cloud+phantom+testbreeze+phantomtest@phantom:9303@pt ls -all /home/runner/work/breeze/snapshot ls -all /home/runner/work/breeze/socks ls -all /home/runner/work/breeze/logs diff --git a/tests_ci/src/all.rs b/tests_ci/src/all.rs index ddafcc11a..36f4dc8cf 100644 --- a/tests_ci/src/all.rs +++ b/tests_ci/src/all.rs @@ -1,5 +1,6 @@ mod ci; mod counterservice; mod mc; +mod phantom; mod redis; mod redis_helper; diff --git a/tests_ci/src/phantom.rs b/tests_ci/src/phantom.rs new file mode 100644 index 000000000..6469b83b3 --- /dev/null +++ b/tests_ci/src/phantom.rs @@ -0,0 +1,115 @@ +use std::alloc::System; + +use crate::ci::env::*; +use crate::redis_helper::*; +use redis::cmd; +use std::time::SystemTime; + +/// # Phantom 简单介绍 +/// +/// Phantom 存在性判断的缓存,采用BloomFilter实现。用于存储用户的访问记录 +/// Phantom采用Redis协议通信,实现了bfget、bgset、bfmset、bfmset等命令 +/// +/// # 单元测试已覆盖场景: +/// +/// - 基本命令: +/// 包括: PING 、bfset 、bfget 、bfmget、bfmset +/// +/// - key 合法性 +/// +/// +/// - + +#[test] +fn test_ping() { + let mut con = get_conn(&file!().get_host()); + let ping_ret: () = redis::cmd("PING").query(&mut con).unwrap(); + assert_eq!(ping_ret, ()); +} + +// key只支持64位非负整数!! +// +// 验证非法key +// 最小越界 +// +#[test] +fn test_bad_key_bfset() { + let mut con = get_conn(&file!().get_host()); + let rs = cmd("bfset").arg("bad_key").query::(&mut con); + assert_eq!(rs, Ok(-2)); //非法key + + let rs = cmd("bfset").arg("9").query::(&mut con); + assert_eq!(rs, Ok(-1)); // 最小越界 + + let rs = cmd("bfset").arg("9999999999999999").query::(&mut con); + assert_eq!(rs, Ok(-3)); // 最大越界 +} + +// 正常key bfset 测试 + +#[test] +fn test_bfset() { + let mut con = get_conn(&file!().get_host()); + + // 获取初测试key 初始值 + let found = cmd("bfget").arg("1111").query::(&mut con); + + // bfset 返回前值 + let rs = cmd("bfset").arg("1111").query::(&mut con); + assert_eq!(rs, Ok(found.unwrap())); +} + +#[test] +fn test_bfget() { + let mut con = get_conn(&file!().get_host()); + let pref_key = rand::random::(); + println!("test_bfget:test_bfget{}", pref_key); + let orgin_rs = cmd("bfget").arg(pref_key).query::(&mut con); + let _rs = cmd("bfset").arg(pref_key).query::(&mut con); + + let rs = cmd("bfget").arg(pref_key).query::(&mut con); + assert_eq!(rs, Ok(orgin_rs.unwrap() + 1)); +} + +#[test] +fn test_bfmget() { + let pref_key = SystemTime::now() + .duration_since(std::time::UNIX_EPOCH) + .unwrap() + .as_secs(); + + let mut con = get_conn(&file!().get_host()); + let key2 = pref_key + 10; + let key3 = pref_key + 20; + let found = cmd("bfmget") + .arg(pref_key) + .arg(key2) + .arg(key3) + .query::>(&mut con); + assert_eq!(found, Ok(vec![0, 0, 0])); +} + +#[test] +fn test_bfmset() { + let pref_key = SystemTime::now() + .duration_since(std::time::UNIX_EPOCH) + .unwrap() + .as_secs(); + + let mut con = get_conn(&file!().get_host()); + let key2 = pref_key + 30; + let key3 = pref_key + 40; + let found = cmd("bfmset") + .arg(pref_key) + .arg(key2) + .arg(key3) + .query::>(&mut con); + assert_eq!(found, Ok(vec![0, 0, 0])); + + let rs = cmd("bfmset") + .arg(pref_key) + .arg(key2) + .arg(key3) + .query::>(&mut con); + assert_eq!(rs, Ok(vec![1, 1, 1])); +} From c98c791877fa7c4c95bebed46637b31742cbd97d Mon Sep 17 00:00:00 2001 From: xiaowang Date: Tue, 1 Nov 2022 18:26:14 +0800 Subject: [PATCH 32/34] fix bug --- tests_integration/src/redis/basic/collection.rs | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/tests_integration/src/redis/basic/collection.rs b/tests_integration/src/redis/basic/collection.rs index b44852a1e..cc061e3f4 100644 --- a/tests_integration/src/redis/basic/collection.rs +++ b/tests_integration/src/redis/basic/collection.rs @@ -467,10 +467,9 @@ fn set_basic() { assert_eq!(con.sadd(arykey, "one"), Ok(1)); assert_eq!(con.sadd(arykey, "two"), Ok(1)); - assert_eq!( - con.smembers(arykey), - Ok(vec!["one".to_string(), "two".to_string(),]) - ); + let res: Result, RedisError> = con.smembers(arykey); + assert!(res.is_ok()); + assert_eq!(res.expect("ok").len(), 2); assert_eq!(con.srem(arykey, "one"), Ok(1)); assert_eq!(con.sismember(arykey, "one"), Ok(0)); From ccc1ea4396805eaff6e680d26633477b5aa4d694 Mon Sep 17 00:00:00 2001 From: xiaowang Date: Tue, 1 Nov 2022 20:29:05 +0800 Subject: [PATCH 33/34] =?UTF-8?q?=E8=B0=83=E6=95=B4mc=E7=9B=AE=E5=BD=95?= =?UTF-8?q?=E7=BB=93=E6=9E=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- tests_integration/src/mc.rs | 293 ------------------------------ tests_integration/src/mc/basic.rs | 157 ++++++++++++++++ tests_integration/src/mc/mod.rs | 124 +++++++++++++ 3 files changed, 281 insertions(+), 293 deletions(-) delete mode 100644 tests_integration/src/mc.rs create mode 100644 tests_integration/src/mc/basic.rs create mode 100644 tests_integration/src/mc/mod.rs diff --git a/tests_integration/src/mc.rs b/tests_integration/src/mc.rs deleted file mode 100644 index 905941660..000000000 --- a/tests_integration/src/mc.rs +++ /dev/null @@ -1,293 +0,0 @@ -/// # 已测试场景: -/// - 验证 mesh buffer 扩容,同一个连接,同一个key,set 8次不同大小的String value -/// key: "fooset" value: 每个字符内容为 ‘A’ -/// 乱序set: [1048507, 4, 4000, 40, 8000, 20000, 0, 400] -/// 顺序set: [0, 4, 40, 400, 4000, 8000, 20000, 1048507] -/// -/// - 模拟mc已有10000条数据,通过 mesh 读取,验证数据一致性 -/// 数据由 java SDK 预先写入:key: 0...9999 value: 0...9999 -/// -/// - 模拟简单mc 基本命令: -/// 包括: add、get、replace、delete、append、prepend、gets、cas、incr、decr -/// set命令未单独测试; -/// -/// - -mod mc_test { - - use std::collections::HashMap; - - use memcache::{Client, MemcacheError}; - - use crate::ci::env::{exists_key_iter, Mesh}; - - /// 测试场景:buffer扩容验证: 同一个连接,同一个key, set不同大小的value - /// 特征: key;固定为"fooset" value: 不同长度的String,内容固定: 每个字符内容为 ‘A’ - /// - /// 测试步骤: - /// <1> 建立连接 - /// <2> 乱序set,先set 1M的value,再乱序set其他大小的value [1048507, 4, 4000, 40, 8000, 20000, 0, 400] - /// <3> 将set进去的value get出来,对比set进去的值与get出来的值; - /// <4> 由小到大分别set不同大小的value,从0开始递增,覆盖从4k->8k, 8k->32k,以及 1M 的场景, - /// <5> 重复步骤 <3> - /// - #[test] - fn buffer_capacity_a() { - let client = mc_get_conn(); - let key = "fooset"; - let mut v_sizes = [1048507, 4, 4000, 40, 8000, 20000, 0, 400]; - for v_size in v_sizes { - let val = vec![0x41; v_size]; - assert_eq!( - client - .set(key, &String::from_utf8_lossy(&val).to_string(), 2) - .is_ok(), - true - ); - let result: Result, MemcacheError> = client.get(key); - assert!(result.is_ok()); - assert_eq!( - result.expect("ok").expect("ok"), - String::from_utf8_lossy(&val).to_string() - ); - } - v_sizes = [0, 4, 40, 400, 4000, 8000, 20000, 1048507]; - for v_size in v_sizes { - let val = vec![0x41; v_size]; - assert!(client - .set(key, &String::from_utf8_lossy(&val).to_string(), 2) - .is_ok()); - let result: Result, MemcacheError> = client.get(key); - assert!(result.is_ok()); - assert_eq!( - result.expect("ok").expect("ok"), - String::from_utf8_lossy(&val).to_string() - ); - } - } - - /// 测试场景:针对目前线上存在的业务方写,mesh 读数据的场景进行模拟,验证数据一致性; - /// 特征: 预先通过java SDK 直接向后端资源写入10000条数据 - /// key: “1”.."10000" value: 1..10000 - /// 测试步骤:根据已知的 key&value,通过 mesh 获取并对比结果 - #[test] - fn only_get_value() { - let client = mc_get_conn(); - let mut key: String; - for value in exists_key_iter() { - key = value.to_string(); - let result: Result, MemcacheError> = client.get(&key); - assert!(result.is_ok()); - assert_eq!(result.expect("ok").expect("ok"), value); - } - } - - /// 测试场景: 测试mc 单次最多gets 多少个key - #[test] - fn mc_gets_keys() { - let client = mc_get_conn(); - let mut key: Vec = Vec::new(); - for keycount in 10001..=11000u64 { - let k = keycount.to_string(); - let s = client.set(&k, keycount, 1000); - assert!(s.is_ok(), "panic res:{:?}", s); - key.push(k); - } - - let mut mkey: Vec<&str> = Vec::new(); - for (count, k) in key.iter().enumerate() { - mkey.push(k.as_str()); - let result: Result, MemcacheError> = - client.gets(mkey.as_slice()); - println!("count is :{}", count + 1); - println!("keys is :{:?}", mkey); - println!("result is: {:?}", result); - assert!(result.is_ok()); - assert_eq!(result.expect("ok").len(), count + 1); - } - } - - /// 测试场景: 测试key的长度 - #[test] - fn mc_key_length() { - let client = mc_get_conn(); - for k_len in 1..=251usize { - let key = vec![0x42; k_len]; - let set_res = client.set( - &String::from_utf8_lossy(&key).to_string(), - k_len.to_string(), - 2, - ); - if k_len < 251 { - assert!(set_res.is_ok()); - } else { - assert!(set_res.is_err()) - } - let result: Result, MemcacheError> = - client.get(&String::from_utf8_lossy(&key).to_string()); - if k_len < 251 { - assert!(result.is_ok()); - assert_eq!(result.expect("ok").expect("ok"), k_len.to_string()); - } else { - assert!(result.is_err()) - } - } - } - - /// 测试场景:基本的mc add 命令验证 - #[test] - fn mc_max_key() { - let client = mc_get_conn(); - let key = "simplefooadd"; - let value = "bar"; - let result: Result, MemcacheError> = client.get(key); - assert_eq!(true, result.expect("ok").is_none()); - assert!(client.add(key, value, 10).is_ok()); - let result: Result, MemcacheError> = client.get(key); - assert_eq!(true, result.is_ok()); - assert_eq!(result.expect("ok").expect("ok"), value); - } - - /// 测试场景:基本的mc add 命令验证 - #[test] - fn mc_simple_add() { - let client = mc_get_conn(); - let key = "fooadd"; - let value = "bar"; - let result: Result, MemcacheError> = client.get(key); - assert_eq!(true, result.expect("ok").is_none()); - assert!(client.add(key, value, 10).is_ok()); - let result: Result, MemcacheError> = client.get(key); - assert_eq!(true, result.is_ok()); - assert_eq!(result.expect("ok").expect("ok"), value); - } - - /// 测试场景:基本的mc get 命令验证 - /// 测试步骤:get(key) key 为预先写入的key - #[test] - fn mc_simple_get() { - let client = mc_get_conn(); - let result: Result, MemcacheError> = client.get("307"); - assert!(result.is_ok()); - assert_eq!(result.expect("ok").expect("ok"), "307"); - } - - /// 测试场景:基本的mc replace 命令验证 - #[test] - fn mc_simple_replace() { - let client = mc_get_conn(); - let key = "fooreplace"; - let value = "bar"; - assert!(client.set(key, value, 3).is_ok()); - assert_eq!(true, client.replace(key, "baz", 3).is_ok()); - let result: Result, MemcacheError> = client.get(key); - assert_eq!(result.is_ok(), true); - assert_eq!(result.expect("ok").expect("ok"), "baz"); - } - - ///测试场景:基本的mc delete 命令验证 - #[test] - fn mc_simple_delete() { - let client = mc_get_conn(); - let key = "foodel"; - let value = "bar"; - let result: Result, MemcacheError> = client.get(key); - assert_eq!(true, result.expect("ok").is_none()); - assert!(client.add(key, value, 2).is_ok()); - assert!(client.delete(key).is_ok()); - let result: Result, MemcacheError> = client.get(key); - assert_eq!(true, result.expect("ok").is_none()); - } - - /* - #[test] - fn only_set_value() { - let client = mc_get_conn(); - let mut key: String; - let mut number: u32 = 0; - while number < 10000 { - key = number.to_string(); - let result = client.set(key, number, 500); - assert_eq!(true,result.is_ok()); - number += 1; - } - }*/ - - ///测试场景:基本的mc append 命令验证 - #[test] - fn mc_simple_append() { - let client = mc_get_conn(); - let key = "append"; - let value = "bar"; - let append_value = "baz"; - assert!(client.set(key, value, 3).is_ok()); - assert!(client.append(key, append_value).is_ok()); - let result: Result, MemcacheError> = client.get(key); - assert_eq!(result.is_ok(), true); - assert_eq!(result.expect("ok").expect("ok"), "barbaz"); - } - - ///测试场景:基本的mc prepend 命令验证 - #[test] - fn mc_simple_prepend() { - let client = mc_get_conn(); - let key = "prepend"; - let value = "bar"; - let prepend_value = "foo"; - assert!(client.set(key, value, 3).is_ok()); - assert!(client.prepend(key, prepend_value).is_ok()); - let result: Result, MemcacheError> = client.get(key); - assert_eq!(result.is_ok(), true); - assert_eq!(result.expect("ok").expect("ok"), "foobar"); - } - - ///测试场景:基本的mc cas 命令验证 - #[test] - fn mc_simple_cas() { - let client = mc_get_conn(); - assert!(client.set("foocas", "bar", 10).is_ok()); - let getsres: Result, u32, Option)>, MemcacheError> = - client.gets(&["foocas"]); - assert!(getsres.is_ok()); - let result: HashMap, u32, Option)> = getsres.expect("ok"); - let (_, _, cas) = result.get("foocas").expect("ok"); - let cas = cas.expect("ok"); - assert_eq!(true, client.cas("foocas", "bar2", 10, cas).expect("ok")); - } - - ///测试场景:基本的mc gets 命令验证 - #[test] - fn mc_simple_gets() { - //多个key - let client = mc_get_conn(); - let key = "getsfoo"; - let value = "getsbar"; - assert!(client.set(key, value, 2).is_ok()); - assert!(client.set(value, key, 2).is_ok()); - let result: Result, MemcacheError> = - client.gets(&["getsfoo", "getsbar"]); - assert!(result.is_ok()); - assert_eq!(result.expect("ok").len(), 2); - } - - ///测试场景:基本的mc incr和decr 命令验证 - #[test] - fn mc_simple_incr_decr() { - let client = mc_get_conn(); - let key = "fooinde"; - assert!(client.set(key, 10, 3).is_ok()); - let res = client.increment(key, 5); - assert!(res.is_ok()); - assert_eq!(res.expect("ok"), 15); - let res = client.decrement(key, 5); - assert!(res.is_ok()); - assert_eq!(res.expect("ok"), 10); - } - - fn mc_get_conn() -> Client { - let host_ip = file!().get_host(); - let host = String::from("memcache://") + &host_ip; - let client = memcache::connect(host); - assert_eq!(true, client.is_ok()); - return client.expect("ok"); - } -} diff --git a/tests_integration/src/mc/basic.rs b/tests_integration/src/mc/basic.rs new file mode 100644 index 000000000..b253ac7aa --- /dev/null +++ b/tests_integration/src/mc/basic.rs @@ -0,0 +1,157 @@ +/// # 已测试场景: +/// - 验证 mesh buffer 扩容,同一个连接,同一个key,set 8次不同大小的String value +/// key: "fooset" value: 每个字符内容为 ‘A’ +/// 乱序set: [1048507, 4, 4000, 40, 8000, 20000, 0, 400] +/// 顺序set: [0, 4, 40, 400, 4000, 8000, 20000, 1048507] +/// +/// - 模拟mc已有10000条数据,通过 mesh 读取,验证数据一致性 +/// 数据由 java SDK 预先写入:key: 0...9999 value: 0...9999 +/// +/// - 模拟简单mc 基本命令: +/// 包括: add、get、replace、delete、append、prepend、gets、cas、incr、decr +/// set命令未单独测试; +/// +/// - + +use std::collections::HashMap; +use memcache::{MemcacheError}; +use crate::{mc::mc_get_conn}; +/// 测试场景:基本的mc add 命令验证 +#[test] +fn mc_max_key() { + let client = mc_get_conn(); + let key = "simplefooadd"; + let value = "bar"; + let result: Result, MemcacheError> = client.get(key); + assert_eq!(true, result.expect("ok").is_none()); + assert!(client.add(key, value, 10).is_ok()); + let result: Result, MemcacheError> = client.get(key); + assert_eq!(true, result.is_ok()); + assert_eq!(result.expect("ok").expect("ok"), value); +} +/// 测试场景:基本的mc add 命令验证 +#[test] +fn mc_simple_add() { + let client = mc_get_conn(); + let key = "fooadd"; + let value = "bar"; + let result: Result, MemcacheError> = client.get(key); + assert_eq!(true, result.expect("ok").is_none()); + assert!(client.add(key, value, 10).is_ok()); + let result: Result, MemcacheError> = client.get(key); + assert_eq!(true, result.is_ok()); + assert_eq!(result.expect("ok").expect("ok"), value); +} +/// 测试场景:基本的mc get 命令验证 +/// 测试步骤:get(key) key 为预先写入的key +#[test] +fn mc_simple_get() { + let client = mc_get_conn(); + let result: Result, MemcacheError> = client.get("307"); + assert!(result.is_ok()); + assert_eq!(result.expect("ok").expect("ok"), "307"); +} +/// 测试场景:基本的mc replace 命令验证 +#[test] +fn mc_simple_replace() { + let client = mc_get_conn(); + let key = "fooreplace"; + let value = "bar"; + assert!(client.set(key, value, 3).is_ok()); + assert_eq!(true, client.replace(key, "baz", 3).is_ok()); + let result: Result, MemcacheError> = client.get(key); + assert_eq!(result.is_ok(), true); + assert_eq!(result.expect("ok").expect("ok"), "baz"); +} +///测试场景:基本的mc delete 命令验证 +#[test] +fn mc_simple_delete() { + let client = mc_get_conn(); + let key = "foodel"; + let value = "bar"; + let result: Result, MemcacheError> = client.get(key); + assert_eq!(true, result.expect("ok").is_none()); + assert!(client.add(key, value, 2).is_ok()); + assert!(client.delete(key).is_ok()); + let result: Result, MemcacheError> = client.get(key); + assert_eq!(true, result.expect("ok").is_none()); +} +/* +#[test] +fn only_set_value() { + let client = mc_get_conn(); + let mut key: String; + let mut number: u32 = 0; + while number < 10000 { + key = number.to_string(); + let result = client.set(key, number, 500); + assert_eq!(true,result.is_ok()); + number += 1; + } +}*/ +///测试场景:基本的mc append 命令验证 +#[test] +fn mc_simple_append() { + let client = mc_get_conn(); + let key = "append"; + let value = "bar"; + let append_value = "baz"; + assert!(client.set(key, value, 3).is_ok()); + assert!(client.append(key, append_value).is_ok()); + let result: Result, MemcacheError> = client.get(key); + assert_eq!(result.is_ok(), true); + assert_eq!(result.expect("ok").expect("ok"), "barbaz"); +} +///测试场景:基本的mc prepend 命令验证 +#[test] +fn mc_simple_prepend() { + let client = mc_get_conn(); + let key = "prepend"; + let value = "bar"; + let prepend_value = "foo"; + assert!(client.set(key, value, 3).is_ok()); + assert!(client.prepend(key, prepend_value).is_ok()); + let result: Result, MemcacheError> = client.get(key); + assert_eq!(result.is_ok(), true); + assert_eq!(result.expect("ok").expect("ok"), "foobar"); +} +///测试场景:基本的mc cas 命令验证 +#[test] +fn mc_simple_cas() { + let client = mc_get_conn(); + assert!(client.set("foocas", "bar", 10).is_ok()); + let getsres: Result, u32, Option)>, MemcacheError> = + client.gets(&["foocas"]); + assert!(getsres.is_ok()); + let result: HashMap, u32, Option)> = getsres.expect("ok"); + let (_, _, cas) = result.get("foocas").expect("ok"); + let cas = cas.expect("ok"); + assert_eq!(true, client.cas("foocas", "bar2", 10, cas).expect("ok")); +} +///测试场景:基本的mc gets 命令验证 +#[test] +fn mc_simple_gets() { + //多个key + let client = mc_get_conn(); + let key = "getsfoo"; + let value = "getsbar"; + assert!(client.set(key, value, 2).is_ok()); + assert!(client.set(value, key, 2).is_ok()); + let result: Result, MemcacheError> = + client.gets(&["getsfoo", "getsbar"]); + assert!(result.is_ok()); + assert_eq!(result.expect("ok").len(), 2); +} +///测试场景:基本的mc incr和decr 命令验证 +#[test] +fn mc_simple_incr_decr() { + let client = mc_get_conn(); + let key = "fooinde"; + assert!(client.set(key, 10, 3).is_ok()); + let res = client.increment(key, 5); + assert!(res.is_ok()); + assert_eq!(res.expect("ok"), 15); + let res = client.decrement(key, 5); + assert!(res.is_ok()); + assert_eq!(res.expect("ok"), 10); +} diff --git a/tests_integration/src/mc/mod.rs b/tests_integration/src/mc/mod.rs new file mode 100644 index 000000000..e57f740cc --- /dev/null +++ b/tests_integration/src/mc/mod.rs @@ -0,0 +1,124 @@ +mod basic; +use std::collections::HashMap; +use memcache::{Client, MemcacheError}; +use crate::ci::env::{exists_key_iter, Mesh}; + +/// 测试场景:buffer扩容验证: 同一个连接,同一个key, set不同大小的value +/// 特征: key;固定为"fooset" value: 不同长度的String,内容固定: 每个字符内容为 ‘A’ +/// +/// 测试步骤: +/// <1> 建立连接 +/// <2> 乱序set,先set 1M的value,再乱序set其他大小的value [1048507, 4, 4000, 40, 8000, 20000, 0, 400] +/// <3> 将set进去的value get出来,对比set进去的值与get出来的值; +/// <4> 由小到大分别set不同大小的value,从0开始递增,覆盖从4k->8k, 8k->32k,以及 1M 的场景, +/// <5> 重复步骤 <3> +#[test] +fn buffer_capacity_a() { + let client = mc_get_conn(); + let key = "fooset"; + let mut v_sizes = [1048507, 4, 4000, 40, 8000, 20000, 0, 400]; + for v_size in v_sizes { + let val = vec![0x41; v_size]; + assert_eq!( + client + .set(key, &String::from_utf8_lossy(&val).to_string(), 2) + .is_ok(), + true + ); + let result: Result, MemcacheError> = client.get(key); + assert!(result.is_ok()); + assert_eq!( + result.expect("ok").expect("ok"), + String::from_utf8_lossy(&val).to_string() + ); + } + v_sizes = [0, 4, 40, 400, 4000, 8000, 20000, 1048507]; + for v_size in v_sizes { + let val = vec![0x41; v_size]; + assert!(client + .set(key, &String::from_utf8_lossy(&val).to_string(), 2) + .is_ok()); + let result: Result, MemcacheError> = client.get(key); + assert!(result.is_ok()); + assert_eq!( + result.expect("ok").expect("ok"), + String::from_utf8_lossy(&val).to_string() + ); + } +} + +/// 测试场景:针对目前线上存在的业务方写,mesh 读数据的场景进行模拟,验证数据一致性; +/// 特征: 预先通过java SDK 直接向后端资源写入10000条数据 +/// key: “1”.."10000" value: 1..10000 +/// 测试步骤:根据已知的 key&value,通过 mesh 获取并对比结果 +#[test] +fn only_get_value() { + let client = mc_get_conn(); + let mut key: String; + for value in exists_key_iter() { + key = value.to_string(); + let result: Result, MemcacheError> = client.get(&key); + assert!(result.is_ok()); + assert_eq!(result.expect("ok").expect("ok"), value); + } +} + +/// 测试场景: 测试mc 单次最多gets 多少个key +#[test] +fn mc_gets_keys() { + let client = mc_get_conn(); + let mut key: Vec = Vec::new(); + for keycount in 10001..=11000u64 { + let k = keycount.to_string(); + let s = client.set(&k, keycount, 1000); + assert!(s.is_ok(), "panic res:{:?}", s); + key.push(k); + } + + let mut mkey: Vec<&str> = Vec::new(); + for (count, k) in key.iter().enumerate() { + mkey.push(k.as_str()); + let result: Result, MemcacheError> = + client.gets(mkey.as_slice()); + println!("count is :{}", count + 1); + println!("keys is :{:?}", mkey); + println!("result is: {:?}", result); + assert!(result.is_ok()); + assert_eq!(result.expect("ok").len(), count + 1); + } +} + +/// 测试场景: 测试key的长度 +#[test] +fn mc_key_length() { + let client = mc_get_conn(); + for k_len in 1..=251usize { + let key = vec![0x42; k_len]; + let set_res = client.set( + &String::from_utf8_lossy(&key).to_string(), + k_len.to_string(), + 2, + ); + if k_len < 251 { + assert!(set_res.is_ok()); + } else { + assert!(set_res.is_err()) + } + let result: Result, MemcacheError> = + client.get(&String::from_utf8_lossy(&key).to_string()); + if k_len < 251 { + assert!(result.is_ok()); + assert_eq!(result.expect("ok").expect("ok"), k_len.to_string()); + } else { + assert!(result.is_err()) + } + } +} + +fn mc_get_conn() -> Client { + let host_ip = "mc".get_host(); + let host = String::from("memcache://") + &host_ip; + let client = memcache::connect(host); + assert_eq!(true, client.is_ok()); + return client.expect("ok"); +} \ No newline at end of file From 3258bad9ec3d53cbc7346df21b1f3967b6000489 Mon Sep 17 00:00:00 2001 From: wanggang9 Date: Wed, 2 Nov 2022 12:23:13 +0800 Subject: [PATCH 34/34] test_bad_key_bfset unit test --- tests_integration/src/phantom.rs | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/tests_integration/src/phantom.rs b/tests_integration/src/phantom.rs index 6469b83b3..58cbcc719 100644 --- a/tests_integration/src/phantom.rs +++ b/tests_integration/src/phantom.rs @@ -1,5 +1,3 @@ -use std::alloc::System; - use crate::ci::env::*; use crate::redis_helper::*; use redis::cmd; @@ -13,7 +11,7 @@ use std::time::SystemTime; /// # 单元测试已覆盖场景: /// /// - 基本命令: -/// 包括: PING 、bfset 、bfget 、bfmget、bfmset +/// PING 、bfset 、bfget 、bfmget、bfmset /// /// - key 合法性 /// @@ -41,8 +39,6 @@ fn test_bad_key_bfset() { let rs = cmd("bfset").arg("9").query::(&mut con); assert_eq!(rs, Ok(-1)); // 最小越界 - let rs = cmd("bfset").arg("9999999999999999").query::(&mut con); - assert_eq!(rs, Ok(-3)); // 最大越界 } // 正常key bfset 测试 @@ -63,7 +59,6 @@ fn test_bfset() { fn test_bfget() { let mut con = get_conn(&file!().get_host()); let pref_key = rand::random::(); - println!("test_bfget:test_bfget{}", pref_key); let orgin_rs = cmd("bfget").arg(pref_key).query::(&mut con); let _rs = cmd("bfset").arg(pref_key).query::(&mut con);