From 805d8f1bd08a9e9fbc50343d13c67efd8618916a Mon Sep 17 00:00:00 2001 From: zhangjinpeng87 Date: Tue, 24 Feb 2026 17:06:19 -0800 Subject: [PATCH 01/11] serde version Signed-off-by: zhangjinpeng87 --- Cargo.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Cargo.toml b/Cargo.toml index 872af8fd..f7940c3c 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -58,7 +58,7 @@ protobuf = "2" rayon = "1.5" rhai = { version = "1.7", features = ["sync"], optional = true } scopeguard = "1.1" -serde = { version = "=1.0.194", features = ["derive"] } +serde = { version = "1.0", features = ["derive"] } serde_repr = "0.1" strum = { version = "0.26.2", features = ["derive"] } thiserror = "1.0" From 0feb3355dce1603d3a81aa658c4b182ec002294f Mon Sep 17 00:00:00 2001 From: zhangjinpeng87 Date: Tue, 24 Feb 2026 18:00:14 -0800 Subject: [PATCH 02/11] align kvproto version Signed-off-by: zhangjinpeng87 --- Cargo.toml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Cargo.toml b/Cargo.toml index f7940c3c..a7f296a8 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -67,7 +67,7 @@ thiserror = "1.0" criterion = "0.4" ctor = "0.2" env_logger = "0.10" -kvproto = { git = "https://github.com/pingcap/kvproto.git", default-features = false, features = [ +kvproto = { git = "https://github.com/pingcap/kvproto.git", branch = "release-8.5", default-features = false, features = [ "protobuf-codec", ] } raft = { git = "https://github.com/tikv/raft-rs", branch = "master", default-features = false, features = [ @@ -75,6 +75,7 @@ raft = { git = "https://github.com/tikv/raft-rs", branch = "master", default-fea ] } rand = "0.8" rand_distr = "0.4" +serde_json = "=1.0.146" tempfile = "3.6" toml = "0.8" From ce20bdfcde168b90ede28c6f4782933a259cef39 Mon Sep 17 00:00:00 2001 From: zhangjinpeng87 Date: Tue, 24 Feb 2026 19:29:35 -0800 Subject: [PATCH 03/11] fix clippy Signed-off-by: zhangjinpeng87 --- Cargo.toml | 3 +++ Makefile | 4 ++++ src/engine.rs | 4 ++-- tests/benches/bench_recovery.rs | 2 +- 4 files changed, 10 insertions(+), 3 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index a7f296a8..0c276a2f 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -67,6 +67,9 @@ thiserror = "1.0" criterion = "0.4" ctor = "0.2" env_logger = "0.10" +grpcio = { version = "=0.10.2", default-features = false, features = [ + "protobuf-codec", +] } kvproto = { git = "https://github.com/pingcap/kvproto.git", branch = "release-8.5", default-features = false, features = [ "protobuf-codec", ] } diff --git a/Makefile b/Makefile index da01ab1b..3191e0c6 100644 --- a/Makefile +++ b/Makefile @@ -44,6 +44,10 @@ format: CLIPPY_WHITELIST += -A clippy::bool_assert_comparison ## Run clippy. clippy: + # Fresh lockfile resolution can pull grpcio 0.13.x via kvproto (grpcio = "0.*"), + # which fails to build on macOS arm64 in current CI images. Force a compatible + # selection before linting. + cargo ${TOOLCHAIN_ARGS} update -p grpcio@0.13.0 --precise 0.10.2 || true ifdef WITH_NIGHTLY_FEATURES cargo ${TOOLCHAIN_ARGS} clippy --all --features nightly_group,failpoints --all-targets -- -D clippy::all ${CLIPPY_WHITELIST} else diff --git a/src/engine.rs b/src/engine.rs index f8c73304..8f1294a8 100644 --- a/src/engine.rs +++ b/src/engine.rs @@ -1410,7 +1410,7 @@ pub(crate) mod tests { let empty_entry = Entry::new(); assert_eq!(empty_entry.compute_size(), 0); log_batch - .add_entries::(0, &[empty_entry.clone()]) + .add_entries::(0, std::slice::from_ref(&empty_entry)) .unwrap(); engine.write(&mut log_batch, false).unwrap(); let empty_state = RaftLocalState::new(); @@ -1420,7 +1420,7 @@ pub(crate) mod tests { .unwrap(); engine.write(&mut log_batch, false).unwrap(); log_batch - .add_entries::(2, &[empty_entry.clone()]) + .add_entries::(2, std::slice::from_ref(&empty_entry)) .unwrap(); log_batch .put_message(2, b"key".to_vec(), &empty_state) diff --git a/tests/benches/bench_recovery.rs b/tests/benches/bench_recovery.rs index 55b42c22..2013c7ac 100644 --- a/tests/benches/bench_recovery.rs +++ b/tests/benches/bench_recovery.rs @@ -116,7 +116,7 @@ fn dir_size(path: &str) -> ReadableSize { fn bench_recovery(c: &mut Criterion) { // prepare input - let cfgs = vec![ + let cfgs = [ ( "default".to_owned(), Config { From 86304664ddd59cf8386260edbe577d2709147b34 Mon Sep 17 00:00:00 2001 From: zhangjinpeng87 Date: Tue, 24 Feb 2026 19:53:19 -0800 Subject: [PATCH 04/11] fix clippy Signed-off-by: zhangjinpeng87 --- Makefile | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/Makefile b/Makefile index 3191e0c6..a4fd53c5 100644 --- a/Makefile +++ b/Makefile @@ -44,10 +44,14 @@ format: CLIPPY_WHITELIST += -A clippy::bool_assert_comparison ## Run clippy. clippy: - # Fresh lockfile resolution can pull grpcio 0.13.x via kvproto (grpcio = "0.*"), - # which fails to build on macOS arm64 in current CI images. Force a compatible - # selection before linting. - cargo ${TOOLCHAIN_ARGS} update -p grpcio@0.13.0 --precise 0.10.2 || true + # Fresh lockfile resolution can pull grpcio/grpcio-sys versions that fail on + # macOS arm64 CI images. Force compatible selections before linting. + @if cargo ${TOOLCHAIN_ARGS} tree --all-features -i 'grpcio@0.13.0' >/dev/null 2>&1; then \ + cargo ${TOOLCHAIN_ARGS} update -p grpcio@0.13.0 --precise 0.10.2; \ + fi + @if cargo ${TOOLCHAIN_ARGS} tree --all-features -i 'grpcio-sys@0.10.3+1.44.0-patched' >/dev/null 2>&1; then \ + cargo ${TOOLCHAIN_ARGS} update -p grpcio-sys@0.10.3+1.44.0-patched --precise 0.10.1+1.44.0; \ + fi ifdef WITH_NIGHTLY_FEATURES cargo ${TOOLCHAIN_ARGS} clippy --all --features nightly_group,failpoints --all-targets -- -D clippy::all ${CLIPPY_WHITELIST} else From 92d12b18e98dae24dbc191bee3709c4100998a7a Mon Sep 17 00:00:00 2001 From: zhangjinpeng87 Date: Tue, 24 Feb 2026 20:21:33 -0800 Subject: [PATCH 05/11] update rustc edition=2024 Signed-off-by: zhangjinpeng87 --- Cargo.toml | 4 +-- src/file_pipe_log/log_file.rs | 3 +-- src/log_batch.rs | 10 ++++---- src/memtable.rs | 4 +-- src/swappy_allocator.rs | 47 ++++++++++++++++------------------- src/test_util.rs | 24 +++++++++--------- 6 files changed, 44 insertions(+), 48 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index 0c276a2f..47f16391 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -2,8 +2,8 @@ name = "raft-engine" version = "0.4.2" authors = ["The TiKV Project Developers"] -edition = "2018" -rust-version = "1.75.0" +edition = "2024" +rust-version = "1.85.0" description = "A persistent storage engine for Multi-Raft logs" readme = "README.md" repository = "https://github.com/tikv/raft-engine" diff --git a/src/file_pipe_log/log_file.rs b/src/file_pipe_log/log_file.rs index 9643bf61..cb9a77de 100644 --- a/src/file_pipe_log/log_file.rs +++ b/src/file_pipe_log/log_file.rs @@ -107,13 +107,12 @@ impl LogFileWriter { } self.capacity += alloc; } - self.writer.write_all(buf).map_err(|e| { + self.writer.write_all(buf).inspect_err(|_| { self.writer .seek(SeekFrom::Start(self.written as u64)) .unwrap_or_else(|e| { panic!("failed to reseek after write failure: {}", e); }); - e })?; self.written = new_written; Ok(()) diff --git a/src/log_batch.rs b/src/log_batch.rs index 5381b096..2dda5481 100644 --- a/src/log_batch.rs +++ b/src/log_batch.rs @@ -372,11 +372,11 @@ impl LogItemBatch { self.items } - pub fn iter(&self) -> std::slice::Iter { + pub fn iter(&self) -> std::slice::Iter<'_, LogItem> { self.items.iter() } - pub fn drain(&mut self) -> LogItemDrain { + pub fn drain(&mut self) -> LogItemDrain<'_> { self.item_size = 0; self.entries_size = 0; self.checksum = 0; @@ -882,7 +882,7 @@ impl LogBatch { } /// Consumes log items into an iterator. - pub(crate) fn drain(&mut self) -> LogItemDrain { + pub(crate) fn drain(&mut self) -> LogItemDrain<'_> { debug_assert!(!matches!(self.buf_state, BufState::Incomplete)); self.buf.shrink_to(MAX_LOG_BATCH_BUFFER_CAP); @@ -1631,13 +1631,13 @@ mod tests { fn details(log_batch: &mut LogBatch, entries: &[Entry], regions: usize) { for _ in 0..regions { log_batch - .add_entries::(thread_rng().gen(), entries) + .add_entries::(thread_rng().r#gen(), entries) .unwrap(); } log_batch.finish_populate(0, None).unwrap(); let _ = log_batch.drain(); } - let data: Vec = (0..128).map(|_| thread_rng().gen()).collect(); + let data: Vec = (0..128).map(|_| thread_rng().r#gen()).collect(); let entries = generate_entries(1, 11, Some(&data)); let mut log_batch = LogBatch::default(); // warm up diff --git a/src/memtable.rs b/src/memtable.rs index 0089b26e..df621e60 100644 --- a/src/memtable.rs +++ b/src/memtable.rs @@ -228,7 +228,7 @@ impl MemTable { } if let Some(g) = rhs.atomic_group.take() { - assert!(self.atomic_group.map_or(true, |(_, end)| end <= g.0)); + assert!(self.atomic_group.is_none_or(|(_, end)| end <= g.0)); self.atomic_group = Some(g); } @@ -545,7 +545,7 @@ impl MemTable { } pub fn apply_rewrite_atomic_group(&mut self, start: FileSeq, end: FileSeq) { - assert!(self.atomic_group.map_or(true, |(_, b)| b <= start)); + assert!(self.atomic_group.is_none_or(|(_, b)| b <= start)); self.atomic_group = Some((start, end)); } diff --git a/src/swappy_allocator.rs b/src/swappy_allocator.rs index 0cb8db9b..01f406be 100644 --- a/src/swappy_allocator.rs +++ b/src/swappy_allocator.rs @@ -120,9 +120,8 @@ unsafe impl Allocator for SwappyAllocator { return swap_r; } } - self.0.mem_allocator.allocate(layout).map_err(|e| { + self.0.mem_allocator.allocate(layout).inspect_err(|_| { self.0.mem_usage.fetch_sub(layout.size(), Ordering::Relaxed); - e }) } @@ -145,7 +144,9 @@ unsafe impl Allocator for SwappyAllocator { } } self.0.mem_usage.fetch_sub(layout.size(), Ordering::Relaxed); - self.0.mem_allocator.deallocate(ptr, layout) + unsafe { + self.0.mem_allocator.deallocate(ptr, layout); + } } #[inline] @@ -188,13 +189,9 @@ unsafe impl Allocator for SwappyAllocator { Ok(new_ptr) } else { - self.0 - .mem_allocator - .grow(ptr, old_layout, new_layout) - .map_err(|e| { - self.0.mem_usage.fetch_sub(diff, Ordering::Relaxed); - e - }) + unsafe { self.0.mem_allocator.grow(ptr, old_layout, new_layout) }.inspect_err(|_| { + self.0.mem_usage.fetch_sub(diff, Ordering::Relaxed); + }) } } @@ -205,8 +202,10 @@ unsafe impl Allocator for SwappyAllocator { old_layout: Layout, new_layout: Layout, ) -> Result, AllocError> { - let ptr = self.grow(ptr, old_layout, new_layout)?; - ptr.as_non_null_ptr().as_ptr().write_bytes(0, ptr.len()); + let ptr = unsafe { self.grow(ptr, old_layout, new_layout)? }; + unsafe { + ptr.as_non_null_ptr().as_ptr().write_bytes(0, ptr.len()); + } Ok(ptr) } @@ -245,20 +244,16 @@ unsafe impl Allocator for SwappyAllocator { } else { // The new layout should still be mapped to disk. Reuse old pointer. Ok(NonNull::slice_from_raw_parts( - NonNull::new_unchecked(ptr.as_ptr()), + unsafe { NonNull::new_unchecked(ptr.as_ptr()) }, new_layout.size(), )) } } else { - self.0 - .mem_allocator - .shrink(ptr, old_layout, new_layout) - .map(|p| { - self.0 - .mem_usage - .fetch_sub(old_layout.size() - new_layout.size(), Ordering::Relaxed); - p - }) + unsafe { self.0.mem_allocator.shrink(ptr, old_layout, new_layout) }.inspect(|_| { + self.0 + .mem_usage + .fetch_sub(old_layout.size() - new_layout.size(), Ordering::Relaxed); + }) } } } @@ -411,7 +406,9 @@ mod tests { } unsafe fn deallocate(&self, ptr: NonNull, layout: Layout) { self.dealloc.fetch_add(1, Ordering::Relaxed); - std::alloc::Global.deallocate(ptr, layout) + unsafe { + std::alloc::Global.deallocate(ptr, layout); + } } unsafe fn grow( &self, @@ -423,7 +420,7 @@ mod tests { if self.err_mode.load(Ordering::Relaxed) { Err(AllocError) } else { - std::alloc::Global.grow(ptr, old_layout, new_layout) + unsafe { std::alloc::Global.grow(ptr, old_layout, new_layout) } } } unsafe fn shrink( @@ -436,7 +433,7 @@ mod tests { if self.err_mode.load(Ordering::Relaxed) { Err(AllocError) } else { - std::alloc::Global.shrink(ptr, old_layout, new_layout) + unsafe { std::alloc::Global.shrink(ptr, old_layout, new_layout) } } } } diff --git a/src/test_util.rs b/src/test_util.rs index 6a88a653..5120b148 100644 --- a/src/test_util.rs +++ b/src/test_util.rs @@ -1,6 +1,7 @@ // Copyright (c) 2017-present, PingCAP, Inc. Licensed under Apache-2.0. use std::panic::{self, AssertUnwindSafe}; +use std::sync::Arc; use raft::eraftpb::Entry; @@ -62,25 +63,24 @@ where result } +type PanicHook = dyn Fn(&panic::PanicHookInfo<'_>) + Sync + Send + 'static; + pub struct PanicGuard { - prev_hook: *mut (dyn Fn(&panic::PanicHookInfo<'_>) + Sync + Send + 'static), + prev_hook: Option>, } -struct PointerHolder(*mut T); - -unsafe impl Send for PointerHolder {} -unsafe impl Sync for PointerHolder {} - impl PanicGuard { pub fn with_prompt(s: String) -> Self { - let prev_hook = Box::into_raw(panic::take_hook()); - let sendable_prev_hook = PointerHolder(prev_hook); + let prev_hook: Arc = panic::take_hook().into(); + let hook = Arc::clone(&prev_hook); // FIXME: Use thread local hook. panic::set_hook(Box::new(move |info| { eprintln!("{s}"); - unsafe { (*sendable_prev_hook.0)(info) }; + hook(info); })); - PanicGuard { prev_hook } + PanicGuard { + prev_hook: Some(prev_hook), + } } } @@ -88,8 +88,8 @@ impl Drop for PanicGuard { fn drop(&mut self) { if !std::thread::panicking() { let _ = panic::take_hook(); - unsafe { - panic::set_hook(Box::from_raw(self.prev_hook)); + if let Some(prev_hook) = self.prev_hook.take() { + panic::set_hook(Box::new(move |info| prev_hook(info))); } } } From 67ab1dc0613aac055e9982a4f87216e35b61d5fe Mon Sep 17 00:00:00 2001 From: zhangjinpeng87 Date: Tue, 24 Feb 2026 20:35:08 -0800 Subject: [PATCH 06/11] make format Signed-off-by: zhangjinpeng87 --- examples/fork.rs | 2 +- src/config.rs | 10 ++-- src/consistency.rs | 2 +- src/engine.rs | 64 +++++++++++++---------- src/env/log_fd/unix.rs | 4 +- src/env/obfuscated.rs | 2 +- src/file_pipe_log/mod.rs | 4 +- src/file_pipe_log/pipe.rs | 12 +++-- src/file_pipe_log/pipe_builder.rs | 6 +-- src/file_pipe_log/reader.rs | 4 +- src/filter.rs | 4 +- src/fork.rs | 2 +- src/lib.rs | 2 +- src/log_batch.rs | 36 +++++++------ src/memtable.rs | 26 ++++++---- src/purge.rs | 2 +- src/swappy_allocator.rs | 42 +++++++++------- tests/benches/bench_recovery.rs | 6 ++- tests/failpoints/test_engine.rs | 18 ++++--- tests/failpoints/test_io_error.rs | 84 +++++++++++++++++++------------ tests/failpoints/util.rs | 2 +- 21 files changed, 196 insertions(+), 138 deletions(-) diff --git a/examples/fork.rs b/examples/fork.rs index 6fb6b216..462c422b 100644 --- a/examples/fork.rs +++ b/examples/fork.rs @@ -1,9 +1,9 @@ use std::path::Path; use std::sync::Arc; -use raft_engine::env::DefaultFileSystem; use raft_engine::Config; use raft_engine::Engine; +use raft_engine::env::DefaultFileSystem; fn main() { let mut args = std::env::args(); diff --git a/src/config.rs b/src/config.rs index 4283737f..40370a9c 100644 --- a/src/config.rs +++ b/src/config.rs @@ -4,7 +4,7 @@ use log::{info, warn}; use serde::{Deserialize, Serialize}; use crate::pipe_log::Version; -use crate::{util::ReadableSize, Result}; +use crate::{Result, util::ReadableSize}; const MIN_RECOVERY_READ_BLOCK_SIZE: usize = 512; const MIN_RECOVERY_THREADS: usize = 1; @@ -343,9 +343,11 @@ mod tests { let mut load: Config = toml::from_str(old).unwrap(); load.sanitize().unwrap(); // Downgrade to older version. - assert!(toml::to_string(&load) - .unwrap() - .contains("tolerate-corrupted-tail-records")); + assert!( + toml::to_string(&load) + .unwrap() + .contains("tolerate-corrupted-tail-records") + ); } #[test] diff --git a/src/consistency.rs b/src/consistency.rs index c400a664..5881372b 100644 --- a/src/consistency.rs +++ b/src/consistency.rs @@ -2,10 +2,10 @@ use hashbrown::HashMap; +use crate::Result; use crate::file_pipe_log::ReplayMachine; use crate::log_batch::{LogItemBatch, LogItemContent}; use crate::pipe_log::{FileId, LogQueue}; -use crate::Result; /// A `ConsistencyChecker` scans for log entry holes in a log queue. It will /// return a list of corrupted raft groups along with their last valid log diff --git a/src/engine.rs b/src/engine.rs index 8f1294a8..a44891cf 100644 --- a/src/engine.rs +++ b/src/engine.rs @@ -3,12 +3,12 @@ use std::cell::{Cell, RefCell}; use std::marker::PhantomData; use std::path::Path; -use std::sync::{mpsc, Arc, Mutex}; +use std::sync::{Arc, Mutex, mpsc}; use std::thread::{Builder as ThreadBuilder, JoinHandle}; use std::time::{Duration, Instant}; use log::{error, info}; -use protobuf::{parse_from_bytes, Message}; +use protobuf::{Message, parse_from_bytes}; use crate::config::{Config, RecoveryMode}; use crate::consistency::ConsistencyChecker; @@ -22,7 +22,7 @@ use crate::metrics::*; use crate::pipe_log::{FileBlockHandle, FileId, LogQueue, PipeLog}; use crate::purge::{PurgeHook, PurgeManager}; use crate::write_barrier::{WriteBarrier, Writer}; -use crate::{perf_context, Error, GlobalStats, Result}; +use crate::{Error, GlobalStats, Result, perf_context}; const METRICS_FLUSH_INTERVAL: Duration = Duration::from_secs(30); /// Max times for `write`. @@ -106,11 +106,13 @@ where let memtables_clone = memtables.clone(); let metrics_flusher = ThreadBuilder::new() .name("re-metrics".into()) - .spawn(move || loop { - stats_clone.flush_metrics(); - memtables_clone.flush_metrics(); - if rx.recv_timeout(METRICS_FLUSH_INTERVAL).is_ok() { - break; + .spawn(move || { + loop { + stats_clone.flush_metrics(); + memtables_clone.flush_metrics(); + if rx.recv_timeout(METRICS_FLUSH_INTERVAL).is_ok() { + break; + } } })?; @@ -648,14 +650,14 @@ where pub(crate) mod tests { use super::*; use crate::env::{ObfuscatedFileSystem, Permission}; - use crate::file_pipe_log::{parse_reserved_file_name, FileNameExt}; + use crate::file_pipe_log::{FileNameExt, parse_reserved_file_name}; use crate::log_batch::AtomicGroupBuilder; use crate::pipe_log::Version; - use crate::test_util::{generate_entries, PanicGuard}; + use crate::test_util::{PanicGuard, generate_entries}; use crate::util::ReadableSize; use kvproto::raft_serverpb::RaftLocalState; use raft::eraftpb::Entry; - use rand::{thread_rng, Rng}; + use rand::{Rng, thread_rng}; use std::collections::{BTreeSet, HashSet}; use std::fs::OpenOptions; use std::path::PathBuf; @@ -1231,9 +1233,11 @@ pub(crate) mod tests { // GC all log entries. Won't trigger purge because total size is not enough. let count = engine.compact_to(1, 100); assert_eq!(count, 100); - assert!(!engine - .purge_manager - .needs_rewrite_log_files(LogQueue::Append)); + assert!( + !engine + .purge_manager + .needs_rewrite_log_files(LogQueue::Append) + ); // Append more logs to make total size greater than `purge_threshold`. for index in 100..250 { @@ -1243,9 +1247,11 @@ pub(crate) mod tests { // GC first 101 log entries. assert_eq!(engine.compact_to(1, 101), 1); // Needs to purge because the total size is greater than `purge_threshold`. - assert!(engine - .purge_manager - .needs_rewrite_log_files(LogQueue::Append)); + assert!( + engine + .purge_manager + .needs_rewrite_log_files(LogQueue::Append) + ); let old_min_file_seq = engine.file_span(LogQueue::Append).0; let will_force_compact = engine.purge_expired_files().unwrap(); @@ -1259,9 +1265,11 @@ pub(crate) mod tests { assert_eq!(engine.compact_to(1, 102), 1); // Needs to purge because the total size is greater than `purge_threshold`. - assert!(engine - .purge_manager - .needs_rewrite_log_files(LogQueue::Append)); + assert!( + engine + .purge_manager + .needs_rewrite_log_files(LogQueue::Append) + ); let will_force_compact = engine.purge_expired_files().unwrap(); // The region needs to be force compacted because the threshold is reached. assert!(!will_force_compact.is_empty()); @@ -1350,9 +1358,11 @@ pub(crate) mod tests { engine.append(11, 1, 11, Some(&data)); // The engine needs purge, and all old entries should be rewritten. - assert!(engine - .purge_manager - .needs_rewrite_log_files(LogQueue::Append)); + assert!( + engine + .purge_manager + .needs_rewrite_log_files(LogQueue::Append) + ); assert!(engine.purge_expired_files().unwrap().is_empty()); assert!(engine.file_span(LogQueue::Append).0 > 1); @@ -1386,9 +1396,11 @@ pub(crate) mod tests { } } - assert!(engine - .purge_manager - .needs_rewrite_log_files(LogQueue::Append)); + assert!( + engine + .purge_manager + .needs_rewrite_log_files(LogQueue::Append) + ); assert!(engine.purge_expired_files().unwrap().is_empty()); } diff --git a/src/env/log_fd/unix.rs b/src/env/log_fd/unix.rs index e9b75542..6f4cd4de 100644 --- a/src/env/log_fd/unix.rs +++ b/src/env/log_fd/unix.rs @@ -8,12 +8,12 @@ use log::error; use std::io::Result as IoResult; use std::os::unix::io::RawFd; +use nix::NixPath; use nix::errno::Errno; use nix::fcntl::{self, OFlag}; use nix::sys::stat::Mode; use nix::sys::uio::{pread, pwrite}; -use nix::unistd::{close, ftruncate, lseek, Whence}; -use nix::NixPath; +use nix::unistd::{Whence, close, ftruncate, lseek}; fn from_nix_error(e: nix::Error, custom: &'static str) -> std::io::Error { let kind = std::io::Error::from(e).kind(); diff --git a/src/env/obfuscated.rs b/src/env/obfuscated.rs index 6adaf277..76a025e2 100644 --- a/src/env/obfuscated.rs +++ b/src/env/obfuscated.rs @@ -2,8 +2,8 @@ use std::io::{Read, Result as IoResult, Seek, SeekFrom, Write}; use std::path::Path; -use std::sync::atomic::{AtomicUsize, Ordering}; use std::sync::Arc; +use std::sync::atomic::{AtomicUsize, Ordering}; use crate::env::{DefaultFileSystem, FileSystem, Permission, WriteExt}; diff --git a/src/file_pipe_log/mod.rs b/src/file_pipe_log/mod.rs index c65515a3..50f33b93 100644 --- a/src/file_pipe_log/mod.rs +++ b/src/file_pipe_log/mod.rs @@ -10,7 +10,7 @@ mod pipe; mod pipe_builder; mod reader; -pub use format::{parse_reserved_file_name, FileNameExt}; +pub use format::{FileNameExt, parse_reserved_file_name}; pub use pipe::DualPipes as FilePipeLog; pub use pipe_builder::{ DefaultMachineFactory, DualPipesBuilder as FilePipeLogBuilder, RecoveryConfig, ReplayMachine, @@ -173,7 +173,7 @@ pub mod debug { use crate::env::DefaultFileSystem; use crate::log_batch::{Command, LogBatch}; use crate::pipe_log::{FileBlockHandle, LogFileContext, LogQueue, Version}; - use crate::test_util::{generate_entries, PanicGuard}; + use crate::test_util::{PanicGuard, generate_entries}; use raft::eraftpb::Entry; #[test] diff --git a/src/file_pipe_log/pipe.rs b/src/file_pipe_log/pipe.rs index 82283137..d99d8fae 100644 --- a/src/file_pipe_log/pipe.rs +++ b/src/file_pipe_log/pipe.rs @@ -19,11 +19,11 @@ use crate::metrics::*; use crate::pipe_log::{ FileBlockHandle, FileId, FileSeq, LogFileContext, LogQueue, PipeLog, ReactiveBytes, }; -use crate::{perf_context, Error, Result}; +use crate::{Error, Result, perf_context}; -use super::format::{build_reserved_file_name, FileNameExt, LogFileFormat}; +use super::format::{FileNameExt, LogFileFormat, build_reserved_file_name}; use super::log_file::build_file_reader; -use super::log_file::{build_file_writer, LogFileWriter}; +use super::log_file::{LogFileWriter, build_file_writer}; pub type PathId = usize; pub type Paths = Vec; @@ -614,8 +614,10 @@ mod tests { // Only one thread can hold file lock let r2 = new_test_pipes(&cfg); - assert!(format!("{}", r2.err().unwrap()) - .contains("maybe another instance is using this directory")); + assert!( + format!("{}", r2.err().unwrap()) + .contains("maybe another instance is using this directory") + ); } #[test] diff --git a/src/file_pipe_log/pipe_builder.rs b/src/file_pipe_log/pipe_builder.rs index 9f62cf9d..c458e8e4 100644 --- a/src/file_pipe_log/pipe_builder.rs +++ b/src/file_pipe_log/pipe_builder.rs @@ -17,17 +17,17 @@ use crate::config::{Config, RecoveryMode}; use crate::env::{FileSystem, Handle, Permission}; use crate::errors::is_no_space_err; use crate::event_listener::EventListener; -use crate::log_batch::{LogItemBatch, LOG_BATCH_HEADER_LEN}; +use crate::log_batch::{LOG_BATCH_HEADER_LEN, LogItemBatch}; use crate::pipe_log::{FileId, FileSeq, LogQueue}; use crate::util::{Factory, ReadableSize}; use crate::{Error, Result}; use super::format::{ - build_reserved_file_name, lock_file_path, parse_reserved_file_name, FileNameExt, LogFileFormat, + FileNameExt, LogFileFormat, build_reserved_file_name, lock_file_path, parse_reserved_file_name, }; use super::log_file::build_file_reader; use super::pipe::{ - find_available_dir, DualPipes, File, PathId, Paths, SinglePipe, DEFAULT_FIRST_FILE_SEQ, + DEFAULT_FIRST_FILE_SEQ, DualPipes, File, PathId, Paths, SinglePipe, find_available_dir, }; use super::reader::LogItemBatchFileReader; diff --git a/src/file_pipe_log/reader.rs b/src/file_pipe_log/reader.rs index 106ba72f..4087bec0 100644 --- a/src/file_pipe_log/reader.rs +++ b/src/file_pipe_log/reader.rs @@ -1,12 +1,12 @@ // Copyright 2021 TiKV Project Authors. Licensed under Apache-2.0. use crate::env::FileSystem; -use crate::log_batch::{LogBatch, LogItemBatch, LOG_BATCH_HEADER_LEN}; +use crate::log_batch::{LOG_BATCH_HEADER_LEN, LogBatch, LogItemBatch}; use crate::pipe_log::{FileBlockHandle, FileId, LogFileContext}; use crate::util::round_up; use crate::{Error, Result}; -use super::format::{is_zero_padded, LogFileFormat}; +use super::format::{LogFileFormat, is_zero_padded}; use super::log_file::LogFileReader; /// A reusable reader over [`LogItemBatch`]s in a log file. diff --git a/src/filter.rs b/src/filter.rs index f992d788..c210f5b2 100644 --- a/src/filter.rs +++ b/src/filter.rs @@ -4,8 +4,8 @@ use std::path::Path; use std::sync::Arc; use hashbrown::HashMap; -use rhai::{Engine, Scope, AST}; -use scopeguard::{guard, ScopeGuard}; +use rhai::{AST, Engine, Scope}; +use scopeguard::{ScopeGuard, guard}; use crate::env::FileSystem; use crate::file_pipe_log::debug::{build_file_reader, build_file_writer}; diff --git a/src/fork.rs b/src/fork.rs index cab65a92..ff1e57c1 100644 --- a/src/fork.rs +++ b/src/fork.rs @@ -9,11 +9,11 @@ use std::os::unix::fs::symlink; #[cfg(windows)] use std::os::windows::fs::symlink_file as symlink; +use crate::Engine; use crate::config::{Config, RecoveryMode}; use crate::env::FileSystem; use crate::file_pipe_log::{FileNameExt, FilePipeLog, FilePipeLogBuilder}; use crate::pipe_log::{FileId, LogQueue}; -use crate::Engine; /// Returned by `Engine::fork`. #[derive(Default)] diff --git a/src/lib.rs b/src/lib.rs index f282f6cc..45b5084b 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -69,7 +69,7 @@ pub use config::{Config, RecoveryMode}; pub use engine::Engine; pub use errors::{Error, Result}; pub use log_batch::{Command, LogBatch, MessageExt}; -pub use metrics::{get_perf_context, set_perf_context, take_perf_context, PerfContext}; +pub use metrics::{PerfContext, get_perf_context, set_perf_context, take_perf_context}; pub use pipe_log::Version; pub use util::ReadableSize; diff --git a/src/log_batch.rs b/src/log_batch.rs index 2dda5481..7387fb29 100644 --- a/src/log_batch.rs +++ b/src/log_batch.rs @@ -3,8 +3,8 @@ use std::fmt::Debug; use std::io::BufRead; use std::mem; -use std::sync::atomic::{AtomicU64, Ordering}; use std::sync::Arc; +use std::sync::atomic::{AtomicU64, Ordering}; use byteorder::{BigEndian, LittleEndian, ReadBytesExt, WriteBytesExt}; use log::error; @@ -17,7 +17,7 @@ use crate::memtable::EntryIndex; use crate::metrics::StopWatch; use crate::pipe_log::{FileBlockHandle, FileId, LogFileContext, ReactiveBytes}; use crate::util::{crc32, lz4}; -use crate::{perf_context, Error, Result}; +use crate::{Error, Result, perf_context}; pub(crate) const LOG_BATCH_HEADER_LEN: usize = 16; pub(crate) const LOG_BATCH_CHECKSUM_LEN: usize = 4; @@ -1600,34 +1600,40 @@ mod tests { let mut copy = encoded.to_owned(); copy.truncate(LOG_BATCH_HEADER_LEN - 1); - assert!(LogBatch::decode_header(&mut copy.as_slice()) - .unwrap_err() - .to_string() - .contains("Log batch header too short")); + assert!( + LogBatch::decode_header(&mut copy.as_slice()) + .unwrap_err() + .to_string() + .contains("Log batch header too short") + ); let mut copy = encoded.to_owned(); (&mut copy[LOG_BATCH_HEADER_LEN - 8..LOG_BATCH_HEADER_LEN]) .write_u64::(encoded.len() as u64 + 1) .unwrap(); - assert!(LogBatch::decode_header(&mut copy.as_slice()) - .unwrap_err() - .to_string() - .contains("Log item offset exceeds log batch length")); + assert!( + LogBatch::decode_header(&mut copy.as_slice()) + .unwrap_err() + .to_string() + .contains("Log item offset exceeds log batch length") + ); let mut copy = encoded.to_owned(); (&mut copy[LOG_BATCH_HEADER_LEN - 8..LOG_BATCH_HEADER_LEN]) .write_u64::(LOG_BATCH_HEADER_LEN as u64 - 1) .unwrap(); - assert!(LogBatch::decode_header(&mut copy.as_slice()) - .unwrap_err() - .to_string() - .contains("Log item offset is smaller than log batch header length")); + assert!( + LogBatch::decode_header(&mut copy.as_slice()) + .unwrap_err() + .to_string() + .contains("Log item offset is smaller than log batch header length") + ); } #[cfg(feature = "nightly")] #[bench] fn bench_log_batch_add_entry_and_encode(b: &mut test::Bencher) { - use rand::{thread_rng, Rng}; + use rand::{Rng, thread_rng}; fn details(log_batch: &mut LogBatch, entries: &[Entry], regions: usize) { for _ in 0..regions { log_batch diff --git a/src/memtable.rs b/src/memtable.rs index df621e60..24edafd4 100644 --- a/src/memtable.rs +++ b/src/memtable.rs @@ -19,7 +19,7 @@ use crate::log_batch::{ }; use crate::metrics::MEMORY_USAGE; use crate::pipe_log::{FileBlockHandle, FileId, FileSeq, LogQueue}; -use crate::util::{hash_u64, Factory}; +use crate::util::{Factory, hash_u64}; use crate::{Error, GlobalStats, Result}; #[cfg(feature = "swap")] @@ -1855,21 +1855,27 @@ mod tests { memtable.consistency_check(); let mut ents_idx = vec![]; - assert!(memtable - .fetch_entry_indexes_before(2, &mut ents_idx) - .is_ok()); + assert!( + memtable + .fetch_entry_indexes_before(2, &mut ents_idx) + .is_ok() + ); assert_eq!(ents_idx.len(), 10); assert_eq!(ents_idx.last().unwrap().index, 19); ents_idx.clear(); - assert!(memtable - .fetch_entry_indexes_before(1, &mut ents_idx) - .is_ok()); + assert!( + memtable + .fetch_entry_indexes_before(1, &mut ents_idx) + .is_ok() + ); assert!(ents_idx.is_empty()); ents_idx.clear(); - assert!(memtable - .fetch_rewritten_entry_indexes(&mut ents_idx) - .is_ok()); + assert!( + memtable + .fetch_rewritten_entry_indexes(&mut ents_idx) + .is_ok() + ); assert_eq!(ents_idx.len(), 10); assert_eq!(ents_idx.first().unwrap().index, 0); assert_eq!(ents_idx.last().unwrap().index, 9); diff --git a/src/purge.rs b/src/purge.rs index 685aac1a..f457b6c9 100644 --- a/src/purge.rs +++ b/src/purge.rs @@ -3,8 +3,8 @@ use std::collections::VecDeque; use std::collections::{HashMap, HashSet}; use std::mem; -use std::sync::atomic::{AtomicUsize, Ordering}; use std::sync::Arc; +use std::sync::atomic::{AtomicUsize, Ordering}; use fail::fail_point; use log::{info, warn}; diff --git a/src/swappy_allocator.rs b/src/swappy_allocator.rs index 01f406be..c30cd31b 100644 --- a/src/swappy_allocator.rs +++ b/src/swappy_allocator.rs @@ -6,8 +6,8 @@ use std::alloc::{AllocError, Allocator, Global, Layout}; use std::fs::{File, OpenOptions}; use std::path::{Path, PathBuf}; use std::ptr::{self, NonNull}; -use std::sync::atomic::{AtomicBool, AtomicU32, AtomicUsize, Ordering}; use std::sync::Arc; +use std::sync::atomic::{AtomicBool, AtomicU32, AtomicUsize, Ordering}; use std::vec::Vec; use log::{error, warn}; @@ -651,10 +651,12 @@ mod tests { { let mut vec: Vec = Vec::new_in(allocator.clone()); global.set_err_mode(true); - assert!(catch_unwind_silent(|| { - vec.resize(16, 0); - }) - .is_err()); + assert!( + catch_unwind_silent(|| { + vec.resize(16, 0); + }) + .is_err() + ); assert_eq!(allocator.memory_usage(), 0); global.set_err_mode(false); vec.resize(16, 0); @@ -666,10 +668,12 @@ mod tests { vec.resize(16, 0); assert_eq!(allocator.memory_usage(), 16); global.set_err_mode(true); - assert!(catch_unwind_silent(|| { - vec.resize(32, 0); - }) - .is_err()); + assert!( + catch_unwind_silent(|| { + vec.resize(32, 0); + }) + .is_err() + ); assert_eq!(allocator.memory_usage(), 16); global.set_err_mode(false); vec.resize(32, 0); @@ -682,10 +686,12 @@ mod tests { assert_eq!(allocator.memory_usage(), 32); global.set_err_mode(true); vec.resize(16, 0); - assert!(catch_unwind_silent(|| { - vec.shrink_to_fit(); - }) - .is_err()); + assert!( + catch_unwind_silent(|| { + vec.shrink_to_fit(); + }) + .is_err() + ); assert_eq!(allocator.memory_usage(), 32); global.set_err_mode(false); vec.shrink_to_fit(); @@ -1095,10 +1101,12 @@ mod tests { v.push_front(D(1, false)); v.push_front(D(0, false)); - assert!(catch_unwind_silent(|| { - v.drain(1..=4); - }) - .is_err()); + assert!( + catch_unwind_silent(|| { + v.drain(1..=4); + }) + .is_err() + ); assert_eq!(unsafe { DROPS }, 4); assert_eq!(v.len(), 3); diff --git a/tests/benches/bench_recovery.rs b/tests/benches/bench_recovery.rs index 2013c7ac..7665fd7d 100644 --- a/tests/benches/bench_recovery.rs +++ b/tests/benches/bench_recovery.rs @@ -1,6 +1,6 @@ // Copyright (c) 2017-present, PingCAP, Inc. Licensed under Apache-2.0. -use criterion::{criterion_group, BenchmarkId, Criterion}; +use criterion::{BenchmarkId, Criterion, criterion_group}; use raft::eraftpb::Entry; use raft_engine::ReadableSize; use raft_engine::{Config as EngineConfig, Engine, LogBatch, MessageExt, Result}; @@ -44,7 +44,9 @@ impl Default for Config { impl fmt::Display for Config { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - write!(f, "{} [region-count: {}][batch-size: {}][item-size: {}][entry-size: {}][batch-compression-threshold: {}]", + write!( + f, + "{} [region-count: {}][batch-size: {}][item-size: {}][entry-size: {}][batch-compression-threshold: {}]", self.total_size, self.region_count, self.batch_size, diff --git a/tests/failpoints/test_engine.rs b/tests/failpoints/test_engine.rs index 1ff90de3..006464b8 100644 --- a/tests/failpoints/test_engine.rs +++ b/tests/failpoints/test_engine.rs @@ -678,14 +678,16 @@ fn test_recycle_with_stale_logbatch_at_tail() { // Causing the final log file is a recycled file, containing rewritten // LogBatchs and end with stale LogBatchs, `Engine::open(...)` should // `panic` when recovering the relate `Memtable`. - assert!(catch_unwind_silent(|| { - let cfg_v2 = Config { - format_version: Version::V2, - ..cfg_err - }; - Engine::open(cfg_v2) - }) - .is_err()); + assert!( + catch_unwind_silent(|| { + let cfg_v2 = Config { + format_version: Version::V2, + ..cfg_err + }; + Engine::open(cfg_v2) + }) + .is_err() + ); } #[test] diff --git a/tests/failpoints/test_io_error.rs b/tests/failpoints/test_io_error.rs index 4383d7b8..a81c914c 100644 --- a/tests/failpoints/test_io_error.rs +++ b/tests/failpoints/test_io_error.rs @@ -105,10 +105,12 @@ fn test_file_write_error() { engine .write(&mut generate_batch(1, 2, 3, Some(&entry)), false) .unwrap(); - assert!(catch_unwind_silent(|| { - let _ = engine.write(&mut generate_batch(1, 3, 4, Some(&entry)), true); - }) - .is_err()); + assert!( + catch_unwind_silent(|| { + let _ = engine.write(&mut generate_batch(1, 3, 4, Some(&entry)), true); + }) + .is_err() + ); } // Internal states are consistent after panics. But outstanding writes are not @@ -155,10 +157,12 @@ fn test_file_rotate_error(restart_after_failure: bool) { { // Fail to sync old log file. let _f = FailGuard::new("log_fd::sync::err", "return"); - assert!(catch_unwind_silent(|| { - let _ = engine.write(&mut generate_batch(1, 4, 5, Some(&entry)), false); - }) - .is_err()); + assert!( + catch_unwind_silent(|| { + let _ = engine.write(&mut generate_batch(1, 4, 5, Some(&entry)), false); + }) + .is_err() + ); } if restart_after_failure { drop(engine); @@ -168,9 +172,11 @@ fn test_file_rotate_error(restart_after_failure: bool) { { // Fail to create new log file. let _f = FailGuard::new("default_fs::create::err", "return"); - assert!(engine - .write(&mut generate_batch(1, 4, 5, Some(&entry)), false) - .is_err()); + assert!( + engine + .write(&mut generate_batch(1, 4, 5, Some(&entry)), false) + .is_err() + ); } if restart_after_failure { drop(engine); @@ -180,9 +186,11 @@ fn test_file_rotate_error(restart_after_failure: bool) { { // Fail to write header of new log file. let _f = FailGuard::new("log_file::write::err", "1*off->return"); - assert!(engine - .write(&mut generate_batch(1, 4, 5, Some(&entry)), false) - .is_err()); + assert!( + engine + .write(&mut generate_batch(1, 4, 5, Some(&entry)), false) + .is_err() + ); } if restart_after_failure { drop(engine); @@ -201,10 +209,12 @@ fn test_file_rotate_error(restart_after_failure: bool) { // If the engine restarted, the write does not require sync will succeed. // Fail to sync new log file. The old log file is already sync-ed at this point. let _f = FailGuard::new("log_fd::sync::err", "return"); - assert!(catch_unwind_silent(|| { - let _ = engine.write(&mut generate_batch(1, 4, 5, Some(&entry)), false); - }) - .is_err()); + assert!( + catch_unwind_silent(|| { + let _ = engine.write(&mut generate_batch(1, 4, 5, Some(&entry)), false); + }) + .is_err() + ); assert_eq!(engine.file_span(LogQueue::Append).1, 1); } @@ -372,12 +382,14 @@ fn test_non_atomic_write_error() { let engine = Engine::open_with_file_system(cfg.clone(), fs.clone()).unwrap(); let _f1 = FailGuard::new("log_file::write::err", "return"); let _f2 = FailGuard::new("log_file::seek::err", "return"); - assert!(catch_unwind_silent(|| { - engine - .write(&mut generate_batch(rid, 6, 7, Some(&entry)), true) - .unwrap_err(); - }) - .is_err()); + assert!( + catch_unwind_silent(|| { + engine + .write(&mut generate_batch(rid, 6, 7, Some(&entry)), true) + .unwrap_err(); + }) + .is_err() + ); } { let engine = Engine::open_with_file_system(cfg, fs).unwrap(); @@ -572,9 +584,11 @@ fn test_no_space_write_error() { }; let engine = Engine::open(cfg_err).unwrap(); let _f = FailGuard::new("log_fd::write::no_space_err", "return"); - assert!(engine - .write(&mut generate_batch(2, 11, 21, Some(&entry)), true) - .is_err()); + assert!( + engine + .write(&mut generate_batch(2, 11, 21, Some(&entry)), true) + .is_err() + ); assert_eq!( 0, engine @@ -588,9 +602,11 @@ fn test_no_space_write_error() { let _f1 = FailGuard::new("log_fd::write::no_space_err", "2*return->off"); let _f2 = FailGuard::new("file_pipe_log::force_choose_dir", "return"); // The first write should fail, because all dirs run out of space for writing. - assert!(engine - .write(&mut generate_batch(2, 11, 21, Some(&entry)), true) - .is_err()); + assert!( + engine + .write(&mut generate_batch(2, 11, 21, Some(&entry)), true) + .is_err() + ); assert_eq!( 0, engine @@ -643,9 +659,11 @@ fn test_no_space_write_error() { "log_fd::write::no_space_err", "1*return->1*off->1*return->1*off", ); - assert!(engine - .write(&mut generate_batch(7, 11, 21, Some(&entry)), true) - .is_err()); + assert!( + engine + .write(&mut generate_batch(7, 11, 21, Some(&entry)), true) + .is_err() + ); assert_eq!( 0, engine diff --git a/tests/failpoints/util.rs b/tests/failpoints/util.rs index 188f66d7..ab2f1000 100644 --- a/tests/failpoints/util.rs +++ b/tests/failpoints/util.rs @@ -1,7 +1,7 @@ // Copyright (c) 2017-present, PingCAP, Inc. Licensed under Apache-2.0. use std::panic::{self, AssertUnwindSafe}; -use std::sync::{mpsc, Arc}; +use std::sync::{Arc, mpsc}; use raft::eraftpb::Entry; use raft_engine::env::FileSystem; From f37dfdd7f566aeb1c486a31590f0287480e54238 Mon Sep 17 00:00:00 2001 From: zhangjinpeng87 Date: Tue, 24 Feb 2026 20:43:50 -0800 Subject: [PATCH 07/11] fix clippy Signed-off-by: zhangjinpeng87 --- Makefile | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Makefile b/Makefile index a4fd53c5..9639afc8 100644 --- a/Makefile +++ b/Makefile @@ -53,9 +53,9 @@ clippy: cargo ${TOOLCHAIN_ARGS} update -p grpcio-sys@0.10.3+1.44.0-patched --precise 0.10.1+1.44.0; \ fi ifdef WITH_NIGHTLY_FEATURES - cargo ${TOOLCHAIN_ARGS} clippy --all --features nightly_group,failpoints --all-targets -- -D clippy::all ${CLIPPY_WHITELIST} + CMAKE_ARGS="-DCMAKE_POLICY_VERSION_MINIMUM=3.5 $${CMAKE_ARGS}" cargo ${TOOLCHAIN_ARGS} clippy --all --features nightly_group,failpoints --all-targets -- -D clippy::all ${CLIPPY_WHITELIST} else - cargo ${TOOLCHAIN_ARGS} clippy --all --features failpoints --all-targets -- -D clippy::all ${CLIPPY_WHITELIST} + CMAKE_ARGS="-DCMAKE_POLICY_VERSION_MINIMUM=3.5 $${CMAKE_ARGS}" cargo ${TOOLCHAIN_ARGS} clippy --all --features failpoints --all-targets -- -D clippy::all ${CLIPPY_WHITELIST} endif ## Run tests. From 64cafbf3369121a1ce4e2e708258ebf017d67902 Mon Sep 17 00:00:00 2001 From: zhangjinpeng87 Date: Tue, 24 Feb 2026 20:58:57 -0800 Subject: [PATCH 08/11] fix rust nightly & stable ci Signed-off-by: zhangjinpeng87 --- Makefile | 21 +++++++++++---------- 1 file changed, 11 insertions(+), 10 deletions(-) diff --git a/Makefile b/Makefile index 9639afc8..258ee949 100644 --- a/Makefile +++ b/Makefile @@ -42,6 +42,7 @@ format: cargo ${TOOLCHAIN_ARGS} fmt --all CLIPPY_WHITELIST += -A clippy::bool_assert_comparison +CMAKE_COMPAT_ARGS := -DCMAKE_POLICY_VERSION_MINIMUM=3.5 ## Run clippy. clippy: # Fresh lockfile resolution can pull grpcio/grpcio-sys versions that fail on @@ -53,19 +54,19 @@ clippy: cargo ${TOOLCHAIN_ARGS} update -p grpcio-sys@0.10.3+1.44.0-patched --precise 0.10.1+1.44.0; \ fi ifdef WITH_NIGHTLY_FEATURES - CMAKE_ARGS="-DCMAKE_POLICY_VERSION_MINIMUM=3.5 $${CMAKE_ARGS}" cargo ${TOOLCHAIN_ARGS} clippy --all --features nightly_group,failpoints --all-targets -- -D clippy::all ${CLIPPY_WHITELIST} + CMAKE_ARGS="${CMAKE_COMPAT_ARGS} $${CMAKE_ARGS}" cargo ${TOOLCHAIN_ARGS} clippy --all --features nightly_group,failpoints --all-targets -- -D clippy::all ${CLIPPY_WHITELIST} else - CMAKE_ARGS="-DCMAKE_POLICY_VERSION_MINIMUM=3.5 $${CMAKE_ARGS}" cargo ${TOOLCHAIN_ARGS} clippy --all --features failpoints --all-targets -- -D clippy::all ${CLIPPY_WHITELIST} + CMAKE_ARGS="${CMAKE_COMPAT_ARGS} $${CMAKE_ARGS}" cargo ${TOOLCHAIN_ARGS} clippy --all --features failpoints --all-targets -- -D clippy::all ${CLIPPY_WHITELIST} endif ## Run tests. test: ifdef WITH_NIGHTLY_FEATURES - cargo ${TOOLCHAIN_ARGS} test --all --features nightly_group ${EXTRA_CARGO_ARGS} -- --nocapture - cargo ${TOOLCHAIN_ARGS} test --test failpoints --features nightly_group,failpoints ${EXTRA_CARGO_ARGS} -- --test-threads 1 --nocapture + CMAKE_ARGS="${CMAKE_COMPAT_ARGS} $${CMAKE_ARGS}" cargo ${TOOLCHAIN_ARGS} test --all --features nightly_group ${EXTRA_CARGO_ARGS} -- --nocapture + CMAKE_ARGS="${CMAKE_COMPAT_ARGS} $${CMAKE_ARGS}" cargo ${TOOLCHAIN_ARGS} test --test failpoints --features nightly_group,failpoints ${EXTRA_CARGO_ARGS} -- --test-threads 1 --nocapture else - cargo ${TOOLCHAIN_ARGS} test --all ${EXTRA_CARGO_ARGS} -- --nocapture - cargo ${TOOLCHAIN_ARGS} test --test failpoints --features failpoints ${EXTRA_CARGO_ARGS} -- --test-threads 1 --nocapture + CMAKE_ARGS="${CMAKE_COMPAT_ARGS} $${CMAKE_ARGS}" cargo ${TOOLCHAIN_ARGS} test --all ${EXTRA_CARGO_ARGS} -- --nocapture + CMAKE_ARGS="${CMAKE_COMPAT_ARGS} $${CMAKE_ARGS}" cargo ${TOOLCHAIN_ARGS} test --test failpoints --features failpoints ${EXTRA_CARGO_ARGS} -- --test-threads 1 --nocapture endif ## Run tests with various features for maximum code coverage. @@ -74,10 +75,10 @@ test_matrix: $(error Must run test matrix with nightly features. Please reset WITH_STABLE_TOOLCHAIN.) else test_matrix: test - cargo ${TOOLCHAIN_ARGS} test --all ${EXTRA_CARGO_ARGS} -- --nocapture - cargo ${TOOLCHAIN_ARGS} test --test failpoints --features failpoints ${EXTRA_CARGO_ARGS} -- --test-threads 1 --nocapture - cargo ${TOOLCHAIN_ARGS} test --all --features nightly_group,std_fs ${EXTRA_CARGO_ARGS} -- --nocapture - cargo ${TOOLCHAIN_ARGS} test --test failpoints --features nightly_group,std_fs,failpoints ${EXTRA_CARGO_ARGS} -- --test-threads 1 --nocapture + CMAKE_ARGS="${CMAKE_COMPAT_ARGS} $${CMAKE_ARGS}" cargo ${TOOLCHAIN_ARGS} test --all ${EXTRA_CARGO_ARGS} -- --nocapture + CMAKE_ARGS="${CMAKE_COMPAT_ARGS} $${CMAKE_ARGS}" cargo ${TOOLCHAIN_ARGS} test --test failpoints --features failpoints ${EXTRA_CARGO_ARGS} -- --test-threads 1 --nocapture + CMAKE_ARGS="${CMAKE_COMPAT_ARGS} $${CMAKE_ARGS}" cargo ${TOOLCHAIN_ARGS} test --all --features nightly_group,std_fs ${EXTRA_CARGO_ARGS} -- --nocapture + CMAKE_ARGS="${CMAKE_COMPAT_ARGS} $${CMAKE_ARGS}" cargo ${TOOLCHAIN_ARGS} test --test failpoints --features nightly_group,std_fs,failpoints ${EXTRA_CARGO_ARGS} -- --test-threads 1 --nocapture endif ## Build raft-engine-ctl. From 1094ea4179d2e2dc7c31c937e47412a42994272b Mon Sep 17 00:00:00 2001 From: zhangjinpeng87 Date: Wed, 25 Feb 2026 10:49:19 -0800 Subject: [PATCH 09/11] fix ci after upgrade rustc Signed-off-by: zhangjinpeng87 --- Makefile | 22 +++++++++++----------- scripts/cmake-wrapper.sh | 12 ++++++++++++ 2 files changed, 23 insertions(+), 11 deletions(-) create mode 100755 scripts/cmake-wrapper.sh diff --git a/Makefile b/Makefile index 258ee949..1a07655a 100644 --- a/Makefile +++ b/Makefile @@ -42,7 +42,7 @@ format: cargo ${TOOLCHAIN_ARGS} fmt --all CLIPPY_WHITELIST += -A clippy::bool_assert_comparison -CMAKE_COMPAT_ARGS := -DCMAKE_POLICY_VERSION_MINIMUM=3.5 +CMAKE_COMPAT := CMAKE="$(CURDIR)/scripts/cmake-wrapper.sh" ## Run clippy. clippy: # Fresh lockfile resolution can pull grpcio/grpcio-sys versions that fail on @@ -54,19 +54,19 @@ clippy: cargo ${TOOLCHAIN_ARGS} update -p grpcio-sys@0.10.3+1.44.0-patched --precise 0.10.1+1.44.0; \ fi ifdef WITH_NIGHTLY_FEATURES - CMAKE_ARGS="${CMAKE_COMPAT_ARGS} $${CMAKE_ARGS}" cargo ${TOOLCHAIN_ARGS} clippy --all --features nightly_group,failpoints --all-targets -- -D clippy::all ${CLIPPY_WHITELIST} + ${CMAKE_COMPAT} cargo ${TOOLCHAIN_ARGS} clippy --all --features nightly_group,failpoints --all-targets -- -D clippy::all ${CLIPPY_WHITELIST} else - CMAKE_ARGS="${CMAKE_COMPAT_ARGS} $${CMAKE_ARGS}" cargo ${TOOLCHAIN_ARGS} clippy --all --features failpoints --all-targets -- -D clippy::all ${CLIPPY_WHITELIST} + ${CMAKE_COMPAT} cargo ${TOOLCHAIN_ARGS} clippy --all --features failpoints --all-targets -- -D clippy::all ${CLIPPY_WHITELIST} endif ## Run tests. test: ifdef WITH_NIGHTLY_FEATURES - CMAKE_ARGS="${CMAKE_COMPAT_ARGS} $${CMAKE_ARGS}" cargo ${TOOLCHAIN_ARGS} test --all --features nightly_group ${EXTRA_CARGO_ARGS} -- --nocapture - CMAKE_ARGS="${CMAKE_COMPAT_ARGS} $${CMAKE_ARGS}" cargo ${TOOLCHAIN_ARGS} test --test failpoints --features nightly_group,failpoints ${EXTRA_CARGO_ARGS} -- --test-threads 1 --nocapture + ${CMAKE_COMPAT} cargo ${TOOLCHAIN_ARGS} test --all --features nightly_group ${EXTRA_CARGO_ARGS} -- --nocapture + ${CMAKE_COMPAT} cargo ${TOOLCHAIN_ARGS} test --test failpoints --features nightly_group,failpoints ${EXTRA_CARGO_ARGS} -- --test-threads 1 --nocapture else - CMAKE_ARGS="${CMAKE_COMPAT_ARGS} $${CMAKE_ARGS}" cargo ${TOOLCHAIN_ARGS} test --all ${EXTRA_CARGO_ARGS} -- --nocapture - CMAKE_ARGS="${CMAKE_COMPAT_ARGS} $${CMAKE_ARGS}" cargo ${TOOLCHAIN_ARGS} test --test failpoints --features failpoints ${EXTRA_CARGO_ARGS} -- --test-threads 1 --nocapture + ${CMAKE_COMPAT} cargo ${TOOLCHAIN_ARGS} test --all ${EXTRA_CARGO_ARGS} -- --nocapture + ${CMAKE_COMPAT} cargo ${TOOLCHAIN_ARGS} test --test failpoints --features failpoints ${EXTRA_CARGO_ARGS} -- --test-threads 1 --nocapture endif ## Run tests with various features for maximum code coverage. @@ -75,10 +75,10 @@ test_matrix: $(error Must run test matrix with nightly features. Please reset WITH_STABLE_TOOLCHAIN.) else test_matrix: test - CMAKE_ARGS="${CMAKE_COMPAT_ARGS} $${CMAKE_ARGS}" cargo ${TOOLCHAIN_ARGS} test --all ${EXTRA_CARGO_ARGS} -- --nocapture - CMAKE_ARGS="${CMAKE_COMPAT_ARGS} $${CMAKE_ARGS}" cargo ${TOOLCHAIN_ARGS} test --test failpoints --features failpoints ${EXTRA_CARGO_ARGS} -- --test-threads 1 --nocapture - CMAKE_ARGS="${CMAKE_COMPAT_ARGS} $${CMAKE_ARGS}" cargo ${TOOLCHAIN_ARGS} test --all --features nightly_group,std_fs ${EXTRA_CARGO_ARGS} -- --nocapture - CMAKE_ARGS="${CMAKE_COMPAT_ARGS} $${CMAKE_ARGS}" cargo ${TOOLCHAIN_ARGS} test --test failpoints --features nightly_group,std_fs,failpoints ${EXTRA_CARGO_ARGS} -- --test-threads 1 --nocapture + ${CMAKE_COMPAT} cargo ${TOOLCHAIN_ARGS} test --all ${EXTRA_CARGO_ARGS} -- --nocapture + ${CMAKE_COMPAT} cargo ${TOOLCHAIN_ARGS} test --test failpoints --features failpoints ${EXTRA_CARGO_ARGS} -- --test-threads 1 --nocapture + ${CMAKE_COMPAT} cargo ${TOOLCHAIN_ARGS} test --all --features nightly_group,std_fs ${EXTRA_CARGO_ARGS} -- --nocapture + ${CMAKE_COMPAT} cargo ${TOOLCHAIN_ARGS} test --test failpoints --features nightly_group,std_fs,failpoints ${EXTRA_CARGO_ARGS} -- --test-threads 1 --nocapture endif ## Build raft-engine-ctl. diff --git a/scripts/cmake-wrapper.sh b/scripts/cmake-wrapper.sh new file mode 100755 index 00000000..3a0b131c --- /dev/null +++ b/scripts/cmake-wrapper.sh @@ -0,0 +1,12 @@ +#!/usr/bin/env bash +set -euo pipefail + +if [[ $# -gt 0 ]]; then + case "$1" in + --build|--install|--open|--help|--version) + exec cmake "$@" + ;; + esac +fi + +exec cmake -DCMAKE_POLICY_VERSION_MINIMUM=3.5 "$@" From bbf0632032f340905a6879df632e8c68e51c507b Mon Sep 17 00:00:00 2001 From: zhangjinpeng87 Date: Wed, 25 Feb 2026 11:20:27 -0800 Subject: [PATCH 10/11] fix stable clippy Signed-off-by: zhangjinpeng87 --- Makefile | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Makefile b/Makefile index 1a07655a..a2b853cc 100644 --- a/Makefile +++ b/Makefile @@ -50,8 +50,8 @@ clippy: @if cargo ${TOOLCHAIN_ARGS} tree --all-features -i 'grpcio@0.13.0' >/dev/null 2>&1; then \ cargo ${TOOLCHAIN_ARGS} update -p grpcio@0.13.0 --precise 0.10.2; \ fi - @if cargo ${TOOLCHAIN_ARGS} tree --all-features -i 'grpcio-sys@0.10.3+1.44.0-patched' >/dev/null 2>&1; then \ - cargo ${TOOLCHAIN_ARGS} update -p grpcio-sys@0.10.3+1.44.0-patched --precise 0.10.1+1.44.0; \ + @if cargo ${TOOLCHAIN_ARGS} tree --all-features -i 'grpcio-sys@0.10.1+1.44.0' >/dev/null 2>&1; then \ + cargo ${TOOLCHAIN_ARGS} update -p grpcio-sys@0.10.1+1.44.0 --precise 0.10.3+1.44.0-patched; \ fi ifdef WITH_NIGHTLY_FEATURES ${CMAKE_COMPAT} cargo ${TOOLCHAIN_ARGS} clippy --all --features nightly_group,failpoints --all-targets -- -D clippy::all ${CLIPPY_WHITELIST} From cc0ad6d81a49c57a488bcbfa3fe3ddead3b9e72e Mon Sep 17 00:00:00 2001 From: zhangjinpeng87 Date: Wed, 25 Feb 2026 11:41:06 -0800 Subject: [PATCH 11/11] fix clippy ci Signed-off-by: zhangjinpeng87 --- .github/workflows/rust.yml | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/.github/workflows/rust.yml b/.github/workflows/rust.yml index 9b998d11..37f48ea6 100644 --- a/.github/workflows/rust.yml +++ b/.github/workflows/rust.yml @@ -71,16 +71,22 @@ jobs: - uses: Swatinem/rust-cache@v1 with: sharedKey: ${{ matrix.os }}-stable + - name: Install gRPC dependencies + run: | + sudo apt-get update + sudo apt-get install -y pkg-config libgrpc-dev libgrpc++-dev protobuf-compiler-grpc - name: Clippy run: make clippy env: WITH_STABLE_TOOLCHAIN: 'force' + GRPCIO_SYS_USE_PKG_CONFIG: '1' - name: Run tests run: make test env: RUST_BACKTRACE: 1 EXTRA_CARGO_ARGS: '--verbose' WITH_STABLE_TOOLCHAIN: 'force' + GRPCIO_SYS_USE_PKG_CONFIG: '1' coverage: runs-on: ubuntu-latest needs: nightly @@ -98,6 +104,10 @@ jobs: - uses: Swatinem/rust-cache@v1 with: sharedKey: ubuntu-latest + - name: Install gRPC dependencies + run: | + sudo apt-get update + sudo apt-get install -y pkg-config libgrpc-dev libgrpc++-dev protobuf-compiler-grpc - name: Install grcov run: if [[ ! -e ~/.cargo/bin/grcov ]]; then cargo install --locked grcov; fi - name: Run tests @@ -106,6 +116,7 @@ jobs: RUSTFLAGS: '-Cinstrument-coverage' LLVM_PROFILE_FILE: '%p-%m.profraw' EXTRA_CARGO_ARGS: '--verbose' + GRPCIO_SYS_USE_PKG_CONFIG: '1' - name: Run grcov run: grcov `find . \( -name "*.profraw" \) -print` --binary-path target/debug/deps/ -s . -t lcov --branch --ignore-not-existing --ignore '../**' --ignore '/*' -o coverage.lcov - name: Upload