Resolve all BLOCKER/CRITICAL/WARNING findings from the m11p7/p8 review: - tidalctl restore: safe_join path-traversal/Zip-Slip guard + fsync on write - corrupt-WAL checkpoint_seq guard; PITR archive-before-delete - cluster: x-tidal-relayed audit-dedup marker; forward_failures counts 5xx - mTLS/HTTP-TLS handshake hardening; accept-loop EMFILE backoff - per-principal rate-limit + node-token marker-pinning tests - self-heal tier-3 coverage; 5 router-auth tests tidal-stress: measurement-fidelity fixes (schedule-lag p99/max, exact feed-over-SLO verdict, shed annotation) + typed Body, workload.next 184ns->68ns, RoundRobin len==1 short-circuit, HeaderValue cache; new benches/hotpath.rs + lib.rs. perf wave 2: signal_snapshot SmallVec/SignalKey carrier; one-get-per-type ranking pre-pass.
67 lines
3.0 KiB
TOML
67 lines
3.0 KiB
TOML
[package]
|
|
name = "tidal-stress"
|
|
version = "0.1.0"
|
|
edition.workspace = true
|
|
rust-version.workspace = true
|
|
description = "Open-loop load generator + capacity ramp for tidalDB's HTTP surface (standalone + multi-process cluster), modeling a thepeach-style feed workload"
|
|
license.workspace = true
|
|
|
|
# ── tidal-crate lint posture (single source of truth) ──────────────────────
|
|
# IDENTICAL block across tidaldb / tidal-net / tidal-server / tidalctl. These
|
|
# crates deliberately DO NOT inherit `[workspace.lints]`; they hold the embedded
|
|
# recommendation DB + its transport/server/CLI to a stricter correctness bar
|
|
# (`unsafe_code = forbid`, `clippy::all = deny`, `unwrap_used = deny`).
|
|
# `unwrap_used = "deny"` is kept per-crate rather than in `[workspace.lints]`
|
|
# because the workspace also hosts the example/consumer crates under
|
|
# `applications/` (not held to the engine's bar). Keep these four blocks BYTE-IDENTICAL.
|
|
[lints.rust]
|
|
unsafe_code = "forbid"
|
|
|
|
[lints.clippy]
|
|
all = { level = "deny", priority = -1 }
|
|
pedantic = { level = "warn", priority = -1 }
|
|
nursery = { level = "warn", priority = -1 }
|
|
# Justified allows: latency/rate math is pervasive usize<->u64<->f64 casting (a
|
|
# load generator is nothing but counters and durations), so the lossy-cast
|
|
# pedantic family is allowed exactly as the engine's ranking math allows it.
|
|
cast_possible_truncation = "allow"
|
|
cast_possible_wrap = "allow"
|
|
cast_precision_loss = "allow"
|
|
cast_sign_loss = "allow"
|
|
module_name_repetitions = "allow"
|
|
# Advisory pedantic/nursery style lints that are noise for a CLI load tool (and
|
|
# which the engine crates already run at warn, not deny): help-text URLs/flags
|
|
# read fine bare; `out.push_str(&format!(..))` is the clearest way to assemble a
|
|
# report table; constructors take their config by value; const-ness of trivial
|
|
# accessors churns. Correctness lints (clippy::all) stay DENY.
|
|
doc_markdown = "allow"
|
|
format_push_string = "allow"
|
|
needless_pass_by_value = "allow"
|
|
missing_const_for_fn = "allow"
|
|
map_unwrap_or = "allow"
|
|
unwrap_used = "deny"
|
|
|
|
[dependencies]
|
|
clap = { version = "4.5", features = ["derive", "env"] }
|
|
serde = { version = "1", features = ["derive"] }
|
|
serde_json = "1"
|
|
thiserror = "2"
|
|
tokio = { version = "1", features = ["macros", "rt-multi-thread", "sync", "time", "signal"] }
|
|
tracing = "0.1"
|
|
tracing-subscriber = { version = "0.3", features = ["env-filter"] }
|
|
rand = "0.9"
|
|
# Async HTTP only (no blocking client): rustls posture matches tidal-server /
|
|
# tidal-net — drops the OpenSSL/native-tls system dependency for a clean static
|
|
# build. `json` for the typed request/response bodies.
|
|
reqwest = { version = "0.12", default-features = false, features = ["json", "rustls-tls"] }
|
|
|
|
[dev-dependencies]
|
|
# Honest before/after for the generator's OWN per-request cost (no server, no
|
|
# network): bench workload.next() construction and the latency-histogram record
|
|
# path in isolation. Matches the engine crate's criterion posture.
|
|
criterion = { version = "0.5", features = ["html_reports"] }
|
|
|
|
[[bench]]
|
|
name = "hotpath"
|
|
harness = false
|