From 13412895c57eab0bfe308889e6f6bc24bfec9700 Mon Sep 17 00:00:00 2001 From: fanyang Date: Tue, 30 Jun 2026 09:50:27 +0800 Subject: [PATCH] refactor(core): remove hotpath profiling (#2394) hotpath adds noticeable overhead on hot paths, so remove the optional profiling integration while keeping direct quanta::Instant timing. --- Cargo.lock | 157 ------------------ easytier/Cargo.toml | 16 +- easytier/src/common/acl_processor.rs | 2 +- easytier/src/common/stats_manager.rs | 2 +- easytier/src/common/stun.rs | 2 +- easytier/src/connector/direct.rs | 2 +- easytier/src/connector/manual.rs | 2 +- easytier/src/connector/tcp_hole_punch.rs | 2 +- .../connector/udp_hole_punch/both_easy_sym.rs | 2 +- .../src/connector/udp_hole_punch/common.rs | 2 +- easytier/src/connector/udp_hole_punch/cone.rs | 2 +- easytier/src/connector/udp_hole_punch/mod.rs | 2 +- .../connector/udp_hole_punch/sym_to_cone.rs | 2 +- easytier/src/easytier-core.rs | 16 -- easytier/src/gateway/icmp_proxy.rs | 2 +- easytier/src/gateway/ip_reassembler.rs | 2 +- easytier/src/gateway/quic_proxy.rs | 2 +- easytier/src/gateway/socks5.rs | 2 +- easytier/src/gateway/socks5/dataplane.rs | 2 +- easytier/src/gateway/tcp_proxy.rs | 2 +- easytier/src/gateway/udp_proxy.rs | 2 +- easytier/src/hotpath_off.rs | 40 ----- easytier/src/instance/proxy_cidrs_monitor.rs | 2 +- easytier/src/lib.rs | 21 +-- easytier/src/peers/acl_filter.rs | 4 +- easytier/src/peers/mod.rs | 2 +- easytier/src/peers/peer.rs | 1 - easytier/src/peers/peer_conn.rs | 14 +- easytier/src/peers/peer_conn_ping.rs | 2 +- easytier/src/peers/peer_manager.rs | 27 +-- easytier/src/peers/peer_map.rs | 2 - easytier/src/peers/peer_ospf_route.rs | 4 +- easytier/src/peers/peer_session.rs | 4 +- easytier/src/peers/relay_peer_map.rs | 2 +- easytier/src/peers/route_trait.rs | 2 +- easytier/src/peers/secure_datagram.rs | 8 - easytier/src/proto/rpc_impl/client.rs | 2 +- easytier/src/proto/rpc_impl/packet.rs | 2 +- easytier/src/proto/rpc_impl/server.rs | 2 +- easytier/src/tunnel/fake_tcp/stack.rs | 2 +- easytier/src/tunnel/mpsc.rs | 5 +- easytier/src/tunnel/ring.rs | 5 +- easytier/src/tunnel/udp.rs | 12 +- easytier/src/tunnel/wireguard.rs | 10 +- 44 files changed, 68 insertions(+), 332 deletions(-) delete mode 100644 easytier/src/hotpath_off.rs diff --git a/Cargo.lock b/Cargo.lock index 4c455e6b..9a9c6f69 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -257,12 +257,6 @@ version = "0.7.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7c02d123df017efcdfbd739ef81735b36c5ba83ec3c59c80a9d7ecc718f92e50" -[[package]] -name = "ascii" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d92bec98840b8f03a5ff5413de5293bfcd8bf96467cf5452609f939ec6f5de16" - [[package]] name = "async-broadcast" version = "0.7.2" @@ -1254,12 +1248,6 @@ dependencies = [ "windows-targets 0.52.6", ] -[[package]] -name = "chunked_transfer" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6e4de3bc4ea267985becf712dc6d9eed8b04c953b3fcfb339ebc87acd9804901" - [[package]] name = "cidr" version = "0.3.1" @@ -2100,16 +2088,6 @@ dependencies = [ "dirs-sys 0.5.0", ] -[[package]] -name = "dirs-next" -version = "2.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b98cf8ebf19c3d1b223e151f99a4f9f0690dca41414773390fc824184ac833e1" -dependencies = [ - "cfg-if", - "dirs-sys-next", -] - [[package]] name = "dirs-sys" version = "0.3.7" @@ -2133,17 +2111,6 @@ dependencies = [ "windows-sys 0.61.2", ] -[[package]] -name = "dirs-sys-next" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ebda144c4fe02d1f7ea1a7d9641b6fc6b580adcfa024ae48797ecdeb6825b4d" -dependencies = [ - "libc", - "redox_users 0.4.5", - "winapi", -] - [[package]] name = "dispatch2" version = "0.3.1" @@ -2322,7 +2289,6 @@ dependencies = [ "hickory-resolver", "hickory-server", "hmac", - "hotpath", "http", "http_req", "humansize", @@ -2665,12 +2631,6 @@ version = "1.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4ef6b89e5b37196644d8796de5268852ff179b44e96276cf4290264843743bb7" -[[package]] -name = "encode_unicode" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "34aa73646ffb006b8f5147f3dc182bd4bcb190227ce861fc4a4844bf8e3cb2c0" - [[package]] name = "encoding" version = "0.2.33" @@ -3929,61 +3889,6 @@ dependencies = [ "windows-sys 0.52.0", ] -[[package]] -name = "hotpath" -version = "0.18.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc2c28b1fa962e433f800ed1ea0bf53dc028d3745cf2acec6cfd28b65ac96afa" -dependencies = [ - "arc-swap", - "cfg-if", - "crossbeam-channel", - "flate2", - "flume 0.12.0", - "futures-util", - "hdrhistogram", - "hotpath-macros", - "hotpath-meta", - "libc", - "object", - "parking_lot", - "pin-project-lite", - "prettytable-rs", - "quanta", - "regex", - "rustc-demangle", - "serde", - "serde_json", - "tiny_http", - "tokio", -] - -[[package]] -name = "hotpath-macros" -version = "0.18.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a585238d8daf746e27df0f24d1bbdcd2410e9febff63f9a0173f90d7e71c50f6" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.117", -] - -[[package]] -name = "hotpath-macros-meta" -version = "0.18.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "309f63c2f755dead454dd4b3ea8ab5c947f14f8ea435fbcd37fa820e17290e80" - -[[package]] -name = "hotpath-meta" -version = "0.18.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "68faa91a9e1114dff668cd90560f332da6bbde40dae37ec28ea1c43ca5ce3be3" -dependencies = [ - "hotpath-macros-meta", -] - [[package]] name = "html5ever" version = "0.29.1" @@ -4591,17 +4496,6 @@ dependencies = [ "once_cell", ] -[[package]] -name = "is-terminal" -version = "0.4.17" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3640c1c38b8e4e43584d8df18be5fc6b0aa314ce6ebf51b53313d4306cca8e46" -dependencies = [ - "hermit-abi", - "libc", - "windows-sys 0.61.2", -] - [[package]] name = "is-wsl" version = "0.4.0" @@ -5952,15 +5846,6 @@ dependencies = [ "objc2-foundation", ] -[[package]] -name = "object" -version = "0.36.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "62948e14d923ea95ea2c7c86c71013138b66525b86bdc08d2dcc262bdb497b87" -dependencies = [ - "memchr", -] - [[package]] name = "once_cell" version = "1.21.3" @@ -6831,19 +6716,6 @@ dependencies = [ "syn 2.0.117", ] -[[package]] -name = "prettytable-rs" -version = "0.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eea25e07510aa6ab6547308ebe3c036016d162b8da920dbb079e3ba8acf3d95a" -dependencies = [ - "encode_unicode", - "is-terminal", - "lazy_static", - "term", - "unicode-width 0.1.11", -] - [[package]] name = "primeorder" version = "0.13.6" @@ -7903,12 +7775,6 @@ dependencies = [ "wasm-bindgen", ] -[[package]] -name = "rustc-demangle" -version = "0.1.27" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b50b8869d9fc858ce7266cce0194bd74df58b9d0e3f6df3a9fc8eb470d95c09d" - [[package]] name = "rustc-hash" version = "2.1.0" @@ -9833,17 +9699,6 @@ dependencies = [ "utf-8", ] -[[package]] -name = "term" -version = "0.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c59df8ac95d96ff9bede18eb7300b0fda5e5d8d90960e76f8e14ae765eedbf1f" -dependencies = [ - "dirs-next", - "rustversion", - "winapi", -] - [[package]] name = "terminal_size" version = "0.4.1" @@ -9999,18 +9854,6 @@ version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "825f6c8a18bc36d56a62f66af7296385b628c9c5543a8663d4c217fc920bfefd" -[[package]] -name = "tiny_http" -version = "0.12.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "389915df6413a2e74fb181895f933386023c71110878cd0825588928e64cdc82" -dependencies = [ - "ascii", - "chunked_transfer", - "httpdate", - "log", -] - [[package]] name = "tinystr" version = "0.7.6" diff --git a/easytier/Cargo.toml b/easytier/Cargo.toml index 6e483d61..9151a1e2 100644 --- a/easytier/Cargo.toml +++ b/easytier/Cargo.toml @@ -52,7 +52,6 @@ toml = "0.8.12" chrono = { version = "0.4.37", features = ["serde"] } guarden = "0.2" -hotpath = { version = "0.18", default-features = false, optional = true } quanta = "0.12" delegate = "0.13.5" @@ -403,17 +402,14 @@ jemalloc-prof = [ "jemalloc-sys/stats", ] tracing = ["tokio/tracing", "dep:console-subscriber"] -hotpath = [ - "dep:hotpath", - "hotpath/hotpath", - "hotpath/tokio", - "hotpath/parking_lot", - "hotpath/flume", -] -hotpath-cpu = ["hotpath", "hotpath/hotpath-cpu"] -hotpath-alloc = ["hotpath", "hotpath/hotpath-alloc"] magic-dns = ["dep:hickory-client", "dep:hickory-server"] faketcp = ["dep:flume"] zstd = ["dep:zstd"] +# Deprecated: hotpath profiling has been removed. These feature aliases are +# retained as no-ops so existing build scripts using `--features hotpath*` +# continue to work without pulling in any dependencies. +hotpath = [] +hotpath-cpu = ["hotpath"] +hotpath-alloc = ["hotpath"] # For Network Extension on macOS macos-ne = [] diff --git a/easytier/src/common/acl_processor.rs b/easytier/src/common/acl_processor.rs index bfd364a0..4ae88693 100644 --- a/easytier/src/common/acl_processor.rs +++ b/easytier/src/common/acl_processor.rs @@ -6,7 +6,7 @@ use std::{ time::{Duration, SystemTime, UNIX_EPOCH}, }; -use hotpath::instant::Instant; +use quanta::Instant; use crate::common::{config::ConfigLoader, global_ctx::ArcGlobalCtx, token_bucket::TokenBucket}; use crate::proto::acl::*; diff --git a/easytier/src/common/stats_manager.rs b/easytier/src/common/stats_manager.rs index 5d344e1a..5627e24a 100644 --- a/easytier/src/common/stats_manager.rs +++ b/easytier/src/common/stats_manager.rs @@ -1,5 +1,5 @@ use dashmap::DashMap; -use hotpath::instant::Instant; +use quanta::Instant; use serde::{Deserialize, Serialize}; use std::cell::UnsafeCell; use std::fmt; diff --git a/easytier/src/common/stun.rs b/easytier/src/common/stun.rs index 925e820b..14e99ca4 100644 --- a/easytier/src/common/stun.rs +++ b/easytier/src/common/stun.rs @@ -8,7 +8,7 @@ use crate::proto::common::{NatType, StunInfo}; use anyhow::Context; use chrono::Local; use crossbeam::atomic::AtomicCell; -use hotpath::instant::Instant; +use quanta::Instant; use rand::seq::IteratorRandom; use socket2::{SockAddr, SockRef}; use tokio::io::{AsyncReadExt, AsyncWriteExt}; diff --git a/easytier/src/connector/direct.rs b/easytier/src/connector/direct.rs index 4069130a..1557d50a 100644 --- a/easytier/src/connector/direct.rs +++ b/easytier/src/connector/direct.rs @@ -11,7 +11,7 @@ use std::{ time::Duration, }; -use hotpath::instant::Instant; +use quanta::Instant; use crate::{ common::{ diff --git a/easytier/src/connector/manual.rs b/easytier/src/connector/manual.rs index c70db5fc..c4cce1b9 100644 --- a/easytier/src/connector/manual.rs +++ b/easytier/src/connector/manual.rs @@ -6,7 +6,7 @@ use std::{ }; use dashmap::DashSet; -use hotpath::instant::Instant; +use quanta::Instant; use tokio::{sync::mpsc, task::JoinSet, time::timeout}; use crate::{ diff --git a/easytier/src/connector/tcp_hole_punch.rs b/easytier/src/connector/tcp_hole_punch.rs index 4945f1b4..76dfbb8b 100644 --- a/easytier/src/connector/tcp_hole_punch.rs +++ b/easytier/src/connector/tcp_hole_punch.rs @@ -5,7 +5,7 @@ use std::{ }; use anyhow::{Context, Error}; -use hotpath::instant::Instant; +use quanta::Instant; use rand::Rng as _; use tokio::task::JoinSet; diff --git a/easytier/src/connector/udp_hole_punch/both_easy_sym.rs b/easytier/src/connector/udp_hole_punch/both_easy_sym.rs index e96d9dba..c46d409a 100644 --- a/easytier/src/connector/udp_hole_punch/both_easy_sym.rs +++ b/easytier/src/connector/udp_hole_punch/both_easy_sym.rs @@ -5,7 +5,7 @@ use std::{ }; use anyhow::Context; -use hotpath::instant::Instant; +use quanta::Instant; use tokio::sync::Mutex; use tokio_util::task::AbortOnDropHandle; diff --git a/easytier/src/connector/udp_hole_punch/common.rs b/easytier/src/connector/udp_hole_punch/common.rs index 15e1d60f..28d59a27 100644 --- a/easytier/src/connector/udp_hole_punch/common.rs +++ b/easytier/src/connector/udp_hole_punch/common.rs @@ -7,7 +7,7 @@ use std::{ use crossbeam::atomic::AtomicCell; use dashmap::{DashMap, DashSet}; use guarden::defer; -use hotpath::instant::Instant; +use quanta::Instant; use rand::seq::SliceRandom as _; use tokio::{net::UdpSocket, sync::Mutex, task::JoinSet}; use tracing::{Instrument, Level, instrument}; diff --git a/easytier/src/connector/udp_hole_punch/cone.rs b/easytier/src/connector/udp_hole_punch/cone.rs index da2838dd..bfeded52 100644 --- a/easytier/src/connector/udp_hole_punch/cone.rs +++ b/easytier/src/connector/udp_hole_punch/cone.rs @@ -1,7 +1,7 @@ use std::{sync::Arc, time::Duration}; use anyhow::Context; -use hotpath::instant::Instant; +use quanta::Instant; use tokio::net::UdpSocket; use tokio_util::task::AbortOnDropHandle; diff --git a/easytier/src/connector/udp_hole_punch/mod.rs b/easytier/src/connector/udp_hole_punch/mod.rs index 90d90e24..1586df15 100644 --- a/easytier/src/connector/udp_hole_punch/mod.rs +++ b/easytier/src/connector/udp_hole_punch/mod.rs @@ -8,8 +8,8 @@ use both_easy_sym::{PunchBothEasySymHoleClient, PunchBothEasySymHoleServer}; use common::{PunchHoleServerCommon, UdpNatType, UdpPunchClientMethod}; use cone::{PunchConeHoleClient, PunchConeHoleServer}; use dashmap::DashMap; -use hotpath::instant::Instant; use once_cell::sync::Lazy; +use quanta::Instant; use sym_to_cone::{PunchSymToConeHoleClient, PunchSymToConeHoleServer}; use tokio::{sync::Mutex, task::JoinHandle}; diff --git a/easytier/src/connector/udp_hole_punch/sym_to_cone.rs b/easytier/src/connector/udp_hole_punch/sym_to_cone.rs index 406a6fec..f08fe765 100644 --- a/easytier/src/connector/udp_hole_punch/sym_to_cone.rs +++ b/easytier/src/connector/udp_hole_punch/sym_to_cone.rs @@ -10,7 +10,7 @@ use std::{ use anyhow::Context; use guarden::defer; -use hotpath::instant::Instant; +use quanta::Instant; use rand::{Rng, seq::SliceRandom}; use tokio::{net::UdpSocket, sync::RwLock}; use tokio_util::task::AbortOnDropHandle; diff --git a/easytier/src/easytier-core.rs b/easytier/src/easytier-core.rs index 1bc5d47a..03cf30b4 100644 --- a/easytier/src/easytier-core.rs +++ b/easytier/src/easytier-core.rs @@ -1,11 +1,5 @@ use easytier::core; -#[cfg(all( - feature = "hotpath-alloc", - any(feature = "jemalloc", feature = "mimalloc") -))] -compile_error!("feature `hotpath-alloc` cannot be enabled together with `jemalloc` or `mimalloc`"); - #[cfg(all(feature = "mimalloc", not(feature = "jemalloc")))] use mimalloc::MiMalloc; @@ -30,16 +24,6 @@ pub static malloc_conf: &[u8] = b"retain:false\0"; rust_i18n::i18n!("locales", fallback = "en"); #[tokio::main(flavor = "current_thread")] -#[cfg_attr( - all( - feature = "hotpath", - not(all( - feature = "hotpath-alloc", - any(feature = "jemalloc", feature = "mimalloc") - )) - ), - hotpath::main -)] async fn main() -> std::process::ExitCode { core::main().await } diff --git a/easytier/src/gateway/icmp_proxy.rs b/easytier/src/gateway/icmp_proxy.rs index 20fa6efb..cff2f8db 100644 --- a/easytier/src/gateway/icmp_proxy.rs +++ b/easytier/src/gateway/icmp_proxy.rs @@ -7,13 +7,13 @@ use std::{ }; use anyhow::Context; -use hotpath::instant::Instant; use pnet::packet::{ Packet, icmp::{self, IcmpCode, IcmpTypes, MutableIcmpPacket, echo_reply::MutableEchoReplyPacket}, ip::IpNextHeaderProtocols, ipv4::Ipv4Packet, }; +use quanta::Instant; use socket2::Socket; use tokio::{ sync::{Mutex, mpsc::UnboundedSender}, diff --git a/easytier/src/gateway/ip_reassembler.rs b/easytier/src/gateway/ip_reassembler.rs index d0ad8f7f..b45481a0 100644 --- a/easytier/src/gateway/ip_reassembler.rs +++ b/easytier/src/gateway/ip_reassembler.rs @@ -1,8 +1,8 @@ use dashmap::DashMap; -use hotpath::instant::Instant; use pnet::packet::Packet; use pnet::packet::ip::IpNextHeaderProtocol; use pnet::packet::ipv4::{self, Ipv4Flags, Ipv4Packet, MutableIpv4Packet}; +use quanta::Instant; use std::net::Ipv4Addr; use std::time::Duration; diff --git a/easytier/src/gateway/quic_proxy.rs b/easytier/src/gateway/quic_proxy.rs index 6fc03192..a943422c 100644 --- a/easytier/src/gateway/quic_proxy.rs +++ b/easytier/src/gateway/quic_proxy.rs @@ -1018,7 +1018,7 @@ impl TcpProxyRpc for QuicProxyDstRpcService { mod tests { use super::*; use bytes::Buf; - use hotpath::instant::Instant; + use quanta::Instant; /// Helper function: Create a pair of interconnected QuicSockets. /// Data sent by socket_a will enter socket_b's rx, and vice versa. diff --git a/easytier/src/gateway/socks5.rs b/easytier/src/gateway/socks5.rs index d1ef4508..ebcda26b 100644 --- a/easytier/src/gateway/socks5.rs +++ b/easytier/src/gateway/socks5.rs @@ -9,9 +9,9 @@ use std::{ }; use crossbeam::atomic::AtomicCell; -use hotpath::instant::Instant; #[cfg(feature = "kcp")] use kcp_sys::{endpoint::KcpEndpoint, stream::KcpStream}; +use quanta::Instant; use tokio_util::sync::{CancellationToken, DropGuard}; use tokio_util::task::AbortOnDropHandle; diff --git a/easytier/src/gateway/socks5/dataplane.rs b/easytier/src/gateway/socks5/dataplane.rs index 4549ef70..ae78ef3f 100644 --- a/easytier/src/gateway/socks5/dataplane.rs +++ b/easytier/src/gateway/socks5/dataplane.rs @@ -26,7 +26,7 @@ use std::{ }; use anyhow::Context as _; -use hotpath::instant::Instant; +use quanta::Instant; use tokio::io::{AsyncRead, AsyncWrite}; use crate::{common::error::Error, gateway::fast_socks5::server::AsyncTcpConnector}; diff --git a/easytier/src/gateway/tcp_proxy.rs b/easytier/src/gateway/tcp_proxy.rs index 39d86505..d5af4340 100644 --- a/easytier/src/gateway/tcp_proxy.rs +++ b/easytier/src/gateway/tcp_proxy.rs @@ -3,12 +3,12 @@ use cidr::Ipv4Inet; use core::panic; use crossbeam::atomic::AtomicCell; use dashmap::DashMap; -use hotpath::instant::Instant; use pnet::packet::MutablePacket; use pnet::packet::Packet; use pnet::packet::ip::IpNextHeaderProtocols; use pnet::packet::ipv4::{Ipv4Packet, MutableIpv4Packet}; use pnet::packet::tcp::{MutableTcpPacket, TcpPacket, ipv4_checksum}; +use quanta::Instant; use socket2::{SockRef, TcpKeepalive}; use std::net::{IpAddr, Ipv4Addr, SocketAddr, SocketAddrV4}; use std::sync::atomic::{AtomicBool, AtomicU16}; diff --git a/easytier/src/gateway/udp_proxy.rs b/easytier/src/gateway/udp_proxy.rs index bd9bca05..f284fed0 100644 --- a/easytier/src/gateway/udp_proxy.rs +++ b/easytier/src/gateway/udp_proxy.rs @@ -8,13 +8,13 @@ use bytes::{BufMut, BytesMut}; use cidr::Ipv4Inet; use crossbeam::atomic::AtomicCell; use dashmap::DashMap; -use hotpath::instant::Instant; use pnet::packet::{ Packet, ip::IpNextHeaderProtocols, ipv4::Ipv4Packet, udp::{self, MutableUdpPacket}, }; +use quanta::Instant; use tokio::sync::mpsc::{Receiver, Sender, channel, error::TrySendError}; use tokio::{ net::UdpSocket, diff --git a/easytier/src/hotpath_off.rs b/easytier/src/hotpath_off.rs deleted file mode 100644 index 0ad97020..00000000 --- a/easytier/src/hotpath_off.rs +++ /dev/null @@ -1,40 +0,0 @@ -//! No-op stand-in for the `hotpath` macros used by this crate, selected when -//! the `hotpath` feature is disabled. -//! -//! Keeping `hotpath` as an optional dependency means default builds do not pull -//! the profiler (or any of its transitive dependencies) into the dependency -//! graph. These macros expand to their input unchanged, mirroring `hotpath`'s -//! own disabled mode so call sites compile identically with or without the -//! feature. -//! -//! The macros are `#[macro_export]`-ed so that `lib.rs`' `extern crate self as -//! hotpath` alias exposes them through the same `hotpath::...` paths used when -//! the feature is enabled. - -/// No-op mirroring `hotpath::channel!`: returns the channel expression -/// unchanged (dropping any optional trailing `label`/`log`/`capacity` args). -#[doc(hidden)] -#[macro_export] -macro_rules! channel { - ($expr:expr $(, $($rest:tt)*)?) => { - $expr - }; -} - -/// No-op mirroring `hotpath::mutex!`: returns the expression unchanged. -#[doc(hidden)] -#[macro_export] -macro_rules! mutex { - ($expr:expr $(, $($rest:tt)*)?) => { - $expr - }; -} - -/// No-op mirroring `hotpath::rw_lock!`: returns the expression unchanged. -#[doc(hidden)] -#[macro_export] -macro_rules! rw_lock { - ($expr:expr $(, $($rest:tt)*)?) => { - $expr - }; -} diff --git a/easytier/src/instance/proxy_cidrs_monitor.rs b/easytier/src/instance/proxy_cidrs_monitor.rs index c9782d46..a44680c8 100644 --- a/easytier/src/instance/proxy_cidrs_monitor.rs +++ b/easytier/src/instance/proxy_cidrs_monitor.rs @@ -3,7 +3,7 @@ use std::sync::{Arc, Weak}; use crate::common::global_ctx::{ArcGlobalCtx, GlobalCtxEvent}; use crate::peers::peer_manager::PeerManager; -use hotpath::instant::Instant; +use quanta::Instant; use tokio_util::task::AbortOnDropHandle; /// ProxyCidrsMonitor monitors changes in proxy CIDRs from peer routes diff --git a/easytier/src/lib.rs b/easytier/src/lib.rs index 8a95e5e7..91c0a042 100644 --- a/easytier/src/lib.rs +++ b/easytier/src/lib.rs @@ -5,29 +5,10 @@ use std::io; use clap::Command; use clap_complete::{Generator, Shell}; -// When the `hotpath` feature is off, alias the current crate as `hotpath` so -// call sites keep using `hotpath::...` paths, and provide a local no-op shim -// for the profiling macros. This keeps `hotpath` an optional dependency: the -// profiler is absent from the dependency graph entirely in default builds. -#[cfg(not(feature = "hotpath"))] -extern crate self as hotpath; -#[cfg(not(feature = "hotpath"))] -mod hotpath_off; - -// When the `hotpath` feature is off, expose a local `instant` module backed by -// `quanta::Instant` so call sites can uniformly write `use hotpath::instant::Instant;` -// regardless of whether the feature is enabled. With the feature on, the real -// `hotpath` crate provides the same path (also `quanta::Instant` on Linux), so -// the two modes resolve to the identical type. -#[cfg(not(feature = "hotpath"))] -pub mod instant { - pub type Instant = quanta::Instant; -} - // Re-export `Instant` at the crate root so public APIs that expose it // (e.g. `Route::get_peer_info_last_update_time`) reference a deliberate // public type rather than leaking an inaccessible one. -pub use hotpath::instant::Instant; +pub use quanta::Instant; mod arch; mod gateway; diff --git a/easytier/src/peers/acl_filter.rs b/easytier/src/peers/acl_filter.rs index bfcc55ef..9b6575ef 100644 --- a/easytier/src/peers/acl_filter.rs +++ b/easytier/src/peers/acl_filter.rs @@ -7,11 +7,11 @@ use std::{ use arc_swap::ArcSwap; use dashmap::DashMap; -use hotpath::instant::Instant; use pnet::packet::ipv6::Ipv6Packet; use pnet::packet::{ Packet as _, ip::IpNextHeaderProtocols, ipv4::Ipv4Packet, tcp::TcpPacket, udp::UdpPacket, }; +use quanta::Instant; use crate::proto::acl::{AclStats, Protocol}; use crate::tunnel::packet_def::PacketType; @@ -404,7 +404,7 @@ mod tests { sync::Arc, }; - use hotpath::instant::Instant; + use quanta::Instant; use crate::{ common::acl_processor::PacketInfo, diff --git a/easytier/src/peers/mod.rs b/easytier/src/peers/mod.rs index debf7e9d..c94a65de 100644 --- a/easytier/src/peers/mod.rs +++ b/easytier/src/peers/mod.rs @@ -59,7 +59,7 @@ type BoxNicPacketFilter = Box; pub type PacketRecvChan = tokio::sync::mpsc::Sender; pub type PacketRecvChanReceiver = tokio::sync::mpsc::Receiver; pub fn create_packet_recv_chan() -> (PacketRecvChan, PacketRecvChanReceiver) { - hotpath::channel!(tokio::sync::mpsc::channel(128)) + tokio::sync::mpsc::channel(128) } pub async fn recv_packet_from_chan( packet_recv_chan_receiver: &mut PacketRecvChanReceiver, diff --git a/easytier/src/peers/peer.rs b/easytier/src/peers/peer.rs index fd543512..63af93f8 100644 --- a/easytier/src/peers/peer.rs +++ b/easytier/src/peers/peer.rs @@ -207,7 +207,6 @@ impl Peer { .map(|conn| conn.clone()) } - #[cfg_attr(feature = "hotpath", hotpath::measure(impl_type = "Peer"))] pub async fn send_msg(&self, msg: ZCPacket) -> Result<(), Error> { let Some(conn) = self.select_conn().await else { return Err(Error::PeerNoConnectionError(self.peer_node_id)); diff --git a/easytier/src/peers/peer_conn.rs b/easytier/src/peers/peer_conn.rs index 789a6e1e..8b9b6fe6 100644 --- a/easytier/src/peers/peer_conn.rs +++ b/easytier/src/peers/peer_conn.rs @@ -11,9 +11,6 @@ use std::{ }, }; -#[cfg(feature = "hotpath")] -use hotpath::wrap::tokio::sync::Mutex; -#[cfg(not(feature = "hotpath"))] use tokio::sync::Mutex; use base64::Engine as _; @@ -384,12 +381,12 @@ impl PeerConn { session_filter, noise_handshake_result: None, - tunnel: Arc::new(hotpath::mutex!(tokio::sync::Mutex::new(Box::new( - guard!([mut mpsc_tunnel] mpsc_tunnel.close()), - ) - as Box))), + tunnel: Arc::new(Mutex::new( + Box::new(guard!([mut mpsc_tunnel] mpsc_tunnel.close())) + as Box, + )), sink, - recv: hotpath::mutex!(tokio::sync::Mutex::new(Some(recv))), + recv: Mutex::new(Some(recv)), tunnel_info, tasks: JoinSet::new(), @@ -1466,7 +1463,6 @@ impl PeerConn { }); } - #[cfg_attr(feature = "hotpath", hotpath::measure(impl_type = "PeerConn"))] pub async fn send_msg(&self, msg: ZCPacket) -> Result<(), Error> { Ok(self.sink.send(msg).await?) } diff --git a/easytier/src/peers/peer_conn_ping.rs b/easytier/src/peers/peer_conn_ping.rs index bc64ea86..c72401de 100644 --- a/easytier/src/peers/peer_conn_ping.rs +++ b/easytier/src/peers/peer_conn_ping.rs @@ -6,7 +6,7 @@ use std::{ time::Duration, }; -use hotpath::instant::Instant; +use quanta::Instant; use rand::{Rng, thread_rng}; use tokio::{ sync::broadcast, diff --git a/easytier/src/peers/peer_manager.rs b/easytier/src/peers/peer_manager.rs index aa716e00..42ff5396 100644 --- a/easytier/src/peers/peer_manager.rs +++ b/easytier/src/peers/peer_manager.rs @@ -2,7 +2,7 @@ use anyhow::Context; use async_trait::async_trait; use cidr::{Ipv4Cidr, Ipv6Cidr}; use dashmap::DashMap; -use hotpath::instant::Instant; +use quanta::Instant; use std::collections::BTreeSet; use std::{ fmt::Debug, @@ -11,9 +11,6 @@ use std::{ time::{Duration, SystemTime}, }; -#[cfg(feature = "hotpath")] -use hotpath::wrap::tokio::sync::{Mutex, RwLock}; -#[cfg(not(feature = "hotpath"))] use tokio::sync::{Mutex, RwLock}; use tokio::{ sync::mpsc::{self, UnboundedReceiver, UnboundedSender}, @@ -279,8 +276,8 @@ impl PeerManager { let rpc_tspt = Arc::new(RpcTransport { my_peer_id, peers: Arc::downgrade(&peers), - foreign_peers: hotpath::mutex!(tokio::sync::Mutex::new(None)), - packet_recv: hotpath::mutex!(tokio::sync::Mutex::new(peer_rpc_tspt_recv)), + foreign_peers: Mutex::new(None), + packet_recv: Mutex::new(peer_rpc_tspt_recv), peer_rpc_tspt_sender, encryptor: encryptor.clone(), is_secure_mode_enabled, @@ -412,21 +409,17 @@ impl PeerManager { global_ctx, nic_channel, - tasks: hotpath::mutex!(tokio::sync::Mutex::new(JoinSet::new())), + tasks: Mutex::new(JoinSet::new()), - packet_recv: Arc::new(hotpath::mutex!(tokio::sync::Mutex::new(Some(packet_recv)))), + packet_recv: Arc::new(Mutex::new(Some(packet_recv))), peers, peer_rpc_mgr, peer_rpc_tspt: rpc_tspt, - peer_packet_process_pipeline: Arc::new(hotpath::rw_lock!(tokio::sync::RwLock::new( - Vec::new() - ))), - nic_packet_process_pipeline: Arc::new(hotpath::rw_lock!(tokio::sync::RwLock::new( - Vec::new() - ))), + peer_packet_process_pipeline: Arc::new(RwLock::new(Vec::new())), + nic_packet_process_pipeline: Arc::new(RwLock::new(Vec::new())), route_algo_inst, @@ -437,7 +430,7 @@ impl PeerManager { encryptor, data_compress_algo, - exit_nodes: hotpath::rw_lock!(tokio::sync::RwLock::new(exit_nodes)), + exit_nodes: RwLock::new(exit_nodes), reserved_my_peer_id_map: DashMap::new(), recent_have_traffic: Arc::new(DashMap::new()), @@ -1444,7 +1437,6 @@ impl PeerManager { self.get_route().get_foreign_network_summary().await } - #[cfg_attr(feature = "hotpath", hotpath::measure(impl_type = "PeerManager"))] async fn run_nic_packet_process_pipeline(&self, data: &mut ZCPacket) -> bool { // Enforce ACL for outbound (NIC-originated) packets. If ACL denies, stop processing. if !self.global_ctx.get_acl_filter().process_packet_with_acl( @@ -1530,7 +1522,6 @@ impl PeerManager { result } - #[cfg_attr(feature = "hotpath", hotpath::measure(impl_type = "PeerManager"))] async fn send_msg_internal( peers: &Arc, foreign_network_client: &Arc, @@ -2207,7 +2198,7 @@ mod tests { use base64::Engine; use std::{collections::HashMap, fmt::Debug, sync::Arc, time::Duration}; - use hotpath::instant::Instant; + use quanta::Instant; use crate::{ common::{ diff --git a/easytier/src/peers/peer_map.rs b/easytier/src/peers/peer_map.rs index a9d32676..46e55aaf 100644 --- a/easytier/src/peers/peer_map.rs +++ b/easytier/src/peers/peer_map.rs @@ -132,7 +132,6 @@ impl PeerMap { peer_id == self.my_peer_id || self.peer_map.contains_key(&peer_id) } - #[cfg_attr(feature = "hotpath", hotpath::measure(impl_type = "PeerMap"))] pub async fn send_msg_directly(&self, msg: ZCPacket, dst_peer_id: PeerId) -> Result<(), Error> { if dst_peer_id == self.my_peer_id { let packet_send = self.packet_send.clone(); @@ -164,7 +163,6 @@ impl PeerMap { Ok(()) } - #[cfg_attr(feature = "hotpath", hotpath::measure(impl_type = "PeerMap"))] pub async fn get_gateway_peer_id( &self, dst_peer_id: PeerId, diff --git a/easytier/src/peers/peer_ospf_route.rs b/easytier/src/peers/peer_ospf_route.rs index 10aa1ac6..8afa660a 100644 --- a/easytier/src/peers/peer_ospf_route.rs +++ b/easytier/src/peers/peer_ospf_route.rs @@ -13,7 +13,6 @@ use arc_swap::ArcSwap; use cidr::{IpCidr, Ipv4Cidr, Ipv6Cidr, Ipv6Inet}; use crossbeam::atomic::AtomicCell; use dashmap::DashMap; -use hotpath::instant::Instant; use ordered_hash_map::OrderedHashMap; use parking_lot::{RwLock, lock_api::RwLockUpgradableReadGuard}; use petgraph::{ @@ -25,6 +24,7 @@ use petgraph::{ use prefix_trie::PrefixMap; use prost::Message; use prost_reflect::{DynamicMessage, ReflectMessage}; +use quanta::Instant; use tokio::{ select, sync::Mutex, @@ -1394,7 +1394,6 @@ impl RouteTable { } } - #[cfg_attr(feature = "hotpath", hotpath::measure(impl_type = "RouteTable"))] fn get_next_hop(&self, dst_peer_id: PeerId) -> Option { if self.suppressed_peer_ids.contains_key(&dst_peer_id) { return None; @@ -1402,7 +1401,6 @@ impl RouteTable { self.get_topology_next_hop(dst_peer_id) } - #[cfg_attr(feature = "hotpath", hotpath::measure(impl_type = "RouteTable"))] fn get_topology_next_hop(&self, dst_peer_id: PeerId) -> Option { let cur_version = self.next_hop_map_version.get(); self.next_hop_map.get(&dst_peer_id).and_then(|x| { diff --git a/easytier/src/peers/peer_session.rs b/easytier/src/peers/peer_session.rs index 0a9ad175..0e3e7f38 100644 --- a/easytier/src/peers/peer_session.rs +++ b/easytier/src/peers/peer_session.rs @@ -7,7 +7,7 @@ use std::time::Duration; use anyhow::anyhow; use crossbeam::atomic::AtomicCell; use dashmap::DashMap; -use hotpath::instant::Instant; +use quanta::Instant; use super::secure_datagram::{SecureDatagramDirection, SecureDatagramSession}; use crate::{ @@ -376,7 +376,6 @@ impl PeerSession { } } - #[cfg_attr(feature = "hotpath", hotpath::measure(impl_type = "PeerSession"))] pub fn encrypt_payload( &self, sender_peer_id: PeerId, @@ -390,7 +389,6 @@ impl PeerSession { .encrypt_payload(Self::dir_for_sender(sender_peer_id, receiver_peer_id), pkt) } - #[cfg_attr(feature = "hotpath", hotpath::measure(impl_type = "PeerSession"))] pub fn decrypt_payload( &self, sender_peer_id: PeerId, diff --git a/easytier/src/peers/relay_peer_map.rs b/easytier/src/peers/relay_peer_map.rs index 984cd684..ec5562c3 100644 --- a/easytier/src/peers/relay_peer_map.rs +++ b/easytier/src/peers/relay_peer_map.rs @@ -1,8 +1,8 @@ use std::sync::Arc; use dashmap::DashMap; -use hotpath::instant::Instant; use prost::Message; +use quanta::Instant; use snow::params::NoiseParams; use tokio::sync::{Mutex, OwnedMutexGuard, oneshot}; use tokio::time::{Duration, timeout}; diff --git a/easytier/src/peers/route_trait.rs b/easytier/src/peers/route_trait.rs index 3f70a2e0..ca368644 100644 --- a/easytier/src/peers/route_trait.rs +++ b/easytier/src/peers/route_trait.rs @@ -1,7 +1,7 @@ use cidr::Ipv6Inet; use cidr::{Ipv4Cidr, Ipv6Cidr}; use dashmap::DashMap; -use hotpath::instant::Instant; +use quanta::Instant; use std::{ collections::BTreeSet, net::{Ipv4Addr, Ipv6Addr}, diff --git a/easytier/src/peers/secure_datagram.rs b/easytier/src/peers/secure_datagram.rs index cf89acdf..f4722e44 100644 --- a/easytier/src/peers/secure_datagram.rs +++ b/easytier/src/peers/secure_datagram.rs @@ -701,10 +701,6 @@ impl SecureDatagramSession { false } - #[cfg_attr( - feature = "hotpath", - hotpath::measure(impl_type = "SecureDatagramSession") - )] pub fn encrypt_payload( &self, dir: SecureDatagramDirection, @@ -723,10 +719,6 @@ impl SecureDatagramSession { Ok(()) } - #[cfg_attr( - feature = "hotpath", - hotpath::measure(impl_type = "SecureDatagramSession") - )] pub fn decrypt_payload( &self, dir: SecureDatagramDirection, diff --git a/easytier/src/proto/rpc_impl/client.rs b/easytier/src/proto/rpc_impl/client.rs index 2ffaef1a..13302557 100644 --- a/easytier/src/proto/rpc_impl/client.rs +++ b/easytier/src/proto/rpc_impl/client.rs @@ -5,8 +5,8 @@ use std::sync::{Arc, Mutex}; use bytes::Bytes; use dashmap::DashMap; use guarden::defer; -use hotpath::instant::Instant; use prost::Message; +use quanta::Instant; use tokio::sync::mpsc; use tokio::task::JoinSet; use tokio::time::timeout; diff --git a/easytier/src/proto/rpc_impl/packet.rs b/easytier/src/proto/rpc_impl/packet.rs index c54978f0..9f095c89 100644 --- a/easytier/src/proto/rpc_impl/packet.rs +++ b/easytier/src/proto/rpc_impl/packet.rs @@ -1,6 +1,6 @@ use prost::{Message as _, length_delimiter_len}; -use hotpath::instant::Instant; +use quanta::Instant; use crate::{ common::{PeerId, compressor::DefaultCompressor}, diff --git a/easytier/src/proto/rpc_impl/server.rs b/easytier/src/proto/rpc_impl/server.rs index cde46f6d..fa43c24e 100644 --- a/easytier/src/proto/rpc_impl/server.rs +++ b/easytier/src/proto/rpc_impl/server.rs @@ -5,8 +5,8 @@ use std::{ use bytes::Bytes; use dashmap::DashMap; -use hotpath::instant::Instant; use prost::Message; +use quanta::Instant; use tokio::{task::JoinSet, time::timeout}; use tokio_stream::StreamExt; diff --git a/easytier/src/tunnel/fake_tcp/stack.rs b/easytier/src/tunnel/fake_tcp/stack.rs index 3e6a4056..a7f1b779 100644 --- a/easytier/src/tunnel/fake_tcp/stack.rs +++ b/easytier/src/tunnel/fake_tcp/stack.rs @@ -159,7 +159,7 @@ impl Socket { ack: Option, state: State, ) -> (Socket, flume::Sender) { - let (incoming_tx, incoming_rx) = hotpath::channel!(flume::bounded(MPMC_BUFFER_LEN)); + let (incoming_tx, incoming_rx) = flume::bounded(MPMC_BUFFER_LEN); ( Socket { diff --git a/easytier/src/tunnel/mpsc.rs b/easytier/src/tunnel/mpsc.rs index fb4f68c9..e15231ae 100644 --- a/easytier/src/tunnel/mpsc.rs +++ b/easytier/src/tunnel/mpsc.rs @@ -43,7 +43,7 @@ pub struct MpscTunnel { impl MpscTunnel { pub fn new(tunnel: T, send_timeout: Option) -> Self { - let (tx, mut rx) = hotpath::channel!(channel(32)); + let (tx, mut rx) = channel(32); let (stream, mut sink) = tunnel.split(); let task = tokio::spawn(async move { @@ -66,7 +66,6 @@ impl MpscTunnel { } } - #[cfg_attr(feature = "hotpath", hotpath::measure(impl_type = "MpscTunnel"))] async fn forward_one_round( rx: &mut Receiver, sink: &mut Pin>, @@ -80,7 +79,6 @@ impl MpscTunnel { } } - #[cfg_attr(feature = "hotpath", hotpath::measure(impl_type = "MpscTunnel"))] async fn forward_one_round_no_timeout( rx: &mut Receiver, sink: &mut Pin>, @@ -98,7 +96,6 @@ impl MpscTunnel { sink.flush().await } - #[cfg_attr(feature = "hotpath", hotpath::measure(impl_type = "MpscTunnel"))] async fn forward_one_round_with_timeout( rx: &mut Receiver, sink: &mut Pin>, diff --git a/easytier/src/tunnel/ring.rs b/easytier/src/tunnel/ring.rs index 43f8a783..101b67c6 100644 --- a/easytier/src/tunnel/ring.rs +++ b/easytier/src/tunnel/ring.rs @@ -11,7 +11,7 @@ use async_trait::async_trait; use futures::{Sink, SinkExt, Stream, StreamExt}; use once_cell::sync::Lazy; -use tokio::sync::mpsc::{UnboundedReceiver, UnboundedSender}; +use tokio::sync::mpsc::{UnboundedReceiver, UnboundedSender, unbounded_channel}; use uuid::Uuid; @@ -196,8 +196,7 @@ pub struct RingTunnelListener { impl RingTunnelListener { pub fn new(key: url::Url) -> Self { - let (conn_sender, conn_receiver) = - hotpath::channel!(tokio::sync::mpsc::unbounded_channel()); + let (conn_sender, conn_receiver) = unbounded_channel(); RingTunnelListener { listener_addr: key, conn_sender, diff --git a/easytier/src/tunnel/udp.rs b/easytier/src/tunnel/udp.rs index 922e170c..d473afb8 100644 --- a/easytier/src/tunnel/udp.rs +++ b/easytier/src/tunnel/udp.rs @@ -15,7 +15,9 @@ use zerocopy::{AsBytes, FromBytes}; use tokio::{ net::UdpSocket, - sync::mpsc::{Receiver, Sender, UnboundedReceiver, UnboundedSender}, + sync::mpsc::{ + Receiver, Sender, UnboundedReceiver, UnboundedSender, channel, unbounded_channel, + }, task::JoinSet, }; use tokio_util::task::AbortOnDropHandle; @@ -673,9 +675,8 @@ pub struct UdpTunnelListener { impl UdpTunnelListener { pub fn new(addr: url::Url) -> Self { - let (close_event_send, close_event_recv) = - hotpath::channel!(tokio::sync::mpsc::unbounded_channel()); - let (conn_send, conn_recv) = hotpath::channel!(tokio::sync::mpsc::channel(100)); + let (close_event_send, close_event_recv) = unbounded_channel(); + let (conn_send, conn_recv) = channel(100); Self { addr: addr.clone(), socket: None, @@ -915,8 +916,7 @@ impl UdpTunnelConnector { "udp build tunnel for connector" ); - let (close_event_sender, mut close_event_recv) = - hotpath::channel!(tokio::sync::mpsc::unbounded_channel()); + let (close_event_sender, mut close_event_recv) = unbounded_channel(); let ring_recv = RingStream::new(ring_for_send_udp.clone()); let ring_sender = RingSink::new(ring_for_recv_udp.clone()); diff --git a/easytier/src/tunnel/wireguard.rs b/easytier/src/tunnel/wireguard.rs index 57a5b72f..7efc81f6 100644 --- a/easytier/src/tunnel/wireguard.rs +++ b/easytier/src/tunnel/wireguard.rs @@ -6,7 +6,7 @@ use std::{ time::Duration, }; -use hotpath::instant::Instant; +use quanta::Instant; use super::{ FromUrl, IpVersion, Tunnel, TunnelError, TunnelInfo, TunnelListener, TunnelUrl, ZCPacketSink, @@ -37,7 +37,11 @@ use crossbeam::atomic::AtomicCell; use dashmap::DashMap; use futures::{SinkExt, StreamExt, stream::FuturesUnordered}; use rand::RngCore; -use tokio::{net::UdpSocket, sync::Mutex, task::JoinSet}; +use tokio::{ + net::UdpSocket, + sync::{Mutex, mpsc::unbounded_channel}, + task::JoinSet, +}; const MAX_PACKET: usize = 2048; @@ -470,7 +474,7 @@ pub struct WgTunnelListener { impl WgTunnelListener { pub fn new(addr: url::Url, config: WgConfig) -> Self { - let (conn_send, conn_recv) = hotpath::channel!(tokio::sync::mpsc::unbounded_channel()); + let (conn_send, conn_recv) = unbounded_channel(); WgTunnelListener { addr, config,