From b6f7cd0733ffdebdce4e7bfbc0a1e18e31b3f1fb Mon Sep 17 00:00:00 2001 From: Joshua Chi Date: Mon, 13 Apr 2026 18:52:54 +0800 Subject: [PATCH 1/2] =?UTF-8?q?chore=20#353:=20upgrade=20tonic=200.12=20?= =?UTF-8?q?=E2=86=92=200.13=20to=20eliminate=20rand=200.8.5=20transitive?= =?UTF-8?q?=20dependency?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit tower 0.4 (pulled in by tonic 0.12) depended on rand 0.8.5, triggering RUSTSEC-2026-0097. tonic 0.13 uses tower 0.5 which drops rand entirely. - tonic/tonic-health/tonic-build: 0.12 → 0.13 - tls feature renamed: `tls` → `tls-ring` (tonic 0.13 breaking change) - Replace `use tonic::async_trait` with `use async_trait::async_trait` across 41 files (removed in tonic 0.13) - Remove mut on health_reporter (now returns immutable in tonic-health 0.13) - Remove RUSTSEC-2026-0097 ignore from deny.toml - Fix embedded-bench: rand 0.8 → 0.9, migrate SmallRng/gen/Alphanumeric API --- Cargo.lock | 144 +++++------------- Cargo.toml | 4 +- benches/embedded-bench/Cargo.toml | 2 +- benches/embedded-bench/src/main.rs | 6 +- d-engine-client/src/mock_rpc_service.rs | 2 +- d-engine-core/Cargo.toml | 4 +- .../commit_handler/default_commit_handler.rs | 2 +- d-engine-core/src/commit_handler/mod.rs | 2 +- .../src/election/election_handler.rs | 2 +- d-engine-core/src/election/mod.rs | 2 +- d-engine-core/src/membership.rs | 2 +- d-engine-core/src/network/mod.rs | 2 +- d-engine-core/src/purge/default_executor.rs | 2 +- d-engine-core/src/purge/mod.rs | 2 +- .../src/raft_role/candidate_state.rs | 2 +- d-engine-core/src/raft_role/follower_state.rs | 2 +- d-engine-core/src/raft_role/leader_state.rs | 2 +- d-engine-core/src/raft_role/learner_state.rs | 2 +- d-engine-core/src/raft_role/role_state.rs | 2 +- d-engine-core/src/replication/mod.rs | 2 +- .../src/replication/replication_handler.rs | 2 +- .../default_state_machine_handler.rs | 2 +- .../src/state_machine_handler/mod.rs | 2 +- .../src/storage/buffered_raft_log.rs | 2 +- d-engine-core/src/storage/raft_log.rs | 2 +- d-engine-core/src/storage/state_machine.rs | 2 +- .../src/storage/state_machine_test.rs | 2 +- d-engine-core/src/storage/storage_engine.rs | 2 +- .../src/storage/storage_engine_test.rs | 2 +- .../src/test_utils/mock/mock_rpc_service.rs | 2 +- d-engine-proto/Cargo.toml | 2 +- .../src/generated/d_engine.client.rs | 14 +- .../src/generated/d_engine.server.cluster.rs | 14 +- .../src/generated/d_engine.server.election.rs | 14 +- .../generated/d_engine.server.replication.rs | 14 +- .../src/generated/d_engine.server.storage.rs | 14 +- d-engine-server/Cargo.toml | 2 +- .../src/membership/raft_membership.rs | 2 +- .../src/network/grpc/grpc_transport.rs | 2 +- d-engine-server/src/network/grpc/mod.rs | 2 +- d-engine-server/src/network/health_checker.rs | 2 +- d-engine-server/src/network/health_monitor.rs | 2 +- .../storage/adaptors/file/file_engine_test.rs | 2 +- .../adaptors/file/file_state_machine.rs | 2 +- .../adaptors/file/file_state_machine_test.rs | 2 +- .../adaptors/file/file_storage_engine.rs | 2 +- .../adaptors/file/file_storage_engine_test.rs | 2 +- .../adaptors/rocksdb/rocksdb_state_machine.rs | 2 +- .../rocksdb/rocksdb_state_machine_test.rs | 2 +- .../rocksdb/rocksdb_storage_engine.rs | 2 +- .../rocksdb/rocksdb_storage_engine_test.rs | 2 +- .../rocksdb/rocksdb_unified_engine_test.rs | 2 +- .../src/test_utils/mock/mock_rpc_service.rs | 2 +- deny.toml | 1 - 54 files changed, 125 insertions(+), 192 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 98f5d2c7..06c6f6af 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -137,11 +137,10 @@ checksum = "c08606f8c3cbf4ce6ec8e28fb0014a2c086708fe954eaa885384a6165172e7e8" [[package]] name = "axum" -version = "0.7.9" +version = "0.8.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "edca88bc138befd0323b20752846e6587272d3b03b0343c8ea28a6f819e6e71f" +checksum = "8b52af3cb4058c895d37317bb27508dccc8e5f2d39454016b297bf4a400597b8" dependencies = [ - "async-trait", "axum-core", "bytes", "futures-util", @@ -154,29 +153,26 @@ dependencies = [ "mime", "percent-encoding", "pin-project-lite", - "rustversion", - "serde", + "serde_core", "sync_wrapper", - "tower 0.5.3", + "tower", "tower-layer", "tower-service", ] [[package]] name = "axum-core" -version = "0.4.5" +version = "0.5.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "09f2bd6146b97ae3359fa0cc6d6b376d9539582c7b4220f041a33ec24c226199" +checksum = "08c78f31d7b1291f7ee735c1c6780ccde7785daae9a9206026862dab7d8792d1" dependencies = [ - "async-trait", "bytes", - "futures-util", + "futures-core", "http", "http-body", "http-body-util", "mime", "pin-project-lite", - "rustversion", "sync_wrapper", "tower-layer", "tower-service", @@ -543,7 +539,7 @@ dependencies = [ "d-engine-proto", "futures", "mockall", - "rand 0.9.3", + "rand", "serde", "tokio", "tokio-stream", @@ -579,7 +575,7 @@ dependencies = [ "nix", "parking_lot", "prost", - "rand 0.9.3", + "rand", "serde", "serial_test", "sha2", @@ -929,7 +925,7 @@ dependencies = [ "futures-core", "futures-sink", "http", - "indexmap 2.14.0", + "indexmap", "slab", "tokio", "tokio-util", @@ -947,12 +943,6 @@ dependencies = [ "zerocopy", ] -[[package]] -name = "hashbrown" -version = "0.12.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" - [[package]] name = "hashbrown" version = "0.14.5" @@ -1103,16 +1093,6 @@ version = "2.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3d3067d79b975e8844ca9eb072e16b31c3c1c36928edf9c6789548c524d0d954" -[[package]] -name = "indexmap" -version = "1.9.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bd070e393353796e801d209ad339e89596eb4c8d430d18ede6a1cced8fafbd99" -dependencies = [ - "autocfg", - "hashbrown 0.12.3", -] - [[package]] name = "indexmap" version = "2.14.0" @@ -1291,9 +1271,9 @@ dependencies = [ [[package]] name = "matchit" -version = "0.7.3" +version = "0.8.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0e7465ac9959cc2b1404e8e2367b43684a6d13790fe23056cc8c6c5a6b7bcb94" +checksum = "47e1ffaa40ddd1f3ed91f717a33c8c0ee23fff369e3aa8772b9605cc1d22f4c3" [[package]] name = "memchr" @@ -1505,7 +1485,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3672b37090dbd86368a4145bc067582552b29c27377cad4e0a306c97f9bd7772" dependencies = [ "fixedbitset", - "indexmap 2.14.0", + "indexmap", ] [[package]] @@ -1713,35 +1693,14 @@ version = "6.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f8dcc9c7d52a811697d2151c701e0d08956f92b0e24136cf4cf27b57a6a0d9bf" -[[package]] -name = "rand" -version = "0.8.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" -dependencies = [ - "libc", - "rand_chacha 0.3.1", - "rand_core 0.6.4", -] - [[package]] name = "rand" version = "0.9.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7ec095654a25171c2124e9e3393a930bddbffdc939556c914957a4c3e0a87166" dependencies = [ - "rand_chacha 0.9.0", - "rand_core 0.9.5", -] - -[[package]] -name = "rand_chacha" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" -dependencies = [ - "ppv-lite86", - "rand_core 0.6.4", + "rand_chacha", + "rand_core", ] [[package]] @@ -1751,16 +1710,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d3022b5f1df60f26e1ffddd6c66e8aa15de382ae63b3a0c1bfc0e4d3e3f325cb" dependencies = [ "ppv-lite86", - "rand_core 0.9.5", -] - -[[package]] -name = "rand_core" -version = "0.6.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" -dependencies = [ - "getrandom 0.2.17", + "rand_core", ] [[package]] @@ -1927,15 +1877,6 @@ dependencies = [ "zeroize", ] -[[package]] -name = "rustls-pemfile" -version = "2.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dce314e5fee3f39953d46bb63bb8a46d40c2f8fb7cc5a3b6cab2bde9721d6e50" -dependencies = [ - "rustls-pki-types", -] - [[package]] name = "rustls-pki-types" version = "1.14.0" @@ -2319,6 +2260,7 @@ dependencies = [ "futures-core", "pin-project-lite", "tokio", + "tokio-util", ] [[package]] @@ -2361,7 +2303,7 @@ version = "0.22.27" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "41fe8c660ae4257887cf66394862d21dbca4a6ddd26f04a3560410406a2f819a" dependencies = [ - "indexmap 2.14.0", + "indexmap", "serde", "serde_spanned", "toml_datetime", @@ -2377,11 +2319,10 @@ checksum = "5d99f8c9a7727884afe522e9bd5edbfc91a3312b36a77b5fb8926e4c31a41801" [[package]] name = "tonic" -version = "0.12.3" +version = "0.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "877c5b330756d856ffcc4553ab34a5684481ade925ecc54bcd1bf02b1d0d4d52" +checksum = "7e581ba15a835f4d9ea06c55ab1bd4dce26fc53752c69a04aac00703bfb49ba9" dependencies = [ - "async-stream", "async-trait", "axum", "base64", @@ -2397,12 +2338,11 @@ dependencies = [ "percent-encoding", "pin-project", "prost", - "rustls-pemfile", "socket2 0.5.10", "tokio", "tokio-rustls", "tokio-stream", - "tower 0.4.13", + "tower", "tower-layer", "tower-service", "tracing", @@ -2410,9 +2350,9 @@ dependencies = [ [[package]] name = "tonic-build" -version = "0.12.3" +version = "0.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9557ce109ea773b399c9b9e5dca39294110b74f1f342cb347a80d1fce8c26a11" +checksum = "eac6f67be712d12f0b41328db3137e0d0757645d8904b4cb7d51cd9c2279e847" dependencies = [ "prettyplease", "proc-macro2", @@ -2424,11 +2364,10 @@ dependencies = [ [[package]] name = "tonic-health" -version = "0.12.3" +version = "0.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1eaf34ddb812120f5c601162d5429933c9b527d901ab0e7f930d3147e33a09b2" +checksum = "cb87334d340313fefa513b6e60794d44a86d5f039b523229c99c323e4e19ca4b" dependencies = [ - "async-stream", "prost", "tokio", "tokio-stream", @@ -2437,17 +2376,16 @@ dependencies = [ [[package]] name = "tower" -version = "0.4.13" +version = "0.5.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b8fa9be0de6cf49e536ce1851f987bd21a43b771b09473c3549a6c853db37c1c" +checksum = "ebe5ef63511595f1344e2d5cfa636d973292adc0eec1f0ad45fae9f0851ab1d4" dependencies = [ "futures-core", "futures-util", - "indexmap 1.9.3", - "pin-project", + "indexmap", "pin-project-lite", - "rand 0.8.5", "slab", + "sync_wrapper", "tokio", "tokio-util", "tower-layer", @@ -2455,20 +2393,6 @@ dependencies = [ "tracing", ] -[[package]] -name = "tower" -version = "0.5.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ebe5ef63511595f1344e2d5cfa636d973292adc0eec1f0ad45fae9f0851ab1d4" -dependencies = [ - "futures-core", - "futures-util", - "pin-project-lite", - "sync_wrapper", - "tower-layer", - "tower-service", -] - [[package]] name = "tower-layer" version = "0.3.3" @@ -2739,7 +2663,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bb0e353e6a2fbdc176932bbaab493762eb1255a7900fe0fea1a2f96c296cc909" dependencies = [ "anyhow", - "indexmap 2.14.0", + "indexmap", "wasm-encoder", "wasmparser", ] @@ -2752,7 +2676,7 @@ checksum = "47b807c72e1bac69382b3a6fb3dbe8ea4c0ed87ff5629b8685ae6b9a611028fe" dependencies = [ "bitflags", "hashbrown 0.15.5", - "indexmap 2.14.0", + "indexmap", "semver", ] @@ -2900,7 +2824,7 @@ checksum = "b7c566e0f4b284dd6561c786d9cb0142da491f46a9fbed79ea69cdad5db17f21" dependencies = [ "anyhow", "heck", - "indexmap 2.14.0", + "indexmap", "prettyplease", "syn", "wasm-metadata", @@ -2931,7 +2855,7 @@ checksum = "9d66ea20e9553b30172b5e831994e35fbde2d165325bec84fc43dbf6f4eb9cb2" dependencies = [ "anyhow", "bitflags", - "indexmap 2.14.0", + "indexmap", "log", "serde", "serde_derive", @@ -2950,7 +2874,7 @@ checksum = "ecc8ac4bc1dc3381b7f59c34f00b67e18f910c2c0f50015669dde7def656a736" dependencies = [ "anyhow", "id-arena", - "indexmap 2.14.0", + "indexmap", "log", "semver", "serde", diff --git a/Cargo.toml b/Cargo.toml index 59d4ec23..c4950a80 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -49,8 +49,8 @@ tokio = { version = "1", features = [ serde = { version = "1.0", default-features = false, features = ["derive"] } prost = { version = "0.13", default-features = false } bincode = "1.3" -tonic = { version = "0.12.3", features = ["gzip", "tls"] } -tonic-health = "0.12.3" +tonic = { version = "0.13", features = ["gzip", "tls-ring"] } +tonic-health = "0.13" bytes = { version = "1.10", features = ["serde"] } tracing = { version = "0.1.41" } futures = "0.3.30" diff --git a/benches/embedded-bench/Cargo.toml b/benches/embedded-bench/Cargo.toml index f524cfbe..1a66c3d4 100644 --- a/benches/embedded-bench/Cargo.toml +++ b/benches/embedded-bench/Cargo.toml @@ -13,7 +13,7 @@ reqwest = { version = "0.12", features = ["json"] } serde = { version = "1", features = ["derive"] } serde_json = "1" hdrhistogram = "7" -rand = "0.8" +rand = "0.9" futures = "0.3" tracing-subscriber = { version = "0.3", features = ["env-filter"] } tracing = { version = "0.1" } diff --git a/benches/embedded-bench/src/main.rs b/benches/embedded-bench/src/main.rs index 682a2c0c..caa0d23a 100644 --- a/benches/embedded-bench/src/main.rs +++ b/benches/embedded-bench/src/main.rs @@ -12,7 +12,7 @@ use axum::{ }; use clap::{Parser, Subcommand}; use hdrhistogram::Histogram; -use rand::distributions::Alphanumeric; +use rand::distr::Alphanumeric; use rand::{Rng, SeedableRng}; use serde::{Deserialize, Serialize}; @@ -164,8 +164,8 @@ fn generate_prefixed_key( } fn generate_value(size: usize) -> Vec { - let mut rng = rand::rngs::SmallRng::from_entropy(); - (0..size).map(|_| rng.r#gen()).collect() + let mut rng = rand::rngs::SmallRng::from_os_rng(); + (0..size).map(|_| rng.random()).collect() } #[tokio::main] diff --git a/d-engine-client/src/mock_rpc_service.rs b/d-engine-client/src/mock_rpc_service.rs index 92edaada..ad1b0241 100644 --- a/d-engine-client/src/mock_rpc_service.rs +++ b/d-engine-client/src/mock_rpc_service.rs @@ -27,7 +27,7 @@ impl MockNode { is_ready: bool, ) -> std::result::Result<(u16, SocketAddr), tonic::Status> { // Return port + address - let (mut health_reporter, health_service) = health_reporter(); + let (health_reporter, health_service) = health_reporter(); if is_ready { health_reporter.set_serving::>().await; health_reporter.set_serving::>().await; diff --git a/d-engine-core/Cargo.toml b/d-engine-core/Cargo.toml index 0512cf7b..eadbb56e 100644 --- a/d-engine-core/Cargo.toml +++ b/d-engine-core/Cargo.toml @@ -70,7 +70,7 @@ async-stream = "0.3.6" # Test utilities - optional, enabled via __test_support feature mockall = { version = "0.12.1", optional = true } uuid = { version = "1", features = ["v4"], optional = true } -tonic-health = { version = "0.12.3", optional = true } +tonic-health = { workspace = true, optional = true } [dev-dependencies] tracing-test = "0.2" @@ -80,7 +80,7 @@ tokio = { version = "1", features = ["test-util", "process"] } parking_lot = "0.12.3" nix = { version = "0.30.1", features = ["fs"] } mockall = "0.12.1" -tonic-health = "0.12.3" +tonic-health = { workspace = true } uuid = { version = "1", features = ["v4"] } criterion = { version = "0.5", features = ["html_reports", "async_tokio"] } diff --git a/d-engine-core/src/commit_handler/default_commit_handler.rs b/d-engine-core/src/commit_handler/default_commit_handler.rs index 01f7ae23..eae504e5 100644 --- a/d-engine-core/src/commit_handler/default_commit_handler.rs +++ b/d-engine-core/src/commit_handler/default_commit_handler.rs @@ -1,9 +1,9 @@ +use async_trait::async_trait; use d_engine_proto::common::Entry; use d_engine_proto::common::entry_payload::Payload; use std::sync::Arc; use tokio::sync::mpsc; use tokio::sync::watch; -use tonic::async_trait; use tracing::debug; use tracing::error; use tracing::info; diff --git a/d-engine-core/src/commit_handler/mod.rs b/d-engine-core/src/commit_handler/mod.rs index b23b3994..81f70dd5 100644 --- a/d-engine-core/src/commit_handler/mod.rs +++ b/d-engine-core/src/commit_handler/mod.rs @@ -55,9 +55,9 @@ pub use default_commit_handler::*; #[cfg(test)] mod default_commit_handler_test; +use async_trait::async_trait; #[cfg(any(test, feature = "__test_support"))] use mockall::automock; -use tonic::async_trait; use crate::Result; diff --git a/d-engine-core/src/election/election_handler.rs b/d-engine-core/src/election/election_handler.rs index df1ce4fb..738644a7 100644 --- a/d-engine-core/src/election/election_handler.rs +++ b/d-engine-core/src/election/election_handler.rs @@ -2,10 +2,10 @@ use std::fmt::Debug; use std::marker::PhantomData; use std::sync::Arc; +use async_trait::async_trait; use d_engine_proto::common::LogId; use d_engine_proto::server::election::VoteRequest; use d_engine_proto::server::election::VotedFor; -use tonic::async_trait; use tracing::debug; use tracing::error; use tracing::trace; diff --git a/d-engine-core/src/election/mod.rs b/d-engine-core/src/election/mod.rs index 9ee5639c..25efbdcc 100644 --- a/d-engine-core/src/election/mod.rs +++ b/d-engine-core/src/election/mod.rs @@ -12,11 +12,11 @@ mod election_handler_test; use std::sync::Arc; +use async_trait::async_trait; use d_engine_proto::server::election::VoteRequest; use d_engine_proto::server::election::VotedFor; #[cfg(any(test, feature = "__test_support"))] use mockall::automock; -use tonic::async_trait; use crate::RaftNodeConfig; use crate::Result; diff --git a/d-engine-core/src/membership.rs b/d-engine-core/src/membership.rs index 74c076c8..31106fb3 100644 --- a/d-engine-core/src/membership.rs +++ b/d-engine-core/src/membership.rs @@ -1,3 +1,4 @@ +use async_trait::async_trait; use d_engine_proto::common::MembershipChange; use d_engine_proto::common::NodeStatus; use d_engine_proto::server::cluster::ClusterConfChangeRequest; @@ -6,7 +7,6 @@ use d_engine_proto::server::cluster::ClusterMembership; use d_engine_proto::server::cluster::NodeMeta; #[cfg(any(test, feature = "__test_support"))] use mockall::automock; -use tonic::async_trait; use tonic::transport::Channel; use tracing::warn; diff --git a/d-engine-core/src/network/mod.rs b/d-engine-core/src/network/mod.rs index 864f08f3..094544c6 100644 --- a/d-engine-core/src/network/mod.rs +++ b/d-engine-core/src/network/mod.rs @@ -10,6 +10,7 @@ mod background_snapshot_transfer; #[cfg(test)] mod background_snapshot_transfer_test; +use async_trait::async_trait; pub use background_snapshot_transfer::*; use d_engine_proto::server::cluster::ClusterConfChangeRequest; use d_engine_proto::server::cluster::ClusterConfUpdateResponse; @@ -23,7 +24,6 @@ use futures::stream::BoxStream; #[cfg(any(test, feature = "__test_support"))] use mockall::automock; use tokio::sync::mpsc; -use tonic::async_trait; use crate::BackoffPolicy; use crate::NetworkError; diff --git a/d-engine-core/src/purge/default_executor.rs b/d-engine-core/src/purge/default_executor.rs index 660ed104..ca9918c1 100644 --- a/d-engine-core/src/purge/default_executor.rs +++ b/d-engine-core/src/purge/default_executor.rs @@ -1,7 +1,7 @@ use std::sync::Arc; +use async_trait::async_trait; use d_engine_proto::common::LogId; -use tonic::async_trait; use crate::PurgeExecutor; use crate::RaftLog; diff --git a/d-engine-core/src/purge/mod.rs b/d-engine-core/src/purge/mod.rs index 482a45b8..8e9cb8c9 100644 --- a/d-engine-core/src/purge/mod.rs +++ b/d-engine-core/src/purge/mod.rs @@ -10,10 +10,10 @@ pub use default_executor::*; #[cfg(test)] mod default_executor_test; +use async_trait::async_trait; use d_engine_proto::common::LogId; #[cfg(any(test, feature = "__test_support"))] use mockall::automock; -use tonic::async_trait; use crate::Result; diff --git a/d-engine-core/src/raft_role/candidate_state.rs b/d-engine-core/src/raft_role/candidate_state.rs index 041646ac..948dfdec 100644 --- a/d-engine-core/src/raft_role/candidate_state.rs +++ b/d-engine-core/src/raft_role/candidate_state.rs @@ -2,6 +2,7 @@ use std::fmt::Debug; use std::marker::PhantomData; use std::sync::Arc; +use async_trait::async_trait; use d_engine_proto::common::LogId; use d_engine_proto::common::NodeRole::Candidate; use d_engine_proto::server::cluster::ClusterConfUpdateResponse; @@ -10,7 +11,6 @@ use d_engine_proto::server::election::VotedFor; use tokio::sync::mpsc; use tokio::time::Instant; use tonic::Status; -use tonic::async_trait; use tracing::debug; use tracing::error; use tracing::info; diff --git a/d-engine-core/src/raft_role/follower_state.rs b/d-engine-core/src/raft_role/follower_state.rs index 6ea20f94..008cf601 100644 --- a/d-engine-core/src/raft_role/follower_state.rs +++ b/d-engine-core/src/raft_role/follower_state.rs @@ -8,12 +8,12 @@ use d_engine_proto::common::NodeRole::Follower; use d_engine_proto::server::cluster::ClusterConfUpdateResponse; use d_engine_proto::server::election::VoteResponse; +use async_trait::async_trait; use d_engine_proto::server::storage::SnapshotAck; use d_engine_proto::server::storage::SnapshotResponse; use tokio::sync::mpsc; use tokio::time::Instant; use tonic::Status; -use tonic::async_trait; use tracing::debug; use tracing::error; use tracing::info; diff --git a/d-engine-core/src/raft_role/leader_state.rs b/d-engine-core/src/raft_role/leader_state.rs index 1a28a617..6ea2f723 100644 --- a/d-engine-core/src/raft_role/leader_state.rs +++ b/d-engine-core/src/raft_role/leader_state.rs @@ -44,6 +44,7 @@ use crate::alias::TROF; use crate::event::ClientCmd; use crate::network::Transport; use crate::stream::create_production_snapshot_stream; +use async_trait::async_trait; use d_engine_proto::client::ClientReadRequest; use d_engine_proto::client::ClientResponse; use d_engine_proto::common::AddNode; @@ -83,7 +84,6 @@ use tokio::sync::mpsc; use tokio::sync::oneshot; use tokio::time::Instant; use tonic::Status; -use tonic::async_trait; use tracing::debug; use tracing::error; use tracing::info; diff --git a/d-engine-core/src/raft_role/learner_state.rs b/d-engine-core/src/raft_role/learner_state.rs index 6a206ceb..5124ca15 100644 --- a/d-engine-core/src/raft_role/learner_state.rs +++ b/d-engine-core/src/raft_role/learner_state.rs @@ -4,6 +4,7 @@ use std::sync::Arc; use std::sync::atomic::{AtomicBool, Ordering}; use std::time::Duration; +use async_trait::async_trait; use d_engine_proto::common::LogId; use d_engine_proto::common::NodeRole; use d_engine_proto::common::NodeRole::Learner; @@ -18,7 +19,6 @@ use d_engine_proto::server::storage::SnapshotResponse; use tokio::sync::mpsc::{self}; use tokio::time::Instant; use tonic::Status; -use tonic::async_trait; use tracing::debug; use tracing::error; use tracing::info; diff --git a/d-engine-core/src/raft_role/role_state.rs b/d-engine-core/src/raft_role/role_state.rs index 3912ca03..da102cd1 100644 --- a/d-engine-core/src/raft_role/role_state.rs +++ b/d-engine-core/src/raft_role/role_state.rs @@ -1,3 +1,4 @@ +use async_trait::async_trait; use d_engine_proto::client::ClientResponse; use d_engine_proto::server::election::VotedFor; use d_engine_proto::server::replication::AppendEntriesRequest; @@ -5,7 +6,6 @@ use d_engine_proto::server::replication::AppendEntriesResponse; use tokio::sync::mpsc; use tokio::time::Instant; use tonic::Status; -use tonic::async_trait; use tracing::debug; use tracing::error; use tracing::warn; diff --git a/d-engine-core/src/replication/mod.rs b/d-engine-core/src/replication/mod.rs index 4bf23073..92830efa 100644 --- a/d-engine-core/src/replication/mod.rs +++ b/d-engine-core/src/replication/mod.rs @@ -15,6 +15,7 @@ pub mod replication_handler_test; use std::collections::HashMap; use std::sync::Arc; +use async_trait::async_trait; use d_engine_proto::client::ClientResponse; use d_engine_proto::common::Entry; use d_engine_proto::common::EntryPayload; @@ -25,7 +26,6 @@ use d_engine_proto::server::replication::SuccessResult; #[cfg(any(test, feature = "__test_support"))] use mockall::automock; use tonic::Status; -use tonic::async_trait; use super::LeaderStateSnapshot; use super::StateSnapshot; diff --git a/d-engine-core/src/replication/replication_handler.rs b/d-engine-core/src/replication/replication_handler.rs index 0b5911a1..4f3d52dc 100644 --- a/d-engine-core/src/replication/replication_handler.rs +++ b/d-engine-core/src/replication/replication_handler.rs @@ -4,6 +4,7 @@ use std::fmt::Debug; use std::marker::PhantomData; use std::sync::Arc; +use async_trait::async_trait; use bytes::BytesMut; use d_engine_proto::client::WriteCommand; use d_engine_proto::common::Entry; @@ -17,7 +18,6 @@ use d_engine_proto::server::replication::ConflictResult; use d_engine_proto::server::replication::SuccessResult; use d_engine_proto::server::replication::append_entries_response; use prost::Message; -use tonic::async_trait; use tracing::debug; use tracing::error; use tracing::info; diff --git a/d-engine-core/src/state_machine_handler/default_state_machine_handler.rs b/d-engine-core/src/state_machine_handler/default_state_machine_handler.rs index 174118f9..f181f552 100644 --- a/d-engine-core/src/state_machine_handler/default_state_machine_handler.rs +++ b/d-engine-core/src/state_machine_handler/default_state_machine_handler.rs @@ -10,6 +10,7 @@ use std::time::Duration; use async_compression::tokio::bufread::GzipDecoder; use async_compression::tokio::write::GzipEncoder; use async_stream::try_stream; +use async_trait::async_trait; use bytes::Bytes; use d_engine_proto::client::ClientResult; use d_engine_proto::common::Entry; @@ -36,7 +37,6 @@ use tokio::time::timeout; use tokio_stream::StreamExt; use tokio_tar::Archive; use tonic::Streaming; -use tonic::async_trait; use tracing::debug; use tracing::error; use tracing::info; diff --git a/d-engine-core/src/state_machine_handler/mod.rs b/d-engine-core/src/state_machine_handler/mod.rs index ab0053b5..d053778d 100644 --- a/d-engine-core/src/state_machine_handler/mod.rs +++ b/d-engine-core/src/state_machine_handler/mod.rs @@ -52,13 +52,13 @@ mod wait_applied_test; #[cfg(test)] mod worker_test; +use async_trait::async_trait; use d_engine_proto::client::ClientResult; use d_engine_proto::server::storage::SnapshotChunk; use d_engine_proto::server::storage::SnapshotMetadata; use futures::stream::BoxStream; #[cfg(any(test, feature = "__test_support"))] use mockall::automock; -use tonic::async_trait; use super::NewCommitData; use crate::ApplyResult; diff --git a/d-engine-core/src/storage/buffered_raft_log.rs b/d-engine-core/src/storage/buffered_raft_log.rs index 6f452bc7..62a54773 100644 --- a/d-engine-core/src/storage/buffered_raft_log.rs +++ b/d-engine-core/src/storage/buffered_raft_log.rs @@ -58,13 +58,13 @@ use crate::StorageEngine; use crate::TypeConfig; use crate::alias::SOF; use crate::scoped_timer::ScopedTimer; +use async_trait::async_trait; use crossbeam_skiplist::SkipMap; use d_engine_proto::common::Entry; use d_engine_proto::common::LogId; use tokio::sync::Notify; use tokio::sync::mpsc; use tokio::sync::oneshot; -use tonic::async_trait; use tracing::debug; use tracing::error; use tracing::warn; diff --git a/d-engine-core/src/storage/raft_log.rs b/d-engine-core/src/storage/raft_log.rs index 5b0bb33f..00e043a6 100644 --- a/d-engine-core/src/storage/raft_log.rs +++ b/d-engine-core/src/storage/raft_log.rs @@ -13,11 +13,11 @@ use std::ops::RangeInclusive; +use async_trait::async_trait; use d_engine_proto::common::Entry; use d_engine_proto::common::LogId; #[cfg(any(test, feature = "__test_support"))] use mockall::automock; -use tonic::async_trait; use crate::Result; diff --git a/d-engine-core/src/storage/state_machine.rs b/d-engine-core/src/storage/state_machine.rs index 9a2b97aa..fb9a08f3 100644 --- a/d-engine-core/src/storage/state_machine.rs +++ b/d-engine-core/src/storage/state_machine.rs @@ -2,13 +2,13 @@ //! //! See the [server customization guide](https://github.com/deventlab/d-engine/blob/master/d-engine/src/docs/server_guide/customize-state-machine.md) for details. +use async_trait::async_trait; use bytes::Bytes; use d_engine_proto::common::Entry; use d_engine_proto::common::LogId; use d_engine_proto::server::storage::SnapshotMetadata; #[cfg(any(test, feature = "__test_support"))] use mockall::automock; -use tonic::async_trait; use crate::Error; diff --git a/d-engine-core/src/storage/state_machine_test.rs b/d-engine-core/src/storage/state_machine_test.rs index 5741f0c7..44d39adc 100644 --- a/d-engine-core/src/storage/state_machine_test.rs +++ b/d-engine-core/src/storage/state_machine_test.rs @@ -2,6 +2,7 @@ use std::sync::Arc; use std::time::Duration; use std::time::Instant; +use async_trait::async_trait; use bytes::Bytes; use d_engine_proto::client::WriteCommand; use d_engine_proto::client::write_command::CompareAndSwap; @@ -15,7 +16,6 @@ use d_engine_proto::common::entry_payload::Payload; use d_engine_proto::server::storage::SnapshotMetadata; use prost::Message; use tempfile::TempDir; -use tonic::async_trait; use crate::Error; use crate::storage::StateMachine; diff --git a/d-engine-core/src/storage/storage_engine.rs b/d-engine-core/src/storage/storage_engine.rs index a54e49ab..29a61830 100644 --- a/d-engine-core/src/storage/storage_engine.rs +++ b/d-engine-core/src/storage/storage_engine.rs @@ -5,11 +5,11 @@ use std::ops::RangeInclusive; use std::sync::Arc; +use async_trait::async_trait; use d_engine_proto::common::Entry; use d_engine_proto::common::LogId; #[cfg(any(test, feature = "__test_support"))] use mockall::automock; -use tonic::async_trait; use crate::Error; use crate::HardState; diff --git a/d-engine-core/src/storage/storage_engine_test.rs b/d-engine-core/src/storage/storage_engine_test.rs index 61cb1983..f669b121 100644 --- a/d-engine-core/src/storage/storage_engine_test.rs +++ b/d-engine-core/src/storage/storage_engine_test.rs @@ -1,13 +1,13 @@ use std::ops::RangeInclusive; use std::sync::Arc; +use async_trait::async_trait; use bytes::Bytes; use d_engine_proto::client::write_command::Insert; use d_engine_proto::common::Entry; use d_engine_proto::common::LogId; use d_engine_proto::server::election::VotedFor; use prost::Message; -use tonic::async_trait; use crate::Error; use crate::HardState; diff --git a/d-engine-core/src/test_utils/mock/mock_rpc_service.rs b/d-engine-core/src/test_utils/mock/mock_rpc_service.rs index e0acfa4e..bc0dbbd0 100644 --- a/d-engine-core/src/test_utils/mock/mock_rpc_service.rs +++ b/d-engine-core/src/test_utils/mock/mock_rpc_service.rs @@ -37,7 +37,7 @@ impl MockNode { is_ready: bool, ) -> Result<(u16, SocketAddr)> { // Return port + address - let (mut health_reporter, health_service) = health_reporter(); + let (health_reporter, health_service) = health_reporter(); if is_ready { health_reporter.set_serving::>().await; health_reporter.set_serving::>().await; diff --git a/d-engine-proto/Cargo.toml b/d-engine-proto/Cargo.toml index a590a4f9..a6a1ad13 100644 --- a/d-engine-proto/Cargo.toml +++ b/d-engine-proto/Cargo.toml @@ -30,5 +30,5 @@ tracing = { workspace = true } [build-dependencies] -tonic-build = "0.12" +tonic-build = "0.13" vergen = { version = "8.1", features = ["git", "gitcl"] } diff --git a/d-engine-proto/src/generated/d_engine.client.rs b/d-engine-proto/src/generated/d_engine.client.rs index 49e7bd37..f75d9d84 100644 --- a/d-engine-proto/src/generated/d_engine.client.rs +++ b/d-engine-proto/src/generated/d_engine.client.rs @@ -257,7 +257,7 @@ pub mod raft_client_service_client { } impl RaftClientServiceClient where - T: tonic::client::GrpcService, + T: tonic::client::GrpcService, T::Error: Into, T::ResponseBody: Body + std::marker::Send + 'static, ::Error: Into + std::marker::Send, @@ -278,13 +278,13 @@ pub mod raft_client_service_client { F: tonic::service::Interceptor, T::ResponseBody: Default, T: tonic::codegen::Service< - http::Request, + http::Request, Response = http::Response< - >::ResponseBody, + >::ResponseBody, >, >, , + http::Request, >>::Error: Into + std::marker::Send + std::marker::Sync, { RaftClientServiceClient::new(InterceptedService::new(inner, interceptor)) @@ -519,7 +519,7 @@ pub mod raft_client_service_server { B: Body + std::marker::Send + 'static, B::Error: Into + std::marker::Send + 'static, { - type Response = http::Response; + type Response = http::Response; type Error = std::convert::Infallible; type Future = BoxFuture; fn poll_ready( @@ -676,7 +676,9 @@ pub mod raft_client_service_server { } _ => { Box::pin(async move { - let mut response = http::Response::new(empty_body()); + let mut response = http::Response::new( + tonic::body::Body::default(), + ); let headers = response.headers_mut(); headers .insert( diff --git a/d-engine-proto/src/generated/d_engine.server.cluster.rs b/d-engine-proto/src/generated/d_engine.server.cluster.rs index 65720f7a..541f00f3 100644 --- a/d-engine-proto/src/generated/d_engine.server.cluster.rs +++ b/d-engine-proto/src/generated/d_engine.server.cluster.rs @@ -244,7 +244,7 @@ pub mod cluster_management_service_client { } impl ClusterManagementServiceClient where - T: tonic::client::GrpcService, + T: tonic::client::GrpcService, T::Error: Into, T::ResponseBody: Body + std::marker::Send + 'static, ::Error: Into + std::marker::Send, @@ -265,13 +265,13 @@ pub mod cluster_management_service_client { F: tonic::service::Interceptor, T::ResponseBody: Default, T: tonic::codegen::Service< - http::Request, + http::Request, Response = http::Response< - >::ResponseBody, + >::ResponseBody, >, >, , + http::Request, >>::Error: Into + std::marker::Send + std::marker::Sync, { ClusterManagementServiceClient::new( @@ -533,7 +533,7 @@ pub mod cluster_management_service_server { B: Body + std::marker::Send + 'static, B::Error: Into + std::marker::Send + 'static, { - type Response = http::Response; + type Response = http::Response; type Error = std::convert::Infallible; type Future = BoxFuture; fn poll_ready( @@ -744,7 +744,9 @@ pub mod cluster_management_service_server { } _ => { Box::pin(async move { - let mut response = http::Response::new(empty_body()); + let mut response = http::Response::new( + tonic::body::Body::default(), + ); let headers = response.headers_mut(); headers .insert( diff --git a/d-engine-proto/src/generated/d_engine.server.election.rs b/d-engine-proto/src/generated/d_engine.server.election.rs index dc149d11..402ed50e 100644 --- a/d-engine-proto/src/generated/d_engine.server.election.rs +++ b/d-engine-proto/src/generated/d_engine.server.election.rs @@ -61,7 +61,7 @@ pub mod raft_election_service_client { } impl RaftElectionServiceClient where - T: tonic::client::GrpcService, + T: tonic::client::GrpcService, T::Error: Into, T::ResponseBody: Body + std::marker::Send + 'static, ::Error: Into + std::marker::Send, @@ -82,13 +82,13 @@ pub mod raft_election_service_client { F: tonic::service::Interceptor, T::ResponseBody: Default, T: tonic::codegen::Service< - http::Request, + http::Request, Response = http::Response< - >::ResponseBody, + >::ResponseBody, >, >, , + http::Request, >>::Error: Into + std::marker::Send + std::marker::Sync, { RaftElectionServiceClient::new(InterceptedService::new(inner, interceptor)) @@ -235,7 +235,7 @@ pub mod raft_election_service_server { B: Body + std::marker::Send + 'static, B::Error: Into + std::marker::Send + 'static, { - type Response = http::Response; + type Response = http::Response; type Error = std::convert::Infallible; type Future = BoxFuture; fn poll_ready( @@ -294,7 +294,9 @@ pub mod raft_election_service_server { } _ => { Box::pin(async move { - let mut response = http::Response::new(empty_body()); + let mut response = http::Response::new( + tonic::body::Body::default(), + ); let headers = response.headers_mut(); headers .insert( diff --git a/d-engine-proto/src/generated/d_engine.server.replication.rs b/d-engine-proto/src/generated/d_engine.server.replication.rs index c24676f1..4e189ce6 100644 --- a/d-engine-proto/src/generated/d_engine.server.replication.rs +++ b/d-engine-proto/src/generated/d_engine.server.replication.rs @@ -80,7 +80,7 @@ pub mod raft_replication_service_client { } impl RaftReplicationServiceClient where - T: tonic::client::GrpcService, + T: tonic::client::GrpcService, T::Error: Into, T::ResponseBody: Body + std::marker::Send + 'static, ::Error: Into + std::marker::Send, @@ -101,13 +101,13 @@ pub mod raft_replication_service_client { F: tonic::service::Interceptor, T::ResponseBody: Default, T: tonic::codegen::Service< - http::Request, + http::Request, Response = http::Response< - >::ResponseBody, + >::ResponseBody, >, >, , + http::Request, >>::Error: Into + std::marker::Send + std::marker::Sync, { RaftReplicationServiceClient::new( @@ -309,7 +309,7 @@ pub mod raft_replication_service_server { B: Body + std::marker::Send + 'static, B::Error: Into + std::marker::Send + 'static, { - type Response = http::Response; + type Response = http::Response; type Error = std::convert::Infallible; type Future = BoxFuture; fn poll_ready( @@ -423,7 +423,9 @@ pub mod raft_replication_service_server { } _ => { Box::pin(async move { - let mut response = http::Response::new(empty_body()); + let mut response = http::Response::new( + tonic::body::Body::default(), + ); let headers = response.headers_mut(); headers .insert( diff --git a/d-engine-proto/src/generated/d_engine.server.storage.rs b/d-engine-proto/src/generated/d_engine.server.storage.rs index d310fa80..af3069c6 100644 --- a/d-engine-proto/src/generated/d_engine.server.storage.rs +++ b/d-engine-proto/src/generated/d_engine.server.storage.rs @@ -137,7 +137,7 @@ pub mod snapshot_service_client { } impl SnapshotServiceClient where - T: tonic::client::GrpcService, + T: tonic::client::GrpcService, T::Error: Into, T::ResponseBody: Body + std::marker::Send + 'static, ::Error: Into + std::marker::Send, @@ -158,13 +158,13 @@ pub mod snapshot_service_client { F: tonic::service::Interceptor, T::ResponseBody: Default, T: tonic::codegen::Service< - http::Request, + http::Request, Response = http::Response< - >::ResponseBody, + >::ResponseBody, >, >, , + http::Request, >>::Error: Into + std::marker::Send + std::marker::Sync, { SnapshotServiceClient::new(InterceptedService::new(inner, interceptor)) @@ -363,7 +363,7 @@ pub mod snapshot_service_server { B: Body + std::marker::Send + 'static, B::Error: Into + std::marker::Send + 'static, { - type Response = http::Response; + type Response = http::Response; type Error = std::convert::Infallible; type Future = BoxFuture; fn poll_ready( @@ -471,7 +471,9 @@ pub mod snapshot_service_server { } _ => { Box::pin(async move { - let mut response = http::Response::new(empty_body()); + let mut response = http::Response::new( + tonic::body::Body::default(), + ); let headers = response.headers_mut(); headers .insert( diff --git a/d-engine-server/Cargo.toml b/d-engine-server/Cargo.toml index ee37931d..d8847061 100644 --- a/d-engine-server/Cargo.toml +++ b/d-engine-server/Cargo.toml @@ -54,7 +54,7 @@ crc32fast = "1.4.2" # used in stream http-body = "1.0" http-body-util = "0.1.3" -tonic-health = "0.12.3" +tonic-health = { workspace = true } parking_lot = "0.12.3" crossbeam = "0.8" crossbeam-skiplist = "0.1" diff --git a/d-engine-server/src/membership/raft_membership.rs b/d-engine-server/src/membership/raft_membership.rs index ac6b8da4..2927aa2c 100644 --- a/d-engine-server/src/membership/raft_membership.rs +++ b/d-engine-server/src/membership/raft_membership.rs @@ -15,6 +15,7 @@ use std::fmt::Debug; use std::marker::PhantomData; +use async_trait::async_trait; use d_engine_core::ConnectionType; use d_engine_core::Membership; use d_engine_core::MembershipError; @@ -35,7 +36,6 @@ use futures::FutureExt; use futures::StreamExt; use futures::stream::FuturesUnordered; use tokio::task; -use tonic::async_trait; use tonic::transport::Channel; use tracing::debug; use tracing::error; diff --git a/d-engine-server/src/network/grpc/grpc_transport.rs b/d-engine-server/src/network/grpc/grpc_transport.rs index 74f4d3b9..57838c98 100644 --- a/d-engine-server/src/network/grpc/grpc_transport.rs +++ b/d-engine-server/src/network/grpc/grpc_transport.rs @@ -5,6 +5,7 @@ use std::collections::HashSet; use std::marker::PhantomData; use std::sync::Arc; +use async_trait::async_trait; use d_engine_core::AppendResult; use d_engine_core::BackgroundSnapshotTransfer; use d_engine_core::BackoffPolicy; @@ -48,7 +49,6 @@ use tokio::sync::oneshot; use tokio::task; use tokio::task::JoinHandle; use tokio_stream::wrappers::ReceiverStream; -use tonic::async_trait; use tonic::codec::CompressionEncoding; use tonic::transport::Channel; use tracing::debug; diff --git a/d-engine-server/src/network/grpc/mod.rs b/d-engine-server/src/network/grpc/mod.rs index b02d8f5d..bbec6533 100644 --- a/d-engine-server/src/network/grpc/mod.rs +++ b/d-engine-server/src/network/grpc/mod.rs @@ -60,7 +60,7 @@ where T: TypeConfig, { // Create a HealthReporter to manage the health status - let (mut health_reporter, health_service) = health_reporter(); + let (health_reporter, health_service) = health_reporter(); // Set the initial health status to SERVING health_reporter.set_serving::>>().await; diff --git a/d-engine-server/src/network/health_checker.rs b/d-engine-server/src/network/health_checker.rs index b2dd80ec..b1f4a4e5 100644 --- a/d-engine-server/src/network/health_checker.rs +++ b/d-engine-server/src/network/health_checker.rs @@ -1,5 +1,6 @@ use std::time::Duration; +use async_trait::async_trait; use d_engine_core::NetworkConfig; use d_engine_core::NetworkError; use d_engine_core::Result; @@ -7,7 +8,6 @@ use d_engine_core::Result; use mockall::automock; #[cfg(test)] use mockall::predicate::*; -use tonic::async_trait; use tonic::transport::Channel; use tonic_health::pb::HealthCheckRequest; use tonic_health::pb::HealthCheckResponse; diff --git a/d-engine-server/src/network/health_monitor.rs b/d-engine-server/src/network/health_monitor.rs index 66cf7099..19d4be73 100644 --- a/d-engine-server/src/network/health_monitor.rs +++ b/d-engine-server/src/network/health_monitor.rs @@ -1,7 +1,7 @@ +use async_trait::async_trait; use dashmap::DashMap; #[cfg(test)] use mockall::automock; -use tonic::async_trait; #[cfg_attr(test, automock)] #[async_trait] diff --git a/d-engine-server/src/storage/adaptors/file/file_engine_test.rs b/d-engine-server/src/storage/adaptors/file/file_engine_test.rs index 6655aa8f..1d0b20dc 100644 --- a/d-engine-server/src/storage/adaptors/file/file_engine_test.rs +++ b/d-engine-server/src/storage/adaptors/file/file_engine_test.rs @@ -1,5 +1,6 @@ use std::sync::Arc; +use async_trait::async_trait; use d_engine_core::Error; use d_engine_core::StateMachine; use d_engine_core::state_machine_test::StateMachineBuilder; @@ -7,7 +8,6 @@ use d_engine_core::state_machine_test::StateMachineTestSuite; use d_engine_core::storage_engine_test::StorageEngineBuilder; use d_engine_core::storage_engine_test::StorageEngineTestSuite; use tempfile::TempDir; -use tonic::async_trait; use tracing_test::traced_test; use super::FileStorageEngine; diff --git a/d-engine-server/src/storage/adaptors/file/file_state_machine.rs b/d-engine-server/src/storage/adaptors/file/file_state_machine.rs index ce414b1e..6695f4fd 100644 --- a/d-engine-server/src/storage/adaptors/file/file_state_machine.rs +++ b/d-engine-server/src/storage/adaptors/file/file_state_machine.rs @@ -91,6 +91,7 @@ use std::sync::atomic::AtomicU64; use std::sync::atomic::Ordering; use std::time::SystemTime; +use async_trait::async_trait; use bytes::Bytes; use d_engine_core::ApplyResult; use d_engine_core::Error; @@ -114,7 +115,6 @@ use tokio::fs::OpenOptions; use tokio::io::AsyncReadExt; use tokio::io::AsyncWriteExt; use tokio::time::Instant; -use tonic::async_trait; use tracing::debug; use tracing::error; use tracing::info; diff --git a/d-engine-server/src/storage/adaptors/file/file_state_machine_test.rs b/d-engine-server/src/storage/adaptors/file/file_state_machine_test.rs index fa4377ab..090c928c 100644 --- a/d-engine-server/src/storage/adaptors/file/file_state_machine_test.rs +++ b/d-engine-server/src/storage/adaptors/file/file_state_machine_test.rs @@ -10,10 +10,10 @@ use prost::Message; use std::sync::Arc; use crate::storage::adaptors::file::FileStateMachine; +use async_trait::async_trait; use d_engine_core::Error; use d_engine_core::storage::state_machine_test::{StateMachineBuilder, StateMachineTestSuite}; use tempfile::TempDir; -use tonic::async_trait; /// Builder for FileStateMachine test instances struct FileStateMachineBuilder { diff --git a/d-engine-server/src/storage/adaptors/file/file_storage_engine.rs b/d-engine-server/src/storage/adaptors/file/file_storage_engine.rs index 3684afe9..f06e3d2a 100644 --- a/d-engine-server/src/storage/adaptors/file/file_storage_engine.rs +++ b/d-engine-server/src/storage/adaptors/file/file_storage_engine.rs @@ -15,6 +15,7 @@ use std::sync::Mutex; use std::sync::atomic::AtomicU64; use std::sync::atomic::Ordering; +use async_trait::async_trait; use d_engine_core::Error; use d_engine_core::HardState; use d_engine_core::LogStore; @@ -24,7 +25,6 @@ use d_engine_core::StorageError; use d_engine_proto::common::Entry; use d_engine_proto::common::LogId; use prost::Message; -use tonic::async_trait; use tracing::info; // Constants for file structure diff --git a/d-engine-server/src/storage/adaptors/file/file_storage_engine_test.rs b/d-engine-server/src/storage/adaptors/file/file_storage_engine_test.rs index 5a9dfc94..657ef83c 100644 --- a/d-engine-server/src/storage/adaptors/file/file_storage_engine_test.rs +++ b/d-engine-server/src/storage/adaptors/file/file_storage_engine_test.rs @@ -470,11 +470,11 @@ mod tests { // Integration tests using StorageEngineTestSuite + use async_trait::async_trait; use d_engine_core::Error; use d_engine_core::storage::storage_engine_test::{ StorageEngineBuilder, StorageEngineTestSuite, }; - use tonic::async_trait; /// Builder for FileStorageEngine test instances struct FileStorageEngineBuilder { diff --git a/d-engine-server/src/storage/adaptors/rocksdb/rocksdb_state_machine.rs b/d-engine-server/src/storage/adaptors/rocksdb/rocksdb_state_machine.rs index 4da58011..5770907d 100644 --- a/d-engine-server/src/storage/adaptors/rocksdb/rocksdb_state_machine.rs +++ b/d-engine-server/src/storage/adaptors/rocksdb/rocksdb_state_machine.rs @@ -24,6 +24,7 @@ use parking_lot::RwLock; use prost::Message; use std::path::Path; +use async_trait::async_trait; use rocksdb::Cache; use rocksdb::ColumnFamilyDescriptor; use rocksdb::DB; @@ -35,7 +36,6 @@ use rocksdb::Options; use rocksdb::WriteBatch; use serde::Deserialize; use serde::Serialize; -use tonic::async_trait; use tracing::debug; use tracing::error; use tracing::info; diff --git a/d-engine-server/src/storage/adaptors/rocksdb/rocksdb_state_machine_test.rs b/d-engine-server/src/storage/adaptors/rocksdb/rocksdb_state_machine_test.rs index c160240d..f6e784b0 100644 --- a/d-engine-server/src/storage/adaptors/rocksdb/rocksdb_state_machine_test.rs +++ b/d-engine-server/src/storage/adaptors/rocksdb/rocksdb_state_machine_test.rs @@ -1,6 +1,7 @@ use super::RocksDBStorageEngine; use super::RocksDBUnifiedEngine; use crate::{Error, StateMachine}; +use async_trait::async_trait; use bytes::Bytes; use d_engine_core::state_machine_test::{StateMachineBuilder, StateMachineTestSuite}; use d_engine_proto::client::WriteCommand; @@ -11,7 +12,6 @@ use prost::Message; use std::sync::Arc; use std::sync::Mutex; use tempfile::TempDir; -use tonic::async_trait; struct RocksDBStateMachineBuilder { temp_dir: TempDir, diff --git a/d-engine-server/src/storage/adaptors/rocksdb/rocksdb_storage_engine.rs b/d-engine-server/src/storage/adaptors/rocksdb/rocksdb_storage_engine.rs index c38a6321..b5ce36ad 100644 --- a/d-engine-server/src/storage/adaptors/rocksdb/rocksdb_storage_engine.rs +++ b/d-engine-server/src/storage/adaptors/rocksdb/rocksdb_storage_engine.rs @@ -15,13 +15,13 @@ use prost::Message; use rocksdb::WriteOptions; use std::path::Path; +use async_trait::async_trait; use rocksdb::Cache; use rocksdb::ColumnFamilyDescriptor; use rocksdb::DB; use rocksdb::Direction; use rocksdb::IteratorMode; use rocksdb::WriteBatch; -use tonic::async_trait; use tracing::instrument; use super::LOG_CF; diff --git a/d-engine-server/src/storage/adaptors/rocksdb/rocksdb_storage_engine_test.rs b/d-engine-server/src/storage/adaptors/rocksdb/rocksdb_storage_engine_test.rs index e2b5b7ce..77f1af7e 100644 --- a/d-engine-server/src/storage/adaptors/rocksdb/rocksdb_storage_engine_test.rs +++ b/d-engine-server/src/storage/adaptors/rocksdb/rocksdb_storage_engine_test.rs @@ -1,6 +1,7 @@ use std::sync::Arc; use std::sync::Mutex; +use async_trait::async_trait; use bytes::Bytes; use d_engine_core::Error; use d_engine_core::LogStore; @@ -11,7 +12,6 @@ use d_engine_proto::client::write_command::Insert; use d_engine_proto::common::Entry; use prost::Message; use tempfile::TempDir; -use tonic::async_trait; use tracing::debug; use tracing_test::traced_test; use uuid::Uuid; diff --git a/d-engine-server/src/storage/adaptors/rocksdb/rocksdb_unified_engine_test.rs b/d-engine-server/src/storage/adaptors/rocksdb/rocksdb_unified_engine_test.rs index b795440d..081e5abe 100644 --- a/d-engine-server/src/storage/adaptors/rocksdb/rocksdb_unified_engine_test.rs +++ b/d-engine-server/src/storage/adaptors/rocksdb/rocksdb_unified_engine_test.rs @@ -1,6 +1,7 @@ use std::sync::Arc; use std::sync::Mutex; +use async_trait::async_trait; use d_engine_core::Error; use d_engine_core::Lease; use d_engine_core::LogStore; @@ -9,7 +10,6 @@ use d_engine_core::config::LeaseConfig; use d_engine_core::state_machine_test::{StateMachineBuilder, StateMachineTestSuite}; use d_engine_core::storage_engine_test::{StorageEngineBuilder, StorageEngineTestSuite}; use tempfile::TempDir; -use tonic::async_trait; use super::RocksDBStateMachine; use super::RocksDBStorageEngine; diff --git a/d-engine-server/src/test_utils/mock/mock_rpc_service.rs b/d-engine-server/src/test_utils/mock/mock_rpc_service.rs index 56af03a1..1087e151 100644 --- a/d-engine-server/src/test_utils/mock/mock_rpc_service.rs +++ b/d-engine-server/src/test_utils/mock/mock_rpc_service.rs @@ -39,7 +39,7 @@ impl MockNode { is_ready: bool, ) -> Result<(u16, SocketAddr)> { // Return port + address - let (mut health_reporter, health_service) = health_reporter(); + let (health_reporter, health_service) = health_reporter(); if is_ready { health_reporter.set_serving::>().await; health_reporter.set_serving::>().await; diff --git a/deny.toml b/deny.toml index d4093711..9562d85a 100644 --- a/deny.toml +++ b/deny.toml @@ -72,7 +72,6 @@ feature-depth = 1 ignore = [ "RUSTSEC-2025-0134", # rustls-pemfile unmaintained, indirect dep via tonic 0.12 "RUSTSEC-2025-0141", # bincode 1.3.3 unmaintained but team considers it complete - { id = "RUSTSEC-2026-0097", reason = "tower 0.4.13 (via tonic 0.12 transitive dep) pulls rand 0.8.5; the unsoundness conditions (custom logger calling rand during reseeding) do not apply to tower's RNG usage and cannot be resolved without upgrading tonic" }, #"RUSTSEC-0000-0000", #{ id = "RUSTSEC-0000-0000", reason = "you can specify a reason the advisory is ignored" }, #"a-crate-that-is-yanked@0.1.1", # you can also ignore yanked crate versions if you wish From 9d99e6398039bf4e91b0cf22369c6505a575503b Mon Sep 17 00:00:00 2001 From: Joshua Chi Date: Mon, 13 Apr 2026 19:05:03 +0800 Subject: [PATCH 2/2] fix #308: drain ACK channel in background to prevent backpressure on large snapshots With _ack_rx dropped, process_snapshot_stream's ack_tx.send().await blocks once the 32-slot buffer fills on chunk 33+, hanging the entire snapshot install. Spawn a drain task so ack_tx never backpressures. --- d-engine-core/src/raft_role/follower_state.rs | 9 ++++++--- d-engine-core/src/raft_role/learner_state.rs | 9 ++++++--- 2 files changed, 12 insertions(+), 6 deletions(-) diff --git a/d-engine-core/src/raft_role/follower_state.rs b/d-engine-core/src/raft_role/follower_state.rs index 008cf601..36d29899 100644 --- a/d-engine-core/src/raft_role/follower_state.rs +++ b/d-engine-core/src/raft_role/follower_state.rs @@ -333,9 +333,12 @@ impl RaftRoleState for FollowerState { } RaftEvent::InstallSnapshotChunk(stream, sender) => { - // ack_tx is used internally by process_snapshot_stream for per-chunk - // validation only; _ack_rx is intentionally discarded in push mode. - let (ack_tx, _ack_rx) = mpsc::channel::(32); + // ack_tx is passed to process_snapshot_stream for per-chunk validation. + // In push mode the receiver is never read, so we drain it in a background + // task to prevent backpressure: process_snapshot_stream awaits each send, + // and a full bounded channel would block mid-transfer on chunk 33+ (#308). + let (ack_tx, mut ack_rx) = mpsc::channel::(32); + tokio::spawn(async move { while ack_rx.recv().await.is_some() {} }); let snap_result = ctx .handlers diff --git a/d-engine-core/src/raft_role/learner_state.rs b/d-engine-core/src/raft_role/learner_state.rs index 5124ca15..b7bc4eb9 100644 --- a/d-engine-core/src/raft_role/learner_state.rs +++ b/d-engine-core/src/raft_role/learner_state.rs @@ -286,9 +286,12 @@ impl RaftRoleState for LearnerState { } RaftEvent::InstallSnapshotChunk(stream, sender) => { - // ack_tx is used internally by process_snapshot_stream for per-chunk - // validation only; _ack_rx is intentionally discarded in push mode. - let (ack_tx, _ack_rx) = mpsc::channel::(32); + // ack_tx is passed to process_snapshot_stream for per-chunk validation. + // In push mode the receiver is never read, so we drain it in a background + // task to prevent backpressure: process_snapshot_stream awaits each send, + // and a full bounded channel would block mid-transfer on chunk 33+ (#308). + let (ack_tx, mut ack_rx) = mpsc::channel::(32); + tokio::spawn(async move { while ack_rx.recv().await.is_some() {} }); let snap_result = ctx .handlers