8.10.2
Update urgency: SECURITY: There are security fixes in the release.
- #15673 Commands queued in a transaction could still access keys whose ACL permissions were revoked before the transaction was executed
- #15722 The cluster bus protocol has no authentication of its own unless
tls-clusteris enabled, so any host able to reach a node's bus port could join the cluster and threaten it. A cluster node now warns at startup when its bus port is left unauthenticated, and the newcluster-bus-port-protected-modeoption (defaultno) makes refusing to run in that state an explicit choice: set it toyesand the node starts only whentls-clusterauthenticates the bus - TimeSeries: Prevented Redis from crashing when adding samples to a compressed Time Series key restored from a malformed RDB payload
- RedisSearch: KNN queries on indexes with very long vector field names could cause the server to crash
- Vector Sets: Deeply nested JSON used in Vector Set queries could cause the server to crash
8.8.3
Update urgency: SECURITY: There are security fixes in the release.
- #15673 Commands queued in a transaction could still access keys whose ACL permissions were revoked before the transaction was executed
- #15722 The cluster bus protocol has no authentication of its own unless
tls-clusteris enabled, so any host able to reach a node's bus port could join the cluster and threaten it. A cluster node now warns at startup when its bus port is left unauthenticated, and the newcluster-bus-port-protected-modeoption (defaultno) makes refusing to run in that state an explicit choice: set it toyesand the node starts only whentls-clusterauthenticates the bus - TimeSeries: Prevented Redis from crashing when adding samples to a compressed Time Series key restored from a malformed RDB payload
- Vector Sets: Deeply nested JSON used in Vector Set queries could cause the server to crash
8.6.7
Update urgency: SECURITY: There are security fixes in the release.
- #15673 Commands queued in a transaction could still access keys whose ACL permissions were revoked before the transaction was executed
- #15722 The cluster bus protocol has no authentication of its own unless
tls-clusteris enabled, so any host able to reach a node's bus port could join the cluster and threaten it. A cluster node now warns at startup when its bus port is left unauthenticated, and the newcluster-bus-port-protected-modeoption (defaultno) makes refusing to run in that state an explicit choice: set it toyesand the node starts only whentls-clusterauthenticates the bus - TimeSeries: Prevented Redis from crashing when adding samples to a compressed Time Series key restored from a malformed RDB payload
- Vector Sets: Deeply nested JSON used in Vector Set queries could cause the server to crash
8.4.7
Update urgency: SECURITY: There are security fixes in the release.
- #15673 Commands queued in a transaction could still access keys whose ACL permissions were revoked before the transaction was executed
- #15722 The cluster bus protocol has no authentication of its own unless
tls-clusteris enabled, so any host able to reach a node's bus port could join the cluster and threaten it. A cluster node now warns at startup when its bus port is left unauthenticated, and the newcluster-bus-port-protected-modeoption (defaultno) makes refusing to run in that state an explicit choice: set it toyesand the node starts only whentls-clusterauthenticates the bus - TimeSeries: Prevented Redis from crashing when adding samples to a compressed Time Series key restored from a malformed RDB payload
- Vector Sets: Deeply nested JSON used in Vector Set queries could cause the server to crash
8.2.10
Update urgency: SECURITY: There are security fixes in the release.
- #15722 The cluster bus protocol has no authentication of its own unless
tls-clusteris enabled, so any host able to reach a node's bus port could join the cluster and threaten it. A cluster node now warns at startup when its bus port is left unauthenticated, and the newcluster-bus-port-protected-modeoption (defaultno) makes refusing to run in that state an explicit choice: set it toyesand the node starts only whentls-clusterauthenticates the bus - TimeSeries: Prevented Redis from crashing when adding samples to a compressed Time Series key restored from a malformed RDB payload
- Vector Sets: Deeply nested JSON used in Vector Set queries could cause the server to crash
2.30.1 (2026-09-17)
This release contains bug fixes since the 2.30.0 release. We recommend that you upgrade at the next available opportunity.
Bugfixes
- #10580 Fix missing conflicts for
INSERT ... ON CONFLICTwith multiple unique constraints - #10583 Fix
NULLconflict resolution on single-column bloom filtering - #10592 Fix duplicate rows from
DeferredChunkAppendwhenLIMITis not pushed down - #10593 Fix
cannot cast type cstringerror inDeferredChunkAppendqueries
Thanks
RustFS 1.0.1-preview.3 (preview)
- feat(nightly): publish packages as assets of the rolling 'nightly' release (sync from release) by @majinghe in https://github.com/rustfs/rustfs/pull/7593
- fix(ecstore): stop pruning at nonempty directories by @marshawcoco in https://github.com/rustfs/rustfs/pull/7616
- fix(replication): close the pre-stable convergence gaps from backlog#2367 by @reatang in https://github.com/rustfs/rustfs/pull/7626
- feat(console): support a configurable console URL prefix by @overtrue in https://github.com/rustfs/rustfs/pull/7634
- chore(release): merge release into main for rc.6 by @overtrue in https://github.com/rustfs/rustfs/pull/7638
- feat: configure the console base path at build time by @cxymds in https://github.com/rustfs/rustfs/pull/7636
- chore(release): prepare 1.0.0-rc.6 by @overtrue in https://github.com/rustfs/rustfs/pull/7641
- fix(heal): preserve retryable batch failures during recovery by @overtrue in https://github.com/rustfs/rustfs/pull/7642
- fix(s3): reject oversize single PUT early and map body errors to 4xx by @reatang in https://github.com/rustfs/rustfs/pull/7635
- fix(ecstore): make directory mtime fixture portable by @marshawcoco in https://github.com/rustfs/rustfs/pull/7623
- fix(storage): prevent readiness after native migration failures by @rjregenold in https://github.com/rustfs/rustfs/pull/7652
- fix(admin): expose OIDC account display fields by @GatewayJ in https://github.com/rustfs/rustfs/pull/7654
- fix(replication): correct peer joins and remote-state reporting by @jkossis in https://github.com/rustfs/rustfs/pull/7650
- feat(ci): add fault-tolerance degradation suite to the functional chain by @majinghe in https://github.com/rustfs/rustfs/pull/7663
- fix(ci): repair functional defaults and chain regression checks by @overtrue in https://github.com/rustfs/rustfs/pull/7664
- "feat(ci): add fault-tolerance degradation suite to the functional chain" by @majinghe in https://github.com/rustfs/rustfs/pull/7667
- fix(ci): align security workflow tests with chain by @cxymds in https://github.com/rustfs/rustfs/pull/7679
- test(kms): cover non-default Vault Transit paths by @hkwi in https://github.com/rustfs/rustfs/pull/7657
- fix(s3): bound stalled UploadPart request bodies by @cxymds in https://github.com/rustfs/rustfs/pull/7659
- fix: enforce S3 permissions for recursive force deletion by @cxymds in https://github.com/rustfs/rustfs/pull/7661
- fix(tables): reject reserved warehouse locations by @GatewayJ in https://github.com/rustfs/rustfs/pull/7671
- fix(e2e): require a verified server binary for every e2e run by @overtrue in https://github.com/rustfs/rustfs/pull/7687
- fix(ci): bind nightly lanes to one resolved source by @overtrue in https://github.com/rustfs/rustfs/pull/7688
- feat(ci): measure queue and execution time by run attempt by @overtrue in https://github.com/rustfs/rustfs/pull/7689
- fix(ci): verify complete functional chain evidence by @overtrue in https://github.com/rustfs/rustfs/pull/7690
- fix(kms): classify KMS/SSE error contracts and SSE-S3 headers by @reatang in https://github.com/rustfs/rustfs/pull/7697
- Collect bounded Connect environment inventory by @overtrue in https://github.com/rustfs/rustfs/pull/7710
- Add Connect service license commands by @overtrue in https://github.com/rustfs/rustfs/pull/7711
- Add consent-bound diagnostic scheduling by @overtrue in https://github.com/rustfs/rustfs/pull/7713
- feat(connect): advertise environment diagnostics by @overtrue in https://github.com/rustfs/rustfs/pull/7714
- feat(connect): add consent-bound profile exports by @overtrue in https://github.com/rustfs/rustfs/pull/7716
- feat(connect): add bounded local log capture by @overtrue in https://github.com/rustfs/rustfs/pull/7718
- feat(connect): add bounded network performance producer by @overtrue in https://github.com/rustfs/rustfs/pull/7719
- Add bounded local telemetry export commands by @overtrue in https://github.com/rustfs/rustfs/pull/7720
- Add bounded drive performance command by @overtrue in https://github.com/rustfs/rustfs/pull/7721
- Add bounded top diagnostic captures by @overtrue in https://github.com/rustfs/rustfs/pull/7722
- Add client-to-deployment performance diagnostics by @overtrue in https://github.com/rustfs/rustfs/pull/7726
- Add a local environment inventory command by @overtrue in https://github.com/rustfs/rustfs/pull/7728
- feat(connect): add bounded object performance diagnostics by @overtrue in https://github.com/rustfs/rustfs/pull/7734
- Add authenticated inter-node network performance probes by @overtrue in https://github.com/rustfs/rustfs/pull/7739
- fix(site-replication): keep an operator's bucket-level target to a peer instead of taking it over by @reatang in https://github.com/rustfs/rustfs/pull/7709
- chore(deps): update flake.lock by @houseme in https://github.com/rustfs/rustfs/pull/7733
- feat(connect): support explicit enterprise proxies by @overtrue in https://github.com/rustfs/rustfs/pull/7745
- feat(connect): emit drive unavailable log events by @overtrue in https://github.com/rustfs/rustfs/pull/7747
- feat(connect): add local inspect export producer by @overtrue in https://github.com/rustfs/rustfs/pull/7750
- test(connect): cover nested allocator profile stats by @overtrue in https://github.com/rustfs/rustfs/pull/7717
- docs(security): add presigned copy advisory lesson by @overtrue in https://github.com/rustfs/rustfs/pull/7754
- fix(ecstore): refuse RMW and reads of unreadable bucket configs by @overtrue in https://github.com/rustfs/rustfs/pull/7759
- refactor(filemeta): own persisted metadata key authority by @overtrue in https://github.com/rustfs/rustfs/pull/7760
- Sync network performance protocol fixtures by @overtrue in https://github.com/rustfs/rustfs/pull/7761
- Sync site replication result fixtures by @overtrue in https://github.com/rustfs/rustfs/pull/7762
- Sync telemetry producer fixtures by @overtrue in https://github.com/rustfs/rustfs/pull/7763
- refactor(rio): own trailer source and drop s3s dependency by @overtrue in https://github.com/rustfs/rustfs/pull/7764
- Deliver diagnostic scheduler receipts to Connect by @overtrue in https://github.com/rustfs/rustfs/pull/7767
- fix(ecstore): refuse writes on unreadable bucket configs with 503 by @overtrue in https://github.com/rustfs/rustfs/pull/7768
- feat(connect): add site replication performance producer by @overtrue in https://github.com/rustfs/rustfs/pull/7769
- refactor(ecstore): read persisted object-metadata keys from the filemeta authority (A3b) by @overtrue in https://github.com/rustfs/rustfs/pull/7770
- feat(connect): add device license renewal client by @overtrue in https://github.com/rustfs/rustfs/pull/7771
- feat(connect): add approved artifact relay by @overtrue in https://github.com/rustfs/rustfs/pull/7772
- fix(connect): export relay CLI types by @overtrue in https://github.com/rustfs/rustfs/pull/7773
- feat(connect): add device report upload client by @overtrue in https://github.com/rustfs/rustfs/pull/7774
- feat(connect): add typed telemetry trace source by @overtrue in https://github.com/rustfs/rustfs/pull/7775
- fix(connect): avoid shadowing replication URL helper by @overtrue in https://github.com/rustfs/rustfs/pull/7777
- fix(connect): restore site replication test nonce by @overtrue in https://github.com/rustfs/rustfs/pull/7778
- fix(connect): restore rustfs build after site replication perf producer by @overtrue in https://github.com/rustfs/rustfs/pull/7779
- fix(rustfs): restore test compilation by @overtrue in https://github.com/rustfs/rustfs/pull/7780
- feat(connect): sign site replication target pair by @overtrue in https://github.com/rustfs/rustfs/pull/7781
- refactor(filemeta): own RestoreStatus and drop the s3s dependency (A3c) by @overtrue in https://github.com/rustfs/rustfs/pull/7782
- feat(connect): add service license relay import by @overtrue in https://github.com/rustfs/rustfs/pull/7784
- feat(admin): add a gateway key inventory for the S3 stack switch by @overtrue in https://github.com/rustfs/rustfs/pull/7785
- feat(server): add RUSTFS_S3_STACK with a gateway GetBucketLocation path by @overtrue in https://github.com/rustfs/rustfs/pull/7786
- revert: remove M1 gateway git dependency until CI can access rustfs/gateway by @overtrue in https://github.com/rustfs/rustfs/pull/7787
- fix: retry IAM migration quorum failures on startup by @overtrue in https://github.com/rustfs/rustfs/pull/7788
- fix: retry interrupted uploads through proxies by @overtrue in https://github.com/rustfs/rustfs/pull/7789
- fix(connect): capture telemetry from server runtime by @overtrue in https://github.com/rustfs/rustfs/pull/7790
- fix: classify explicit proxy failures by @overtrue in https://github.com/rustfs/rustfs/pull/7791
- fix: skip IAM migration when legacy volume is absent by @overtrue in https://github.com/rustfs/rustfs/pull/7792
- fix(release): include CLI in Linux artifacts by @overtrue in https://github.com/rustfs/rustfs/pull/7794
- fix(release): serialize Linux binary links by @overtrue in https://github.com/rustfs/rustfs/pull/7797
- feat(connect): expose live lock count snapshots by @overtrue in https://github.com/rustfs/rustfs/pull/7801
- feat(connect): capture live API activity by @overtrue in https://github.com/rustfs/rustfs/pull/7804
- feat(connect): collect native Linux thread states by @overtrue in https://github.com/rustfs/rustfs/pull/7806
- feat(connect): capture live RPC activity by @overtrue in https://github.com/rustfs/rustfs/pull/7807
- test(connect): verify top.disk release artifacts by @overtrue in https://github.com/rustfs/rustfs/pull/7808
- test(connect): require native top.disk runner by @overtrue in https://github.com/rustfs/rustfs/pull/7809
- feat(connect): capture bounded local CPU profiles by @overtrue in https://github.com/rustfs/rustfs/pull/7811
- ci: retain top disk acceptance archive by @overtrue in https://github.com/rustfs/rustfs/pull/7812
- fix(connect): observe host traffic in top net by @overtrue in https://github.com/rustfs/rustfs/pull/7814
- ci: enable CPU profiling in supported release builds by @overtrue in https://github.com/rustfs/rustfs/pull/7815
- test(connect): verify profile cpu release artifacts by @overtrue in https://github.com/rustfs/rustfs/pull/7818
- test(connect): retain CPU profile verification key by @overtrue in https://github.com/rustfs/rustfs/pull/7819
- test(connect): retain CPU profile import bundle by @overtrue in https://github.com/rustfs/rustfs/pull/7820
- feat(connect): expose object inspect CLI by @overtrue in https://github.com/rustfs/rustfs/pull/7821
- feat(connect): wrap diagnostic reports for upload by @overtrue in https://github.com/rustfs/rustfs/pull/7822
- fix(connect): parse inspect paths as paths by @overtrue in https://github.com/rustfs/rustfs/pull/7826
- feat(connect): verify typed diagnostic jobs by @overtrue in https://github.com/rustfs/rustfs/pull/7827
- fix(connect): accept KMS report upload authorization by @overtrue in https://github.com/rustfs/rustfs/pull/7828
- Run signed diagnostic jobs in the RustFS service by @overtrue in https://github.com/rustfs/rustfs/pull/7829
- fix(connect): emit canonical report manifest time by @overtrue in https://github.com/rustfs/rustfs/pull/7830
- Upload diagnostic job results through support bundles by @overtrue in https://github.com/rustfs/rustfs/pull/7831
- fix(connect): emit canonical top envelope time by @overtrue in https://github.com/rustfs/rustfs/pull/7836
- fix(connect): publish diagnostic producer capabilities by @overtrue in https://github.com/rustfs/rustfs/pull/7837
- fix(io-metrics): drop the rustfs-common edge by injecting the S3 telemetry observer by @overtrue in https://github.com/rustfs/rustfs/pull/7795
- fix(replication): count a bodiless 405 as a replicated delete marker by @reatang in https://github.com/rustfs/rustfs/pull/7756
- fix(kms): refuse key ids that leave the key prefix on the Vault backends by @reatang in https://github.com/rustfs/rustfs/pull/7727
- Preserve safe profile job failure reasons by @overtrue in https://github.com/rustfs/rustfs/pull/7860
- Freeze the heartbeat producer capability registry by @overtrue in https://github.com/rustfs/rustfs/pull/7861
- fix: resume GET body after peer short EOF by @houseme in https://github.com/rustfs/rustfs/pull/7852
- ci: file scheduled-failure issues in rustfs/backlog by @majinghe in https://github.com/rustfs/rustfs/pull/7847
- fix(admin): keep the gateway key inventory off the s3s surface by @overtrue in https://github.com/rustfs/rustfs/pull/7817
- fix(s3): honor presigned UploadPart checksum queries by @overtrue in https://github.com/rustfs/rustfs/pull/7748
- fix(auth): reject unsigned x-amz headers on header-signed SigV4 requests by @overtrue in https://github.com/rustfs/rustfs/pull/7796
- fix(table-catalog): map transient lock failures to unavailable by @marshawcoco in https://github.com/rustfs/rustfs/pull/7841
- Verify profile service jobs on native Linux by @overtrue in https://github.com/rustfs/rustfs/pull/7862
- Authorize the private Connect acceptance checkout by @overtrue in https://github.com/rustfs/rustfs/pull/7863
- Run profile service acceptance directly by @overtrue in https://github.com/rustfs/rustfs/pull/7864
- Retain profile service failure evidence by @overtrue in https://github.com/rustfs/rustfs/pull/7868
- fix: update dependencies and preserve transport errors by @dependabot[bot] in https://github.com/rustfs/rustfs/pull/7798
- ci: expect BACKLOG_ISSUE_TOKEN in scheduled alert wiring checks by @majinghe in https://github.com/rustfs/rustfs/pull/7867
- Pace diagnostic job result redelivery by @overtrue in https://github.com/rustfs/rustfs/pull/7869
- Execute authenticated top.api service jobs by @overtrue in https://github.com/rustfs/rustfs/pull/7872
- feat(connect): execute top.locks service jobs by @overtrue in https://github.com/rustfs/rustfs/pull/7874
- fix(ci): gate Connect acceptance on x86 build job by @overtrue in https://github.com/rustfs/rustfs/pull/7875
- fix(ci): repair E2E inventory and network CLI coverage by @overtrue in https://github.com/rustfs/rustfs/pull/7871
- feat(connect): execute performance network jobs by @overtrue in https://github.com/rustfs/rustfs/pull/7877
- feat(connect): execute bounded drive performance jobs by @overtrue in https://github.com/rustfs/rustfs/pull/7878
- Preserve the top API service job nonce by @overtrue in https://github.com/rustfs/rustfs/pull/7879
- feat(connect): execute thread profile service jobs by @overtrue in https://github.com/rustfs/rustfs/pull/7880
- Execute authenticated top.rpc service jobs by @overtrue in https://github.com/rustfs/rustfs/pull/7881
- ci: add service diagnostic acceptance workflows by @overtrue in https://github.com/rustfs/rustfs/pull/7882
- ci: add threads and RPC acceptance workflows by @overtrue in https://github.com/rustfs/rustfs/pull/7883
- fix(connect): deliver diagnostic results until expiry by @overtrue in https://github.com/rustfs/rustfs/pull/7886
- feat(connect): export signed environment inventory by @overtrue in https://github.com/rustfs/rustfs/pull/7887
- fix: recover interrupted GETs and heal operations by @overtrue in https://github.com/rustfs/rustfs/pull/7876
- fix: keep top locks within its capture window by @overtrue in https://github.com/rustfs/rustfs/pull/7888
- fix: recover heal after peer boot epoch changes by @overtrue in https://github.com/rustfs/rustfs/pull/7889
- ci: register the table suite workflow on the default branch by @majinghe in https://github.com/rustfs/rustfs/pull/7893
- test(ecstore): synchronize causal cleanup observations by @overtrue in https://github.com/rustfs/rustfs/pull/7894
- fix(ecstore): create markers for repeated versioned deletes by @GatewayJ in https://github.com/rustfs/rustfs/pull/7884
- Preserve top.locks signed job nonce by @overtrue in https://github.com/rustfs/rustfs/pull/7898
- fix(ecstore): roll back failed delete marker writes by @overtrue in https://github.com/rustfs/rustfs/pull/7899
- chore(deps): refresh RustFS tokio tar dependency by @houseme in https://github.com/rustfs/rustfs/pull/7907
- fix(ci): retain failed functional chain reports and check runners by @majinghe in https://github.com/rustfs/rustfs/pull/7906
- fix(ci): bound non-performance functional suites to one hour by @majinghe in https://github.com/rustfs/rustfs/pull/7911
- ci(build): run linux build lanes on sm-standard-4 runners by @majinghe in https://github.com/rustfs/rustfs/pull/7917
- fix(ecstore): admit transformed small objects inline by plaintext size by @reatang in https://github.com/rustfs/rustfs/pull/7916
- ci(chain): stop gating all suites on the performance runner by @majinghe in https://github.com/rustfs/rustfs/pull/7924
- perf(rustfs): skip redundant content-sha256 pass on signed PUTs by @reatang in https://github.com/rustfs/rustfs/pull/7928
- ci: register the fault-tolerance suite workflow on the default branch by @majinghe in https://github.com/rustfs/rustfs/pull/7929
- chore(release): merge release into main after 1.0.0 by @overtrue in https://github.com/rustfs/rustfs/pull/7935
- fix(ecstore): keep decommission multipart on reserved target by @cxymds in https://github.com/rustfs/rustfs/pull/7937
- fix(heal): match legacy null version during replacement readback by @cxymds in https://github.com/rustfs/rustfs/pull/7933
- fix(heal): certify metadata health and marker repair receipts by @cxymds in https://github.com/rustfs/rustfs/pull/7932
- ci(ft): upload the fault-tolerance report to the dashboard by @majinghe in https://github.com/rustfs/rustfs/pull/7939
- ci: drop dead references to the deleted release branch by @overtrue in https://github.com/rustfs/rustfs/pull/7945
- build(deps): update dependency versions by @houseme in https://github.com/rustfs/rustfs/pull/7942
- perf(s3select): accelerate ScanRange record scanning by @GatewayJ in https://github.com/rustfs/rustfs/pull/7934
- fix(ci): bound the fault-tolerance dashboard upload step by @overtrue in https://github.com/rustfs/rustfs/pull/7948
- chore(release): prepare 1.0.1 by @overtrue in https://github.com/rustfs/rustfs/pull/7946
- fix(ecstore): forward quota admission on CopyObject destination writes by @overtrue in https://github.com/rustfs/rustfs/pull/7947
- feat(tables): support staged table creation by @GatewayJ in https://github.com/rustfs/rustfs/pull/7919
- refactor(obs): depend on dial9 crate by @houseme in https://github.com/rustfs/rustfs/pull/7949
- fix(ecstore): reuse metadata read guards during writes by @jkossis in https://github.com/rustfs/rustfs/pull/7941
- fix(ilm): keep expiry pending gauge balanced and drain overwrite tails by @overtrue in https://github.com/rustfs/rustfs/pull/7944
- fix(ecstore): keep the single-block bound on every inline candidate by @overtrue in https://github.com/rustfs/rustfs/pull/7954
- Allow 127.0.0.0/8 as loopback addresses for binding by @aredridel in https://github.com/rustfs/rustfs/pull/7943
- fix(ecstore): hide and reclaim ancestors of delete residue in prefix listings by @overtrue in https://github.com/rustfs/rustfs/pull/7955
- @aredridel made their first contribution in https://github.com/rustfs/rustfs/pull/7943
Full Changelog: https://github.com/rustfs/rustfs/compare/1.0.0...1.0.1-preview.3
9.2.0-rc1
Upgrade urgency LOW: This is the first release candidate of Valkey 9.2.0.
- Active expiration of keys and hash fields now increments the dirty counter, so save points (and thus BGSAVE) may trigger more often by @enjoy-binbin (#3118)
- Add ACL DIGEST command that returns a fingerprint of the ACL rules currently in effect, useful to verify what ACL LOAD applied by @melancholictheory (#4446)
- Add forkless RDB snapshots, opt-in via the new
forkless-infrastructure-enabledandbgsave-default-methodconfigs, with new INFO persistence fields reporting the save method and progress by @JimB123 (#4460) - Add the
XACKDELandXDELEXstream commands withKEEPREF,DELREFandACKEDmodes to acknowledge and delete messages once consumer groups no longer need them by @nickiaq (#4629) - Support a secondary server certificate via
tls-alt-cert-file,tls-alt-key-fileandtls-alt-key-file-pass, e.g. a post-quantum certificate alongside RSA, with matching INFO TLS fields by @pkhartsk (#3717) - Add ACL roles: named, reusable sets of ACL selectors managed with
ACL SETROLE/DELROLE/GETROLE/ROLESand assigned to users withrole:<name>, in commands, the ACL file and valkey.conf by @yang-z-o (#3967) - Add a
maxmemory-scriptsconfig to limit memory used by cachedEVALscripts, and markSCRIPT LOADas DENYOOM so it respects the global maxmemory limit by @enjoy-binbin (#866) - Add Path Hash, a new radix-tree-backed data type with
PH*commands for exact lookup, longest-prefix matching, and prefix traversal over binary-safe paths by @yangbodong22011 (#4506) - Support whole-stream LZ4 compression of RDB files via the new
rdbcompression lz4option; the default per-string LZF behavior is unchanged by @sarthakaggarwal97 (#3531) - Add server-side hot key detection with new
HOTKEYS GET/RESETcommands, enabled by settinghotkeys-top-kby @alon-arenberg (#3708) - Add optional replication throttling (
repl-throttling-enabled) that slows client writes when a replica falls behind, avoiding disconnects and full syncs by @harrylin98 (#4356) - Prioritize system-critical events (cluster heartbeats, replication, slot migration) over heavy client traffic, tunable via the new
priority-preemptive-poll-interval-usconfig by @satheeshaGowda (#4076) - Reserve connection slots for administrative clients: connections from the CIDR ranges listed in the new
priority-subnetsconfig are tagged as prioritized,maxclients-reservedcaps normal clients atmaxclientsminus that many slots, andINFO clientsreportsconnected_priority_clientsby @satheeshaGowda (#4005) - Add
INCREXcommand to atomically increment a key by an integer or float while setting its expiration, withNX/XXconditions by @GavinDmello (#3253)
- Speed up radix tree lookups and inserts by using SIMD-optimized memchr() for child-edge search by @charsyam (#3472)
- Improve replica processing speed by parsing multiple commands from the replication stream at once by @enjoy-binbin (#3597)
- Reduce memory usage by sharing pubsub pattern and WATCH key objects across clients subscribing to or watching the same name by @enjoy-binbin (#4072)
- Large sorted sets are now backed by a B+ tree instead of a skiplist; OBJECT ENCODING reports
btreeinstead ofskiplistby @ranshid (#4359) - Save the cluster config file from a background thread when
cluster-config-save-behavioris best-effort, avoiding main-thread latency spikes from slow disk I/O by @enjoy-binbin (#2555) - Speed up
HMGET,SMISMEMBERandZMSCOREon large hashtable-encoded keys with batched lookups that overlap memory accesses by @chzhoo (#4017) - Extend memory prefetching to hash, set and sorted set member lookups when io-threads are enabled, improving performance for 30 field/member commands on large keys by @roshkhatri (#3940)
MEMORY PURGEnow also releases free pages from the glibc main arena back to the OS, reclaiming memory held by libc-internal allocations by @webbsssss (#3640)- Speed up command propagation to replicas by batching each command's RESP frame into a single replication buffer write by @hpatro (#4044)
- Reduce lseek system calls during disk-based replication by seeking only when a write blocks or is partial by @enjoy-binbin (#4053)
- Reduce event-loop overhead by refreshing cached daylight-saving info once per second instead of on every wakeup by @hpatro (#4086)
- Speed up keyspace event notifications by skipping work when there are no subscribers and avoiding unnecessary allocations by @enjoy-binbin (#4285)
- Speed up exact
XTRIM MAXLEN = 0by about 2.5x by clearing the whole stream in one step instead of removing entries individually by @sarthakaggarwal97 (#4161) - Cluster bus reads, writes, and inbound TLS accepts can now run on the shared I/O thread pool, with new
CLUSTER INFOoffload statistics by @hpatro (#3438) - Small hashes with field expiration now use the memory-efficient listpack encoding instead of always converting to a hashtable by @frostzt (#3212)
- Reduce per-command overhead by skipping post-command bookkeeping when no propagation, module, or invalidation work is pending by @ahmetalicc (#4257)
- MODULE LOAD is now rejected during async replication loading and atomic slot migration to avoid unexpected module behavior by @KIvanow (#3039)
- Reject CLUSTER ADDSLOTS/DELSLOTS/ADDSLOTSRANGE/DELSLOTSRANGE/FLUSHSLOTS on replicas, preventing an assertion failure on a later CLUSTER REPLICATE by @enjoy-binbin (#4020)
- Fix a crash when processing a heartbeat from a cluster node whose role is locally unknown, such as after loading an incomplete nodes.conf by @enjoy-binbin (#4091)
- Fix wrong results or debug-build assertions in cluster mode when the server inspects keys outside the executing command's slot, such as WATCHed keys checked during EXEC by @nitaicaro (#4380)
- Fix stream commands that mutate consumer-group or PEL state (
XGROUP,XSETID,XREADGROUP,XACK,XCLAIM,XAUTOCLAIM) not triggeringWATCHand client-side tracking invalidation by @Tarte12 (#3459) - Fix a server crash on FUNCTION DELETE or FUNCTION LOAD REPLACE after loading a library with function names differing only in case by @madolson (#3925)
- Client-side tracking no longer records routing-only tokens such as the CLUSTERSCAN cursor as tracked keys by @nmvk (#3699)
- Reject malformed slot entries in the cluster config file as a corrupt config instead of asserting or invoking undefined behavior by @enjoy-binbin (#4100)
- Fix a TLS busy loop that consumed 100% CPU when a connection's read or write handler was removed while OpenSSL was waiting for the opposite event by @yairgott (#3510)
- Client eviction no longer disconnects extra clients when a large client's close is deferred but its memory is already scheduled to be freed by @dhruv2x (#4152)
- Fix a crash caused by a NULL pointer dereference when all timer events in an event loop are pending deletion by @royenheart (#4351)
- Rework iteration over clients blocked on ready keys to simplify and harden an earlier use-after-free fix by @enjoy-binbin (#4472)
- Fix a race in RDB string compression that could produce corrupt, unloadable RDB files when compression runs concurrently, without increasing copy-on-write by @dubey02 (#4539)
- Fix dropped field TTLs and a possible crash when loading a hash with field expiration converts it to a hashtable mid-load (e.g. via RESTORE) by @madolson (#4669)
- Reject a repeated
CLUSTER SYNCSLOTS ESTABLISHon the same connection, which could lead to a use-after-free crash on disconnect by @Pyolar (#4670) - Fix wrong
ZCOUNTresults and incorrectZREMRANGEBYSCOREdeletions when members sharing a boundary score span multiple btree leaves by @rainsupreme (#4554) - Fix
SORTkey extraction so aSTOREdestination named like an option can no longer bypass ACL checks and write to an unauthorized key by @madolson (#4665)
MOVEaccepts a new optionalREPLACEargument to overwrite an existing key in the destination database by @bandalgomsu (#2993)- WAIT and WAITAOF now reject numreplicas values that are negative or exceed INT_MAX, fixing an integer overflow that broke blocking by @enjoy-binbin (#3407)
- Add CONFIG INFO subcommand returning config metadata such as type, flags, valid enum values and numeric ranges by @nitaicaro (#3050)
- Add the
IFNEoption toSETto set a key only when its current value differs from the given comparison value by @arshidkv12 (#3105) - Add
IFEQ,IFNE,NXandXXconditions toEXEC, enabling optimistic locking for multi-key transactions withoutWATCHby @bandalgomsu (#4019) - Add an optional
XXflag toSISMEMBERthat returns -1 when the key does not exist, distinguishing a missing key from a missing member by @li-benson (#2972) - Handle NOT_KEY key-specs more defensively so COMMAND GETKEYS and ACL key checks consistently treat routing-only tokens as non-keys by @enjoy-binbin (#3675)
- Fix DEBUG HELP to show the correct DELAY-RDB-CLIENT-FREE-SECONDS name and document the SET-DISABLE-DENY-SCRIPTS subcommand by @xiejing-dev (#4099)
- Add XX option to the ZRANGE family of commands to distinguish a non-existent key (nil) from an empty result by @youngmore1024 (#2978)
- Fix the reply schemas of the ZRANGE family of commands to allow the null reply returned with the XX option by @murphyjacob4 (#4275)
- Fix the
XPENDINGreply schema to describe the summary reply returned when a consumer group has no pending messages by @sarthakaggarwal97 (#4653)
- Cluster replicas now redirect keyless commands like SCAN and FLUSHDB to the primary for clients with CAPA REDIRECT that have not sent READONLY by @yanamolo (#3505)
- Changing cluster-require-full-coverage via CONFIG SET now updates the cluster state immediately instead of waiting for the next cron cycle by @enjoy-binbin (#3676)
- Fix CLUSTER BUMPEPOCH getting stuck when a dead node holds an equal or abnormally high config epoch; a single bump now overtakes it by @enjoy-binbin (#4092)
- Replicas now retry PSYNC when the primary replies -BUSY instead of downgrading to legacy SYNC, which broke WAIT, PSYNC and FAILOVER by @enjoy-binbin (#4140)
- SYNC/PSYNC from a replica with a down primary link now consistently returns -NOMASTERLINK, avoiding an unnecessary full sync fallback by @enjoy-binbin (#4148)
- Add cluster-replica-priority config so operators can rank which replicas are preferred during automatic cluster failover by @enjoy-binbin (#2204)
- Speed up recovery from split-vote failover elections with a new FAILOVER_AUTH_NACK message that lets a replica detect an unwinnable election and immediately retry with a higher epoch by @enjoy-binbin (#3833)
- Add optional per-target
AUTH username passwordtoCLUSTER MIGRATESLOTS, with credentials redacted from the slow log and MONITOR by @nemtsv (#3538) - Compress the full-sync RDB payload with LZ4 when
rdbcompression lz4is set and every attaching replica advertises support, reducing sync bandwidth with safe fallback to plaintext by @roshkhatri (#4075) - Add an
if-emptyvalue tocluster-replica-no-failoverso a replica that has never received data from its primary refuses automatic failover, preventing silent data loss by @enjoy-binbin (#4425) - Add optional LZ4 streaming compression for steady-state replication via the new
repl-compressionconfig, negotiated per replica so older or opted-out replicas keep receiving plaintext by @roshkhatri (#3853) - Fix
CLUSTERSCANfingerprints to derive from the hash-seed config so cursors survive failover between nodes sharing a seed by @enjoy-binbin (#3679) - Replicas trigger a failover check immediately when cluster-replica-no-failover is disabled at runtime, instead of waiting for the next cron tick by @enjoy-binbin (#3827)
- Validate node IDs and shard IDs received in cluster messages before applying them, dropping the link on invalid data to protect cluster state by @enjoy-binbin (#4065)
- Drop the cluster link when a gossip section contains invalid node IDs, instead of keeping the connection to a corrupted sender alive by @enjoy-binbin (#4077)
- Persist nodes.conf promptly when a node's address is updated through the gossip section by @enjoy-binbin (#4089)
- Reject malformed node IDs in the open-slots RDB aux field instead of creating an illegal cluster node by @enjoy-binbin (#4098)
- Strip the redundant LIMIT option when rewriting XADD/XTRIM for propagation, so the rewritten command is valid for tools that replay it by @cjx-zar (#4063)
- Persist non-default cluster-replica-priority to nodes.conf so it survives restarts instead of waiting for the next gossip round by @enjoy-binbin (#4454)
- Clear a stale primary-failure gossip flag on replicas so later failovers don't incorrectly skip the election delay by @charsyam (#4533)
- Fix a node staying stuck in PFAIL when its PING is lost while the peer's own traffic keeps the cluster link alive by @enjoy-binbin (#4171)
CLUSTER SYNCSLOTS FINISHnow rejects clients outside the slot migration stream, preventing misuse of the import state machine by @enjoy-binbin (#4330)
commandlog-request-larger-thanandcommandlog-reply-larger-thannow accept memory units such as 10mb by @enjoy-binbin (#2648)cluster-announce-ipnow must be a valid IP address or hostname, rejecting values likeip:portthat broke cluster bus addressing by @AlisinaDevelo (#4055)- Reject an empty
tls-ca-cert-dirat startup andCONFIG SETtime instead of silently accepting it and failing every client handshake later by @yang-z-o (#3522) - Document the database-level ACL rules (
db=,alldbs,resetdbs) in valkey.conf and clarify theresetrule description by @enjoy-binbin (#3808) - CONFIG REWRITE now preserves module load order, so modules with dependencies load correctly after a restart by @Taeknology (#3769)
- Document in valkey.conf that unixsocketgroup requires the chown syscall to be allowed under syscall-filtering sandboxes by @moko-poi (#3730)
- Add
ValkeyModule_ScanKeyRawBorrowedto scan hash, set and sorted set keys without allocating a string per element by @KarthikSubbarao (#4403) - Fix loading of legacy Redis modules that export
RedisModule_OnLoadvia a linker version script by @roshkhatri (#3374) - Module global defrag callbacks now receive a time limit and a resumable cursor, making
ValkeyModule_RegisterDefragFuncusable for large module data by @Aksha1812 (#4487) - Add
ValkeyModule_IncrExternalMemory/DecrExternalMemoryso modules can report memory allocated outside the server allocator towardused_memoryandmaxmemoryby @bandalgomsu (#4128) - Correct
ValkeyModule_FreeModuleUser,ValkeyModule_ACLAddLogEntryandValkeyModule_ACLAddLogEntryByUserNamedeclarations to return int as implemented, fixing undefined behavior on targets with strict call signature checks by @rainsupreme (#4676)
- Client memory usage now includes watched key and pubsub channel/pattern names, making it visible in CLIENT INFO tot-mem and counted for maxmemory-clients by @enjoy-binbin (#3362)
- CONFIG RESETSTAT now also resets the IO-thread prefetch and ACL access-denied statistics by @enjoy-binbin (#2891)
- Latency report now recommends 'madvise' for disabling Transparent Huge Pages, consistent with the startup check by @enjoy-binbin (#3947)
- Log when a cluster primary ignores an MFSTART manual failover message from an unknown node or a non-replica, helping diagnose failover timeouts by @enjoy-binbin (#4058)
- Log a warning when a TLS certificate has an invalid notBefore or notAfter field on OpenSSL 4.0 builds by @pkhartsk (#4064)
- Gossip corruption warnings now log the actual entry with the invalid node ID instead of the first gossip entry by @enjoy-binbin (#4101)
- Produce crash stack traces on musl-based systems like Alpine Linux via a libbacktrace fallback by @hanxizh9910 (#3581)
- Always log the "possibly failing" notice when a node enters PFAIL, including on voting primaries by @enjoy-binbin (#4186)
EXECtransactions are now recorded in the slowlog and commandlog when their total execution time crosses the threshold by @michellee-10 (#4267)- Add
last_successful_sync_duration_mstoINFO replication, reporting how long the replica's last full sync took by @satheeshaGowda (#4197) - Fix signal mask parsing on 32-bit systems so the crash handler can collect thread stack traces by @sarthakaggarwal97 (#4415)
- Add
total_cluster_links_established_inbound/outboundcounters toCLUSTER INFOto help detect cluster link flapping by @enjoy-binbin (#4169) - RDMA connection and resource setup failures are now logged with detailed system error information by @quanyeyang (#4586)
- Include the LRU list's duplicated script SHA copies in EVAL script memory reporting (
used_memory_scripts_eval) by @enjoy-binbin (#4587) - Log the module version alongside the module name when a module is loaded, so the loaded version is visible in the log by @enjoy-binbin (#4566)
- Detect changes to the alternate TLS key file (
tls-alt-key-file) so certificate auto-reload picks them up by @pkhartsk (#4663) - Report
tls_server_cert_serialand expiry INFO fields for the certificate actually loaded fromtls-cert-fileinstead of whichever one OpenSSL slots first by @madolson (#4664)
- valkey-cli reads the
VALKEYCLI_HOSTandVALKEYCLI_PORTenvironment variables to set the default host and port by @Dietr1ch (#3402) - valkey-benchmark can load CSV/TSV datasets and inject their fields into commands via
__field:name__placeholders by @VoletiRam (#2823) - valkey-cli supports the VALKEYCLI_USER environment variable as an alternative to the --user option by @jdheyburn (#4126)
valkey-cli --rdbnow exits with an error instead of reporting success when trimming the RDB EOF marker fails, avoiding a silently corrupt file by @gluxier (#3945)- Fix valkey-benchmark crash (out-of-bounds read) when a repeat count is given with no command following it by @lightsigma96 (#4142)
- valkey-benchmark -r now accepts keyspace sizes above INT_MAX (up to 999,999,999,999) with proper input validation by @michellee-10 (#4252)
- valkey-benchmark now rejects a repeat count with no command after it with a clear error instead of hanging forever sending zero requests by @dhruv2x (#4215)
- valkey-benchmark multi-threaded mode scales further by removing cross-thread contention in key generation, latency recording, and counters by @rainsupreme (#4332)
- Add REUSE-compliant machine-readable licensing with per-file license clarity, enabling SPDX SBOM generation and correct license detection by @zuiderkwast (#3968)
- Fix clean or highly parallel builds failing with a missing release.h for valkey-cli, valkey-benchmark, and unit tests by @poiuj (#3683)
- Use PRIVATE link dependencies in CMake so Valkey's CMake files can be safely integrated into other projects by @eifrah-aws (#3658)
- Pass
CPPFLAGSto bundled dependencies and the src Makefile so packaging hardening flags apply to the whole build by @Vonng (#4318) - Raise the minimum required CMake version to 3.24 to match features already used by the build by @Baraa-Hasheesh (#4232)
- Abhishek Kumar @dubey02
- abmathur-ie @abmathur-ie
- Aditya Teltia @AdityaTeltia
- Ahmad Belbeisi @ahmadbelb
- Ahmet Alıç @ahmetalicc
- Akash Kumar @akashkgit
- AkshaThakkar1812 @Aksha1812
- Alina Liu @asagege
- Alisina Karimi @AlisinaDevelo
- Alon Arenberg @alon-arenberg
- Amariah Abishai @AmariahAK
- Arshid @arshidkv12
- Avi Fenesh @avifenesh
- bandalgomsu @bandalgomsu
- Bara' Hasheesh @Baraa-Hasheesh
- Benson-li @li-benson
- Binbin @enjoy-binbin
- Björn Svensson @bjosv
- bodong.ybd @yangbodong22011
- Bonnie Chan @BChan-0
- Brad Bebee @beebs-systap
- charsyam @charsyam
- chenshi @chenshi5012
- chzhoo @chzhoo
- cjx-zar @cjx-zar
- Daejun Kim @djk1027
- Daniil Kashapov @dvkashapov
- Deepak Nandihalli @deepakrn
- dgershko @dgershko
- Dhruv Chauhan (chdh) @dhruv2x
- Dietrich Daroch @Dietr1ch
- Dragos Andriciuc @Andriciuc
- eifrah-aws @eifrah-aws
- FAN PEI @fanpei91
- Feng Ruohang @Vonng
- Gavin D'Mello @GavinDmello
- gluxier @gluxier
- Hanxi Zhang @hanxizh9910
- Harkrishn Patro @hpatro
- Harry Lin @harrylin98
- hieu2102 @hieu2102
- Jacob Murphy @murphyjacob4
- Jeff Duffy @jaduffy
- Jim Brunner @JimB123
- jjuleslasarte @jjuleslasarte
- Joe Heyburn @jdheyburn
- Joseph Heck @heckj
- Josh Soref @jsoref
- Jun Yeong Kim @junyeong0619
- justinfung @justinfung
- jzy1688 @jzy1688
- KarthikSubbarao @KarthikSubbarao
- KimHuiSu @Tarte12
- Kristiyan Ivanov @KIvanow
- lcxn123 @lcxn123
- lovelypiska @chx9
- Lucas Yang @lucasyonge
- Luke Palmer @lukepalmer
- Madelyn Olson @madolson
- martinrvisser @martinrvisser
- Md Aakib Alam Ansari @0xAakibAlam
- michellee-10 @michellee-10
- nanyan @nanyan0312
- Nick Iaquinto @nickiaq
- Nikhil Manglore @Nikhil-Manglore
- nitaicaro @nitaicaro
- Ping Xie @PingXie
- pkhartsk @pkhartsk
- Quanye Yang @quanyeyang
- Raghav Muddur @nmvk
- Rain Valentine @rainsupreme
- Ran Shidlansik @ranshid
- Recoordinate @latent-9
- Ricardo Dias @rjd15372
- Rick Ramsay @rickrams
- Roshan Khatri @roshkhatri
- Sakshi Yadav @ydsakshi
- sananes @yaronsananes
- Sarthak Aggarwal @sarthakaggarwal97
- Satheesha CH Gowda @satheeshaGowda
- Saurabh K @smkher
- secwall @secwall
- Shun Takahashi @moko-poi
- Smail KOURTA @skourta
- Sourav Singh Rawat @frostzt
- Stav Ben Shahar @stavBenShahar
- Stefan Wang @1fanwang
- sunliqiang @Pyolar
- sushil paneru @sushilpaneru1
- Taeknology @Taeknology
- Tjaden Hess @tjade273
- tomhanks @xiejing-dev
- Tristan Su @foobar
- Vadym Khoptynets @poiuj
- Vaibhav Gupta @webbsssss
- Vasiliy Koshkin @melancholictheory
- Vasily Nemtsov @nemtsv
- Viktor Söderqvist @zuiderkwast
- VoletiRam @VoletiRam
- Yair Gottdenker @yairgott
- Yana Molodetsky @yanamolo
- Yang Zhao @yang-z-o
- Yash Jadhav @lightsigma96
- youngmore1024 @youngmore1024
- yulazariy @yulazariy
- zackcam @zackcam
- zhenwei pi @pizhenwei
- Zhijun Liao @zhijun42
- 皇心 @royenheart