Repository navigation
Version 2.4.0
What's Changed
New Features
- Cluster
--monitor-inputsupport: Route-then-stage replay across shards with end-to-end backpressure (#395, #399). - Cluster
--multi-key-get: Slot-aware MGET routing with a shared cache rebuilt on every topology refresh (#397). --transactionflag: Pins a--commandrotation to a single shard in--cluster-mode; works with--pipeline > 1(#390, #400).--retry-on-errorpipeline: Adds--max-retries,--retry-backoff-ms,--retry-backoff-factor,--retry-on=LIST,--max-retry-queue,--failed-keys-file(#381).--realtime-latencies: Streaming HDR-histogram block emits per-secondcur (avg: …)for ops/sec, bytes/sec, miss%, and configured percentiles (#379).- Per-key miss tracking for
--command:--command-miss-tracking={auto,off}plus--miss-rate-threshold=PCT; emits aPer-Key MissesJSON section (#374, #398). --connection-stage-timeout=SECS: Bounds the AUTH/HELLO/SELECT/CLUSTER SLOTS / first-steady-state phase; defaults to 30 s,0disables (#431).- TLS handshake logging: New
TLS connection established: protocol X, cipher Ystderr line and a top-levelTLSobject inmb.json(#403).
Bug Fixes
- Stack overflow in
--monitor-inputreplay: VLA-allocated split-token buffer overflowed for large lines; now heap-allocated (#405). - Stack smash in memcached text parser: Unbounded
sscanf("%s %s …")allowed a hostile server to overflow a 256-byte stack buffer; widths now bounded (#415). - OOB read on malformed
CLUSTER SLOTS:handle_cluster_slotsnow validates reply shape and clamps slot bounds; malformed shards are logged and skipped (#425). - SIGPIPE on TLS RST:
signal(SIGPIPE, SIG_IGN)installed process-wide so a peer RST mid-write no longer exits 141 (#383). - Crash handler hardening:
sigaltstackon main and each worker, pre-warmed backtrace symbols,backtrace_symbols_fd, and a 5 s watchdog (#412, #416). - Cluster reconnect SIGABRT:
cluster_client::connect()is now idempotent under--cluster-mode --reconnect-on-error(#378). - Reconnect duplicate-error thread kill: Duplicate error callbacks while a reconnect is pending no longer break the event loop (#392).
- Unbounded reconnect/retry backoff: Exponential backoff is now capped at 60 s; previously
factor=2.0+ unlimited attempts could schedule reconnects ~34 years out (#433). --monitor-inputparsing: Preserves embedded NUL bytes in the loader; handles CR-only line endings (#434).- RESP3 push and nil: Accepts
>push frames (drained out-of-band) and counts_(nil) as a miss in arbitrary-command tracking (#435). - CLI input validation: Rejects at parse time inputs that 2.3 silently accepted and then crashed/hung on —
-c/-t/-n/--test-timenegatives (#436),--run-countoverflow (#429),--pipeline / --data-size / --data-size-list(#428),--command / --command-ratio(#427),--key-stddev / --key-median / G:Gdegenerate ranges (#430). All return a clear error andexit 2. - Bound recursive RESP teardown: Iterative
~mbulk_size_elso deeply-nested replies can't stack-overflow on cleanup;-Werror=vlabuild guard (#415). - TLS path leakage in JSON:
--cert/--key/--cacertare now basename-only inmb.json(#440). m_reqs_generateddefensive clamp: Underflow guard at three cluster_client subtraction sites (#437).- Hits/sec /0 guard:
summarize()rate computations no longer emit+Inf/nanon zero-duration runs (#436).
Build & Configuration Improvements
- OpenSSL 4.0 build: Replaces removed
SSL_OP_NO_TLSv*flags withSSL_CTX_set_min/max_proto_version; rejects non-contiguous--tls-protocolsselection at parse time on 4.0+ (#432, #444).
Developer Tooling & CI Improvements
- libFuzzer harnesses: Per-PR 60 s smoke fuzz across
split_command_to_args,monitor_input, andredis_protocol(#421). - Adversarial RESP mock-server fixtures: 12 deterministic payloads exercising the parser surface (#419).
- Monitor-input black-box fuzzer: Corpus + synthetic seeds, nightly +
run-fuzzlabel trigger (#422). - Hypothesis CLI fuzzer: Re-broadened strategy + new
cli-fuzz-nightly.yml(#424, #445). - Differential vs
redis-benchmark/redis-cli:run-differentialPR label, label/cron-triggered workflow (#420). - Nightly soak suite: 7 scenarios (long-run memory, large payloads, high concurrency, connection churn, cluster turbulence, retry storm, slow network) with
run-soaklabel (#423). - Sanitizer stress matrix: STRESS=1 cells across ASAN/UBSan/TSAN (#418).
- Workflow permissions hardening:
permissions: contents: readdeclared on every workflow (#380, #393). - PARALLELISM=2 on cluster cells: Resolves Test cell 15-min timeout on cluster TLS (#402).
New Contributors
- @arpitjain099 made their first contribution (#380, #393).
Full Changelog: 2.3.1...2.4.0