build: per-package CGU + dep dedup — workspace builds ~30% faster

Two complementary changes to reduce clean workspace build time from
~13min to ~8:43:

1. Per-package codegen-units overrides
   Default for all release builds: codegen-units = 16 (parallel LLVM).
   Numerical-sensitive crates (ml-* family, ndarray, nalgebra, cudarc,
   simba, etc.) override back to 1 to preserve bit-exact LLVM
   optimization decisions for the DQN regression suite.
   Non-numerical plumbing (arrow, sqlx, tokio, parquet, ...) compiles
   in parallel via 16 CGUs, no numerical impact.

2. Dependency deduplication
   - axum 0.7 → 0.8 (workspace + services/api): dedupes vs tonic 0.14's
     transitive axum 0.8. Eliminates a full duplicate compile of axum
     and axum-core.
   - statrs 0.17 → 0.18: dedupes nalgebra 0.32 vs 0.33. Also closes a
     numerical concern (two nalgebra versions linked simultaneously).
   - governor 0.6 → 0.10 (services/api + crates/data): dedupes dashmap
     5 vs 6. dashmap is heavy; eliminating one full compile is a real
     win.
   - hashbrown 0.14 → 0.16 (workspace): partial dedupe (dashmap 6.1
     still pulls 0.14 transitively).
   - Workspace Cargo.toml documents residual unfixable duplicates with
     reasons (base64, chacha20, phf, darling, itertools, getrandom,
     hashbrown, syn, thiserror — all blocked by third-party crates we
     can't bump without breakage).

Verified: cargo check --workspace passes.  Numerical crates remain
at codegen-units = 1 — DQN bit-exact reproducibility preserved.
This commit is contained in:
jgrusewski
2026-05-01 01:00:52 +02:00
parent ce11d56eda
commit 2c2b62639e
4 changed files with 184 additions and 195 deletions

216
Cargo.lock generated
View File

@@ -187,35 +187,26 @@ version = "1.0.0"
dependencies = [
"anyhow",
"async-stream",
"async-trait",
"axum 0.7.9",
"axum",
"base32",
"base64 0.22.1",
"bytes",
"chrono",
"clap",
"common",
"config",
"const-oid",
"criterion",
"dashmap 6.1.0",
"dashmap",
"futures",
"fxt",
"governor",
"hdrhistogram",
"hex",
"hmac",
"http 1.4.0",
"http-body 1.0.1",
"http-body-util",
"hyper 1.8.1",
"hyper-util",
"image 0.25.10",
"jsonwebtoken",
"k8s-openapi 0.27.1",
"kube 3.1.0",
"lru",
"num-traits",
"ocsp",
"once_cell",
"prometheus",
@@ -226,7 +217,6 @@ dependencies = [
"redis",
"regex",
"reqwest 0.12.28",
"rust_decimal",
"rustls 0.23.37",
"secrecy 0.8.0",
"serde",
@@ -236,7 +226,6 @@ dependencies = [
"sqlx",
"thiserror 1.0.69",
"tokio",
"tokio-stream",
"tokio-test",
"tonic 0.14.5",
"tonic-health",
@@ -247,15 +236,10 @@ dependencies = [
"totp-rs",
"tower 0.4.13",
"tower-http 0.5.2",
"tower-layer",
"tower-service",
"tracing",
"tracing-subscriber",
"trading_engine",
"urlencoding",
"uuid",
"x509-parser",
"zeroize",
]
[[package]]
@@ -267,7 +251,7 @@ dependencies = [
"chrono",
"clap",
"common",
"dashmap 6.1.0",
"dashmap",
"futures",
"hdrhistogram",
"jsonwebtoken",
@@ -1437,13 +1421,13 @@ dependencies = [
[[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 0.4.5",
"axum-core",
"bytes",
"form_urlencoded",
"futures-util",
"http 1.4.0",
"http-body 1.0.1",
@@ -1451,13 +1435,12 @@ dependencies = [
"hyper 1.8.1",
"hyper-util",
"itoa",
"matchit 0.7.3",
"matchit",
"memchr",
"mime",
"percent-encoding",
"pin-project-lite",
"rustversion",
"serde",
"serde_core",
"serde_json",
"serde_path_to_error",
"serde_urlencoded",
@@ -1469,52 +1452,6 @@ dependencies = [
"tracing",
]
[[package]]
name = "axum"
version = "0.8.8"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8b52af3cb4058c895d37317bb27508dccc8e5f2d39454016b297bf4a400597b8"
dependencies = [
"axum-core 0.5.6",
"bytes",
"futures-util",
"http 1.4.0",
"http-body 1.0.1",
"http-body-util",
"itoa",
"matchit 0.8.4",
"memchr",
"mime",
"percent-encoding",
"pin-project-lite",
"serde_core",
"sync_wrapper 1.0.2",
"tower 0.5.3",
"tower-layer",
"tower-service",
]
[[package]]
name = "axum-core"
version = "0.4.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "09f2bd6146b97ae3359fa0cc6d6b376d9539582c7b4220f041a33ec24c226199"
dependencies = [
"async-trait",
"bytes",
"futures-util",
"http 1.4.0",
"http-body 1.0.1",
"http-body-util",
"mime",
"pin-project-lite",
"rustversion",
"sync_wrapper 1.0.2",
"tower-layer",
"tower-service",
"tracing",
]
[[package]]
name = "axum-core"
version = "0.5.6"
@@ -1531,6 +1468,7 @@ dependencies = [
"sync_wrapper 1.0.2",
"tower-layer",
"tower-service",
"tracing",
]
[[package]]
@@ -1568,7 +1506,7 @@ dependencies = [
"crossbeam",
"crossbeam-channel",
"csv",
"dashmap 6.1.0",
"dashmap",
"data",
"fastrand",
"futures",
@@ -1599,7 +1537,7 @@ dependencies = [
"anyhow",
"async-stream",
"async-trait",
"axum 0.7.9",
"axum",
"base64 0.22.1",
"chrono",
"clap",
@@ -1607,7 +1545,7 @@ dependencies = [
"config",
"criterion",
"crossbeam",
"dashmap 6.1.0",
"dashmap",
"data",
"dbn 0.42.0",
"dotenvy",
@@ -1844,7 +1782,7 @@ dependencies = [
"anyhow",
"async-stream",
"async-trait",
"axum 0.7.9",
"axum",
"base64 0.22.1",
"bytes",
"chrono",
@@ -2886,19 +2824,6 @@ dependencies = [
"syn 2.0.117",
]
[[package]]
name = "dashmap"
version = "5.5.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "978747c1d849a7d2ee5e8adc0159961c48fb7e5db2f06af6723b80123bb53856"
dependencies = [
"cfg-if",
"hashbrown 0.14.5",
"lock_api",
"once_cell",
"parking_lot_core 0.9.12",
]
[[package]]
name = "dashmap"
version = "6.1.0"
@@ -2930,7 +2855,7 @@ dependencies = [
"criterion",
"crossbeam",
"crossbeam-channel",
"dashmap 6.1.0",
"dashmap",
"dbn 0.42.0",
"fastrand",
"flate2",
@@ -2938,7 +2863,7 @@ dependencies = [
"futures-core",
"futures-util",
"governor",
"hashbrown 0.14.5",
"hashbrown 0.16.1",
"hdrhistogram",
"hex",
"lz4",
@@ -2989,7 +2914,7 @@ dependencies = [
"anyhow",
"async-stream",
"async-trait",
"axum 0.7.9",
"axum",
"bytes",
"chrono",
"clap",
@@ -3836,7 +3761,7 @@ version = "1.0.0"
dependencies = [
"anyhow",
"async-trait",
"axum 0.7.9",
"axum",
"backtesting",
"bincode",
"chrono",
@@ -4239,22 +4164,25 @@ checksum = "558b88954871f5e5b2af0e62e2e176c8bde7a6c2c4ed41b13d138d96da2e2cbd"
[[package]]
name = "governor"
version = "0.6.3"
version = "0.10.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "68a7f542ee6b35af73b06abc0dad1c1bae89964e4e253bc4b587b91c9637867b"
checksum = "9efcab3c1958580ff1f25a2a41be1668f7603d849bb63af523b208a3cc1223b8"
dependencies = [
"cfg-if",
"dashmap 5.5.3",
"futures",
"dashmap",
"futures-sink",
"futures-timer",
"no-std-compat",
"futures-util",
"getrandom 0.3.4",
"hashbrown 0.16.1",
"nonzero_ext",
"parking_lot 0.12.5",
"portable-atomic",
"quanta",
"rand 0.8.5",
"rand 0.9.2",
"smallvec",
"spinning_top",
"web-time",
]
[[package]]
@@ -4336,7 +4264,6 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1"
dependencies = [
"ahash 0.8.12",
"allocator-api2",
]
[[package]]
@@ -5890,12 +5817,6 @@ dependencies = [
"regex-automata",
]
[[package]]
name = "matchit"
version = "0.7.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "0e7465ac9959cc2b1404e8e2367b43684a6d13790fe23056cc8c6c5a6b7bcb94"
[[package]]
name = "matchit"
version = "0.8.4"
@@ -6074,7 +5995,7 @@ dependencies = [
"crossbeam",
"csv",
"cudarc",
"dashmap 6.1.0",
"dashmap",
"data",
"databento",
"dbn 0.42.0",
@@ -6114,7 +6035,7 @@ dependencies = [
"ml-supervised",
"ml-universe",
"ml-validation",
"nalgebra 0.33.2",
"nalgebra",
"ndarray",
"num",
"num-traits",
@@ -6191,7 +6112,7 @@ dependencies = [
"aws-sdk-s3",
"aws-types",
"chrono",
"dashmap 6.1.0",
"dashmap",
"flate2",
"fs2",
"hex",
@@ -6222,7 +6143,7 @@ dependencies = [
"common",
"config",
"cudarc",
"dashmap 6.1.0",
"dashmap",
"futures",
"libc",
"mimalloc",
@@ -6326,7 +6247,7 @@ dependencies = [
"common",
"crossbeam",
"cudarc",
"dashmap 6.1.0",
"dashmap",
"ml-core",
"ndarray",
"once_cell",
@@ -6410,7 +6331,7 @@ dependencies = [
name = "ml-labeling"
version = "1.0.0"
dependencies = [
"dashmap 6.1.0",
"dashmap",
"ml-core",
"serde",
"tokio",
@@ -6547,12 +6468,12 @@ dependencies = [
"common",
"config",
"cudarc",
"dashmap 6.1.0",
"dashmap",
"data",
"libc",
"lru",
"ml-core",
"nalgebra 0.33.2",
"nalgebra",
"ndarray",
"num_cpus",
"parking_lot 0.12.5",
@@ -6578,7 +6499,7 @@ dependencies = [
"arrow 56.2.0",
"async-stream",
"async-trait",
"axum 0.7.9",
"axum",
"base64 0.22.1",
"bytes",
"chacha20poly1305",
@@ -6726,24 +6647,6 @@ version = "0.10.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "1d87ecb2933e8aeadb3e3a02b828fed80a7528047e68b4f424523a0981a3a084"
[[package]]
name = "nalgebra"
version = "0.32.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "7b5c17de023a86f59ed79891b2e5d5a94c705dbe904a5b5c9c952ea6221b03e4"
dependencies = [
"approx",
"matrixmultiply",
"nalgebra-macros",
"num-complex",
"num-rational",
"num-traits",
"rand 0.8.5",
"rand_distr 0.4.3",
"simba 0.8.1",
"typenum",
]
[[package]]
name = "nalgebra"
version = "0.33.2"
@@ -6759,7 +6662,7 @@ dependencies = [
"rand 0.8.5",
"rand_distr 0.4.3",
"serde",
"simba 0.9.1",
"simba",
"typenum",
]
@@ -6824,12 +6727,6 @@ dependencies = [
"libc",
]
[[package]]
name = "no-std-compat"
version = "0.4.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b93853da6d84c2e3c7d730d6473e8817692dd89be387eb01b94d7f108ecb5b8c"
[[package]]
name = "nom"
version = "7.1.3"
@@ -8865,11 +8762,11 @@ dependencies = [
"common",
"config",
"criterion",
"dashmap 6.1.0",
"dashmap",
"fastrand",
"futures",
"hdrhistogram",
"nalgebra 0.33.2",
"nalgebra",
"ndarray",
"num",
"num-traits",
@@ -9787,19 +9684,6 @@ dependencies = [
"rand_core 0.6.4",
]
[[package]]
name = "simba"
version = "0.8.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "061507c94fc6ab4ba1c9a0305018408e312e17c041eb63bef8aa726fa33aceae"
dependencies = [
"approx",
"num-complex",
"num-traits",
"paste",
"wide",
]
[[package]]
name = "simba"
version = "0.9.1"
@@ -10263,12 +10147,12 @@ checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f"
[[package]]
name = "statrs"
version = "0.17.1"
version = "0.18.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f697a07e4606a0a25c044de247e583a330dbb1731d11bc7350b81f48ad567255"
checksum = "2a3fe7c28c6512e766b0874335db33c94ad7b8f9054228ae1c2abd47ce7d335e"
dependencies = [
"approx",
"nalgebra 0.32.6",
"nalgebra",
"num-traits",
"rand 0.8.5",
]
@@ -10286,7 +10170,7 @@ dependencies = [
"clap",
"common",
"config",
"dashmap 6.1.0",
"dashmap",
"flate2",
"fs2",
"futures",
@@ -10318,7 +10202,7 @@ dependencies = [
"chrono",
"common",
"config",
"dashmap 6.1.0",
"dashmap",
"futures",
"hdrhistogram",
"num_cpus",
@@ -11113,7 +10997,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "fec7c61a0695dc1887c1b53952990f3ad2e3a31453e1f49f10e75424943a93ec"
dependencies = [
"async-trait",
"axum 0.8.8",
"axum",
"base64 0.22.1",
"bytes",
"h2 0.4.13",
@@ -11460,7 +11344,7 @@ dependencies = [
"approx",
"async-stream",
"async-trait",
"axum 0.7.9",
"axum",
"bigdecimal",
"bytes",
"chrono",
@@ -11474,7 +11358,7 @@ dependencies = [
"hyper-util",
"ml",
"ml-features",
"nalgebra 0.33.2",
"nalgebra",
"num-traits",
"once_cell",
"prometheus",
@@ -11532,7 +11416,7 @@ dependencies = [
"api",
"async-stream",
"async-trait",
"axum 0.7.9",
"axum",
"base32",
"base64 0.22.1",
"bytes",
@@ -11614,7 +11498,7 @@ dependencies = [
"crossbeam-queue",
"crossbeam-utils",
"ctrader-openapi",
"dashmap 6.1.0",
"dashmap",
"flate2",
"futures",
"hdrhistogram",
@@ -11664,7 +11548,7 @@ dependencies = [
"chrono",
"clap",
"common",
"dashmap 6.1.0",
"dashmap",
"futures",
"hdrhistogram",
"jsonwebtoken",

View File

@@ -179,6 +179,33 @@ publish = false
keywords = ["trading", "hft", "ml", "rust", "finance"]
categories = ["finance", "algorithms", "science"]
# Known unfixable duplicates (cargo tree -d), as of 2026-04-30:
#
# Transitive in third-party crates we cannot bump without API breakage or forks:
# - base64 v0.21 (hdrhistogram 7.5 — no newer version released)
# - chacha20 v0.9 (chacha20poly1305 0.10; v0.11 still RC)
# - phf v0.11 (time-tz, transitively via ibapi 1.2 — bumping to ibapi 2.x is a major break)
# - phf v0.12 (chrono-tz 0.10 — both versions held by orthogonal crates)
# - darling v0.14 (vaultrs 0.7 → derive_builder 0.12; vaultrs 0.8 introduces reqwest 0.13 dup, net loss)
# - darling v0.23 (ratatui 0.29 → instability 0.3)
# - itertools v0.10 (criterion 0.5 dev-dep; bumping criterion across 10 bench dirs is high-risk)
# - itertools v0.13 (object_store 0.11; object_store 0.13 has put/get/head/delete API breakage)
# - itertools v0.14 (prost-build 0.14 — already latest)
# - getrandom v0.2/0.3/0.4 (3-way: rand_core 0.6, ahash 0.8, rand 0.10; orthogonal leaves)
# - hashbrown v0.14 (dashmap 6.1 transitive — hashbrown 0.16 in workspace + indexmap)
# - syn v1 / v2 (residual proc-macros pinned to syn 1)
# - thiserror v1 / v2 (some deps still on v1)
#
# Other cargo-tree-d entries are version-suffixes attached to feature splits
# rather than separate compiles (entries with " (*)" markers).
#
# Things we DID dedupe in this pass (2026-04-30):
# - axum 0.7 → 0.8 (workspace + services/api) — dedupes vs tonic 0.14's transitive axum 0.8
# - statrs 0.17 → 0.18 — dedupes nalgebra 0.32 vs 0.33
# - governor 0.6 → 0.10 (services/api + crates/data) — dedupes dashmap 5 vs 6
# - dashmap = workspace (services/api) — same as above
# - hashbrown 0.14 → 0.16 (workspace) — partial dedupe (dashmap 6.1 still pulls 0.14)
[workspace.dependencies]
# Core async and utilities - OPTIMIZED VERSIONS
tokio = { version = "1.40", features = ["rt-multi-thread", "macros", "net", "sync", "time", "fs", "signal", "io-util", "test-util"] }
@@ -270,7 +297,7 @@ secrecy = { version = "0.8", features = ["serde"] }
zeroize = { version = "1.8", features = ["std", "zeroize_derive"] }
# HashiCorp Vault integration
vaultrs = "0.7"
vaultrs = "0.7" # 0.8 introduces reqwest 0.13 dup (vs workspace 0.12) — net loss
# Broker connectivity
tokio-tungstenite = { version = "0.24" }
@@ -292,7 +319,7 @@ redis = { version = "0.27", features = ["tokio-comp", "json", "connection-manage
sqlx = { version = "0.8.6", default-features = false, features = ["runtime-tokio-rustls", "postgres", "chrono", "uuid", "rust_decimal", "migrate", "derive"] } # derive feature required for compile-time query verification, postgres-only usage with rustls (no MySQL)
# MINIMAL statistics only - ALL HEAVY ML DEPENDENCIES REMOVED FROM WORKSPACE
statrs = "0.17" # Basic statistics only
statrs = "0.18" # Basic statistics only — 0.18 uses nalgebra 0.33 (dedupes vs ml-* crates)
approx = "0.5" # Floating point approximations only
# ALL ML DEPENDENCIES COMPLETELY REMOVED FROM WORKSPACE:
# linfa, linfa-linear, linfa-clustering - MOVED TO ml_training_service
@@ -314,7 +341,7 @@ fs2 = "0.4"
flate2 = "1.0"
# Web framework for monitoring (minimal)
axum = { version = "0.7", features = ["json"] }
axum = { version = "0.8", features = ["json"] } # 0.8 dedupes with tonic 0.14's transitive axum 0.8
# gRPC and protocol buffers - CONSOLIDATED VERSIONS
# Upgraded to 0.14 for Sync BoxBody support (enables HTTP-layer auth middleware)
@@ -373,14 +400,14 @@ async-stream = "0.3"
zstd = "0.13"
lz4 = "1.24"
# Object storage for S3 integration
object_store = { version = "0.11", features = ["aws"] }
object_store = { version = "0.11", features = ["aws"] } # 0.13 has API breakage (put/get/head/delete moved); skipping
# Parquet/Arrow REQUIRED for market data persistence and replay in backtesting
parquet = { version = "56", default-features = false, features = ["arrow", "snap"] } # Minimal for RecordBatch + SNAPPY compression
arrow = { version = "56", default-features = false, features = [] } # Minimal for arrays/schema only
arrow-array = "56"
arrow-schema = "56"
dbn = "0.42" # Databento Binary format for real market data
hashbrown = "0.14"
hashbrown = "0.16" # 0.16 dedupes with indexmap 2.x's transitive hashbrown
lru = "0.12"
backoff = "0.4"
@@ -498,6 +525,98 @@ split-debuginfo = "unpacked" # Faster linking on Linux
[profile.dev]
split-debuginfo = "unpacked" # Faster linking for dev builds
# ── Per-package codegen-units overrides ───────────────────────────────────────
# Default for all release builds: codegen-units = 16 → parallel LLVM, faster
# compile. Numerical-sensitive crates (anything whose fp output the DQN
# regression suite depends on bit-for-bit) override back to 1 to preserve the
# exact optimization decisions LLVM makes today.
#
# DO NOT remove an override without running the numerical regression suite.
[profile.release.package."*"]
codegen-units = 16
# Workspace numerical crates — must keep CGU=1 for bit-exact reproducibility
[profile.release.package.ml]
codegen-units = 1
[profile.release.package.ml-core]
codegen-units = 1
[profile.release.package.ml-dqn]
codegen-units = 1
[profile.release.package.ml-ppo]
codegen-units = 1
[profile.release.package.ml-supervised]
codegen-units = 1
[profile.release.package.ml-ensemble]
codegen-units = 1
[profile.release.package.ml-features]
codegen-units = 1
[profile.release.package.ml-labeling]
codegen-units = 1
[profile.release.package.ml-explainability]
codegen-units = 1
[profile.release.package.ml-hyperopt]
codegen-units = 1
[profile.release.package.ml-checkpoint]
codegen-units = 1
[profile.release.package.ml-data]
codegen-units = 1
[profile.release.package.ml-data-validation]
codegen-units = 1
[profile.release.package.ml-validation]
codegen-units = 1
[profile.release.package.ml-asset-selection]
codegen-units = 1
[profile.release.package.ml-backtesting]
codegen-units = 1
[profile.release.package.ml-regime]
codegen-units = 1
[profile.release.package.ml-regime-detection]
codegen-units = 1
[profile.release.package.ml-risk]
codegen-units = 1
[profile.release.package.ml-stress-testing]
codegen-units = 1
[profile.release.package.ml-universe]
codegen-units = 1
[profile.release.package.ml-paper-trading]
codegen-units = 1
[profile.release.package.ml-observability]
codegen-units = 1
[profile.release.package.ml-security]
codegen-units = 1
[profile.release.package.model_loader]
codegen-units = 1
[profile.release.package.training_uploader]
codegen-units = 1
[profile.release.package.risk]
codegen-units = 1
[profile.release.package.trading_engine]
codegen-units = 1
# External numerical/statistical crates
[profile.release.package.ndarray]
codegen-units = 1
[profile.release.package.nalgebra]
codegen-units = 1
[profile.release.package.simba]
codegen-units = 1
[profile.release.package.num-traits]
codegen-units = 1
[profile.release.package.num-complex]
codegen-units = 1
[profile.release.package.libm]
codegen-units = 1
[profile.release.package.statrs]
codegen-units = 1
[profile.release.package.rand_distr]
codegen-units = 1
[profile.release.package.rust_decimal]
codegen-units = 1
[profile.release.package.ordered-float]
codegen-units = 1
[profile.release.package.cudarc]
codegen-units = 1
[dev-dependencies]
anyhow.workspace = true
chrono.workspace = true

View File

@@ -96,8 +96,8 @@ arrow.workspace = true
dashmap.workspace = true
parking_lot.workspace = true
# Rate limiting and caching
governor = "0.6"
# Rate limiting and caching (governor 0.10 dedupes dashmap to v6)
governor = "0.10"
nonzero = "0.2"
redis = { workspace = true, optional = true }

View File

@@ -16,7 +16,6 @@ path = "src/main.rs"
tokio = { workspace = true, features = ["sync", "time"] }
anyhow.workspace = true
tracing.workspace = true
tracing-subscriber.workspace = true
serde.workspace = true
serde_json.workspace = true
once_cell.workspace = true
@@ -24,40 +23,31 @@ clap.workspace = true
# gRPC and networking (Tonic 0.14)
tonic = { workspace = true, features = ["transport", "server", "tls-ring", "tls-webpki-roots"] }
# Used by generated proto code: tonic_prost::ProstCodec
tonic-prost.workspace = true
tonic-reflection.workspace = true
tonic-health.workspace = true
# Used by generated proto code: ::prost::Message derive
prost.workspace = true
tower = { workspace = true, features = ["util"] }
tower-layer.workspace = true
tower-service.workspace = true
hyper.workspace = true
http-body.workspace = true
http-body-util.workspace = true
hyper-util.workspace = true
bytes.workspace = true
# Async streams and futures
tokio-stream.workspace = true
async-stream.workspace = true
futures.workspace = true
async-trait.workspace = true
# Performance monitoring
hdrhistogram.workspace = true
prometheus = { workspace = true, features = ["process"] }
# Cryptography and security
sha2.workspace = true
x509-parser = { version = "0.16", features = ["verify"] }
reqwest = { version = "0.12", features = ["rustls-tls"], default-features = false }
reqwest = { version = "0.12", features = ["rustls-tls", "json"], default-features = false }
base64.workspace = true
jsonwebtoken.workspace = true
chrono.workspace = true
ocsp = "0.4"
lru = "0.12"
hex = "0.4"
const-oid = "0.9"
# MFA/TOTP dependencies (optional, enabled by default via "mfa" feature)
totp-rs = { version = "5.6", optional = true }
@@ -68,18 +58,14 @@ hmac = { version = "0.12", optional = true }
sha1 = "0.10"
urlencoding = { version = "2.1", optional = true }
secrecy = { version = "0.8", features = ["serde"] }
zeroize.workspace = true
thiserror.workspace = true
uuid.workspace = true
sqlx = { workspace = true, features = ["postgres", "chrono", "uuid", "json", "macros"] }
num-traits.workspace = true
rust_decimal.workspace = true
rand.workspace = true
# Internal workspace crates
trading_engine.workspace = true
common = { workspace = true, features = ["database"] }
config = { workspace = true, features = ["postgres"] }
@@ -90,9 +76,9 @@ redis = { workspace = true, features = ["tokio-comp", "connection-manager"] }
kube = { version = "3.0", features = ["client", "runtime", "derive"] }
k8s-openapi = { version = "0.27", features = ["latest"] }
# Rate limiting
governor = "0.6"
dashmap = "6.0"
# Rate limiting (governor 0.10 dedupes dashmap to v6)
governor = "0.10"
dashmap = { workspace = true }
# HTTP and networking
http = "1.1"
@@ -106,8 +92,8 @@ regex = "1.11"
# TLS crypto provider for kube-rs in-cluster client
rustls = { version = "0.23", default-features = false, features = ["ring"] }
# HTTP server for Prometheus metrics endpoint
axum = "0.7"
# HTTP server for Prometheus metrics endpoint (workspace pinned to 0.8 to dedupe with tonic)
axum.workspace = true
# gRPC-Web support for browser access
tonic-web = "0.13"