Dragonfly v1.40.0
This is one of our biggest releases yet—both in terms of feature quality, total contributions, and the highest number of external contributors in the last two years.
This release delivers major new functionality alongside a large body of correctness and stability fixes for tiered storage, replication, pub/sub, and the experimental V2 I/O loop.
We added a new data type: Cuckoo Filters (CF.RESERVE, CF.ADD/ADDNX, CF.EXISTS/MEXISTS, CF.INSERT/INSERTNX, CF.INFO/COUNT/DEL/COMPACT, and RDB persistence). This brings Dragonfly to parity with RedisBloom's probabilistic structures alongside expanded Bloom filter (BF.INFO) and HyperLogLog support.
Vector search gains native-width storage across all vector dtypes, EPSILON-tuned HNSW range queries, and EF_RUNTIME control. Meanwhile, a long list of fixes hardens tiered-storage interactions with strings, hashes, lists, bitops, and HLL commands, in addition to several replication-consistency fixes around lazy TTL expiry. Performance work includes lazy lock-table registration, zero-copy GET, and replica-side command batching.
- New Cuckoo Filter data type with full command set and RDB support.
- Vector search now stores/computes at native declared width, plus EPSILON and EF_RUNTIME tuning for HNSW.
- Numerous tiered-storage and replication consistency fixes (HLL, hashes, lists, bitops, hash-field TTL expiry).
Highlights
- Added a full Cuckoo Filter data type with RDB persistence, bringing RedisBloom parity for probabilistic structures (#7646, #7700).
- Vector search now stores/computes vectors at native declared width instead of always widening to FLOAT32, reducing memory usage (#7849).
- Re-synced hyperloglog.c with upstream Valkey, fixing CVE-2025-32023 and adding AVX2/NEON kernels [up to ~29x speedup on dense HLL merges] (#7961).
Commands
- INFO now includes TLS certificate metadata (subject, issuer, validity dates) when TLS is enabled (#7844).
- SAVE and BGSAVE now support a HELP subcommand (#7865).
- JSON.STRAPPEND now supports an optional path argument, defaulting to root (#7868).
- Implemented the RESET command, resetting a connection to a fresh-connection baseline (#7760).
- Added Redis-compatible WAIT command, blocking until replicas acknowledge writes (#7454).
- Added HGETEX and HPEXPIRETIME hash commands (#7717).
- Added BF.INFO for Bloom filter metadata (#7761).
- Added BM25STD.NORM and BM25STD.TANH scorers for FT.SEARCH/AGGREGATE/HYBRID (#7692).
Vector Search
- Vector search (FLAT and HNSW) now stores and computes distances at native declared width (INT8, UINT8, FLOAT16, BFLOAT16, FLOAT32, FLOAT64) (#7849).
- Added EPSILON parameter for HNSW-backed VECTOR_RANGE queries to control overscan/recall near the radius boundary (#7718).
- Added support for KNN query attribute block syntax (
=>{$EF_RUNTIME: ...; $YIELD_DISTANCE_AS: ...}) (#7708). - Fixed filtered KNN vector search to serialize only actual winners instead of every pre-filter match, cutting CPU/memory overhead (#7670).
Cuckoo Filter
- Added CF.INSERT and CF.INSERTNX for bulk insertion, with optional CAPACITY and NOCREATE (#7719).
- Added compaction: CF.DEL auto-compacts past 10% deletions, plus a manual CF.COMPACT command (#7702).
- Added CF.EXISTS and CF.MEXISTS for single/multi-item membership checks (#7682).
- Added CF.ADD and CF.ADDNX, auto-creating filters with a default capacity of 1024 (#7681).
Probabilistic Data Structures
- Added RDB serialization support for Cuckoo filters, enabling DUMP/RESTORE and persistence (#7700).
- Added CF.INFO, CF.COUNT, and CF.DEL for filter metadata, occurrence counts, and item removal (#7691).
- Added the base Cuckoo Filter data type via CF.RESERVE, with a new CUCKOO_FILTER ACL category (#7646).
Performance
- Extended parse-in-proactor pipelining optimization to more fiber park spots (shard hops, suspended replies on tiered I/O) (#7916).
- Added
snapshot_egress_limit_bytesto throttle per-shard socket egress during RDB/snapshot saves (#7774). - Reworked open-addressing hash container (OAHPair/OAHEntry) with compact variable-width size encoding, reducing fragmentation (#7853).
- Enabled event-driven V2 IO loop for TLS connections (#7890).
- Lists loaded from RDB/replication now benefit from ZSTD dictionary compression on load, not just push (#7734).
- Replica-side Redis replication stream processing now batches commands via DispatchSquashedBatch (#7501).
- Added
write_connection_throttling_sleep_usecto throttle pipelined write batches, plus new batch I/O metrics (#7750). - [Total sampled CPU cycles dropped from 64.34B to 59.31B (-7.8%)] Prefetches command contexts before executing squashed pipelined commands (#7796).
- Optimistic single-shard inline transactions now skip lock-table registration in the common case (#7788).
- [+9.2% ops/s at pipeline=1, +5.0% at pipeline=10] V2 connection I/O loop drains pending socket data directly from RegisterOnRecv while suspended (#7608).
- GET now returns large raw strings (≥16KB) via zero-copy borrowed view instead of copying (#7426).
- Added connection_memory_bytes Prometheus metric tracking active client connection memory (#7550).
- Wired pipeline squashing into the V2 event-driven dispatch loop via --enable_pipeline_squashing_v2 (#7631).
Replication
- Fixed cascading replication correctness when an intermediate replica switches upstream masters under experimental cascaded partial sync (#7913).
- Enabled tagged chunk serialization by default during snapshotting and replication (#7823).
- RDB loader no longer aborts on EOF with a partially received tagged chunk; now logs a warning and continues (#7660).
- Fixed a crash where an older replica reconnecting to a promoted master could crash the master due to a stale partial-sync index (#7491).
- Added a Prometheus metric for replication backlog buffer memory usage (#7644).
Search
- Applied TEXT field schema weights and query-time $weight attributes to BM25/TF-IDF scoring (#7752).
- Added parsing support for query-time
=>{$WEIGHT}attributes on terms, tag filters, and vector range queries (#7749). - Added EF_RUNTIME support for HNSW vector search, actually applying it instead of just parsing it (#7696).
- Fixed FT.SEARCH quoted TAG values not matching stored values containing backslashes or quotes (#7907).
- Fixed a race in RestoreStreamer where concurrent Cancel()/Start() could double-unregister a change listener (#7707).
- Fixed KNN vector search score aliases to properly generate/return implicit score fields (#7604).
- Fixed FT.SEARCH to return VECTOR fields as raw stored binary buffer instead of textual representation for HASH-stored fields (#7586).
Cluster
- DFLYCLUSTER SLOT-MIGRATION-STATUS now includes covered slot ranges in its reply (#7911).
- Fixed a race between Finish() teardown and SyncFb retry loop in slot migration (#7869).
- Fixed OOM during incoming slot migration not propagating rollback deletion to the target's replica (#7533).
- Added predefined Helm chart values for enabling Redis-compatible cluster mode (#7123).
Security
- Fixed ACL DRYRUN gaps: multi-word commands, pub/sub channel checks, and content-dependent key positions (#7919).
- Fixed ACL DRYRUN to support command arguments for accurate key-pattern permission validation (#7871).
Cloud & Storage
- Fixed Azure snapshot storage to accept standard Azure Blob HTTPS URLs instead of custom az:// scheme (#7878).
- Added
list_tiering_prefetch_depthto asynchronously prefetch neighboring offloaded list nodes (#7834). - Made tiered storage initial backing file size configurable via
tiering_disk_storage_initial_size, with 5%-of-capacity growth policy (#7715). - Tiered storage now skips offloading keys with remaining TTL below a configurable minimum (
tiered_min_ttl_to_offload_ms) (#7624).
Bug fixes
- Fixed per-slot memory_bytes accounting in cluster mode to correctly track resident RAM across tiered storage operations (#7966).
- Fixed a read-buffer capacity accounting bug causing client_read_buffer_bytes to leak or double-count (#7951).
- Fixed two crash/corruption bugs in cluster mode slot operations (FlushSlots and GetSlotStats) and enforced strict db0-only usage (#7960).
- Fixed blocked XREAD/XREADGROUP being incorrectly woken by lower XADD ids, and a null-pointer crash on plain XREAD (#7959).
- Fixed blocking XREAD/XREADGROUP on emptied streams returning immediately instead of waiting (#7958).
- Fixed memory usage reporting for small string keys with TTL to report actual mimalloc block size (#7947).
- Fixed replication divergence with HEXPIRE, HGETEX, HSETEX, and FIELDEXPIRE on lazily expired fields (#7948).
- Fixed a crash when Lua scripts call GET on large string values via borrowed replies (#7934).
- Fixed a replication bug where SHRINK's bucket compaction could leave a deleted key alive forever on a replica (#7938).
- Fixed a cross-thread data race in command squashing accessing a shared reply builder concurrently (#7927).
- Fixed EPERM handling in the io_uring support check, falling back to epoll (#7810).
- Fixed slow Pub/Sub subscribers not being evicted based on per-connection queued-data threshold (#7917).
- Fixed a regression where UNSUBSCRIBE could jump ahead of queued pub/sub messages (#7909).
- Fixed the V2 dispatch queue loop not setting async_op_start_cycle_, hiding timed-out async operations (#7902).
- Dragonfly now force-closes blocked Pub/Sub subscribers exceeding a configurable soft memory limit (#7889).
- Fixed a bug where a dropped checkpoint message leaked the DispatchTracker counter, hanging REPLTAKEOVER/CLIENT PAUSE/shutdown (#7862).
- Fixed a race condition in REPLTAKEOVER where master-check and replica pointer check weren't atomic (#7870).
- Fixed a use-after-free bug garbling long strings (stream IDs, sortkeys, scan cursors) sent by reference (#7874).
- Fixed a bug where a blocked XREAD/XREADGROUP with COUNT ignored the COUNT limit on wake-up (#7872).
- RDB loading now skips keys with unsupported module types instead of aborting the whole load (#7912).
- Fixed a bug causing Dragonfly to SIGABRT on invalid startup flags instead of exiting cleanly (#7843).
- Fixed crashes/incorrect behavior when commands accessed offloaded string values (DEBUG OBJECT, INCRBYFLOAT, memcached APPEND/PREPEND, JSON.GET) (#7836).
- Fixed a race where heartbeat expiry/eviction could run while an optimistic transaction was suspended (#7826).
- Fixed crashes in HLL commands when values were offloaded to tiered storage, plus a pipeline-squashing race corrupting results (#7820).
- Fixed a race in the V2 (io_uring) connection loop allowing CLIENT PAUSE/takeover/migration/shutdown to proceed early (#7805).
- Fixed bitops commands (GETBIT, SETBIT, BITCOUNT, BITPOS, BITOP, BITFIELD) crashing on tiered string values (#7806).
- Fixed a bug where stopping MONITOR mode didn't decrement the subscriptions counter (#7777).
- Fixed the V2 IoLoopV2 path not tracking in-flight command dispatches, breaking CLIENT PAUSE/takeover/migration (#7764).
- Fixed buffered replies remaining undelivered when a subsequent pipelined command blocked in the V2 path (#7733).
- Fixed missing bookkeeping (command counters, idle timestamp) in the V2 connection batch dispatch path (#7726).
- Fixed a bug where a bare GETEX (no expiry options) was incorrectly replicated (#7701).
- Fixed a stats bug where io_uring multishot recv failed to update read counters (#7680).
- Fixed dragonfly_commands_processed_total always reporting 0 (#7667).
- Fixed a crash in Lua scripting when redis.call() received a non-string/number command name (#7655).
- Fixed a QList bug where inserting before the first element of a full head node misplaced the element (#7640).
- Fixed tiered list bugs: node deletion promoting offloaded nodes without materializing (#7638), stale entry pointers after restore (#7636).
- Fixed a bug where MOVEing a key between databases left stale search index and memory-usage entries (#7637).
- Fixed a replication bug where an older replica reconnecting to a promoted master could crash it (#7491).
- Fixed a crash when admin control commands appeared inside a squashed pipeline (#7621).
- Fixed a parsing bug where malformed RESP was silently treated as needing more input instead of a protocol error (#7615).
- Restored the experimental_io_loop_v2 flag after accidental removal (#7607).
- Fixed keyspace-notification delivery running inside a fiber-atomic section during heartbeat expiry (#7540).
- Re-enabled fiber yielding during long-running container iteration commands (#7449).
- Fixed BITFIELD, BITOP, and SETBIT accepting out-of-range bit offsets, risking overflow/crashes (#7513).
Huge thanks to all the contributors! ❤️
New Contributors
- @VedantMadane made their first contribution in #7123
- @github-actions[bot] made their first contribution in #7553
- @FarmerChillax made their first contribution in #7614
- @VincentNguyenDuc made their first contribution in #7777
- @kant2002 made their first contribution in #7809
- @magic-peach made their first contribution in #7830
- @jacovdbergh made their first contribution in #7872
- @danfeideliaoji made their first contribution in #7868
- @abhiramkaushik made their first contribution in #7870
- @alexluong made their first contribution in #7907
- @akhilp19 made their first contribution in #7844
What's Changed
- chore: reproduce inline schedule during replication and save by @kostasrim in #7508
- chore(server): Collapse BucketSet variant, cleanups by @dranikpg in #7487
- bump: update helio submodule by @vyavdoshenko in #7532
- chore: disable failing tests by @kostasrim in #7541
- feat: use more SIMD ops in OAHSet by @BorysTheDev in #7537
- fix: build with WITH_COLLECTION_CMDS=OFF by @BorysTheDev in #7539
- fix: oom on incoming slot migration does not clean the replica by @kostasrim in #7533
- perf: zero-copy GET for large strings with CoW by @romange in #7426
- fix: bound bitmap bit offsets and deny BITFIELD/BITOP under memory pressure by @vyavdoshenko in #7513
- fix(regtets): Increase test_big_huge_streaming_restart timeout by @dranikpg in #7547
- feat(helm): add cluster mode values for Dragonfly chart by @VedantMadane in #7123
- chore(deps): bump codecov/codecov-action from 6 to 7 in the actions group by @dependabot[bot] in #7544
- chore: retire v1 and experimental_replicaof_v2 flag by @kostasrim in #7542
- chore(server): Unify SerializeEntry calls in SerializerBase by @dranikpg in #7468
- chore: update pubsub stress test and release notes generator by @romange in #7527
- fix(tiering): Don't overstaturate when Offloading not requried by @dranikpg in #7531
- CI: align release_helm_and_notify Go toolchain with go.work by @romange with @Copilot in #7552
- chore: remove DispatchMC by inlining MC logic into DispatchCommand by @romange in #7551
- perf(tx): track running transactions per-shard and enable inline scheduling during replication by @romange in #7459
- test: re-enable test_reply_count for V1 by @glevkovich in #7561
- fix(search): accept FT.AGGREGATE LOAD after SCORER/ADDSCORES by @vyavdoshenko in #7557
- fix(search): drop stopwords from query terms in FT.SEARCH by @vyavdoshenko in #7558
- chore(helm-chart): update to v1.39.0 by @github-actions[bot] in #7553
- chore: add check-ast and pyflakes pre-commit hooks by @vyavdoshenko in #7554
- fix(search): support parenthesized and filtered VECTOR_RANGE queries by @vyavdoshenko in #7534
- fix: prevent integer overflow in max_busy_read_cycles_cached by @romange in #7562
- chore: make CmdArgParser work directly with BackedArguments by @romange in #7565
- feat(facade): extend ok_main with sharded SET/GET and async dispatch by @romange in #7545
- server: Simplify Flush - PrepareFlush interaction by @abhijat in #7548
- chore: debug help for compact-table by @kostasrim in #7568
- tests: Add a test which fails if RSS goes beyond used_mem by @abhijat in #7535
- chore(core): Re-enable container iterations yielding by @mkaruza in #7449
- chore: pass CmdArgParser to async command handlers via SetAsyncHandler by @romange in #7567
- fix: keyspace notifcations suspend heartbeat in atomic section by @kostasrim in #7540
- chore: retire --rename_command and --oom_deny_commands flags by @romange in #7569
- chore: Add python tests for concurrent QList node materialization by @mkaruza in #7417
- fix(search): reply to FT.INFO with a flat array under RESP3 by @vyavdoshenko in #7576
- chore: use BackedArguments in DEBUG POPULATE by @romange in #7571
- chore: Enable test_cluster_migration_with_tiering and relax parameters by @mkaruza in #7573
- chore(server): use CycleClock for latency and move OOM check into ServerState by @romange in #7577
- fix: eliminate false sharing in RecordLatency and fix data race in ok_main by @romange in #7581
- chore: introduce CmdRef and generator-based MultiCommandSquasher by @romange in #7564
- chore: reduce log level by @BorysTheDev in #7583
- Add pipeline-reply plumbing to MultiCommandSquasher by @romange in #7587
- fix(tiering): Avoid defrag spikes + fix negative memory budget bug by @dranikpg in #7543
- chore: retire squash_stats_latency_lower_limit and simplify dispatch stats by @romange in #7592
- Squash V1 pipelines via DispatchSquashedBatch by @romange in #7588
- feat(facade): route ok_backend SET/GET through per-shard FiberQueue by @romange in #7594
- Remove dead DispatchManyCommands by @romange in #7589
- refactor: reduce threads contention for INFO cmd by @BorysTheDev in #7523
- fix(search): return stored VECTOR fields verbatim in FT.SEARCH by @vyavdoshenko in #7586
- feat(server): No-op mutex when tagged chunks are enabled by @dranikpg in #7463
- doc(serialization): sync shard-serialization.md with current code by @romange in #7600
- fix(facade): retire experimental_io_loop_v2 flag by @glevkovich in #7607
- fix(tests): tiering tests fixes by @dranikpg in #7574
- refactor(server): record last-command stats at top-level dispatch by @romange in #7599
- dfly_bench: Resolve MOVED response with DNS names by @abhijat in #7613
- docs: update Grafana dashboard links by @FarmerChillax in #7614
- fix(facade): propagate parse status from batch parsers by @romange in #7615
- Consolidate CommandId derived attributes into a kind_mask bitmask by @romange in #7591
- refactor(facade): extract IoLoopV2 helpers to cut duplication by @romange in #7617
- feat(facade): squash V1 pipelines and support io_uring provided buffers in ok_backend demo by @romange in #7610
- fix(server): exclude admin commands from pipeline squashing by @romange in #7621
- refactor(facade): extract IoLoopV2 phases into per-concern methods by @romange in #7623
- fix: Persist search index options across restore and full sync by @vyavdoshenko in #7620
- stop test_big_huge_streaming_restart test by @dranikpg in #7627
- perf(facade): Drain socket in recv callback by @glevkovich in #7608
- feat(server): Concurrent squashing by @dranikpg in #7597
- fix(test): Make container yield check atomic in ConcurrentWritesDuringContainerYield by @mkaruza in #7609
- fix: KNN score aliases in FT.SEARCH and FT.AGGREGATE by @vyavdoshenko in #7604
- feat(ok_backend): accept bind and dbfilename flags by @glevkovich in #7629
- Track dispatch_waiting_count_ and rename ok_backend metrics by @romange in #7625
- fix(replication): reset partial sync index if dfly flow is received by @kostasrim in #7491
- server: Adds metric for connection memory bytes by @abhijat in #7550
- refactor(facade): extract ok_main squasher into EmitBlockingBatch by @romange in #7633
- test(fuzz): Add experimental persistent AFL++ nightly fuzzing by @vyavdoshenko in #7593
- fix: stale search index entries after MOVE by @vyavdoshenko in #7637
- fix(tiering): Fix QList node cleanup after clearing offloaded state by @mkaruza in #7636
- fix(tiering): Keep tiered list endpoints materialized by @mkaruza in #7638
- fix(list_family): Fix QList insert-before at head by @mkaruza in #7640
- fix: experimental fuzz workflow validation and run title by @vyavdoshenko in #7641
- Extend dfly_bench JSON output by @romange in #7643
- Add repl backlog memory metric by @romange in #7644
- feat: add /benchmark Claude Code skill by @romange in #7642
- feat: cuckoo filter data structutre by @kostasrim in #7619
- build: Make the release artifacts use GLOG instead of absl by @abhijat in #7596
- chore(facade): remove no-op io_event_ notifies in ioloop v2 by @glevkovich in #7635
- feat(server): Omittable DEL operation by @dranikpg in #7496
- Coroutine batch squasher for ok_main V2 dispatch by @romange in #7602
- fix: bound CMS dimensions to prevent heap overflow on INITBYDIM/INITBYPROB by @vyavdoshenko in #7647
- chore: pass BackedArguments through Lua redis.call path by @romange in #7572
- fix: validate Lua redis.call command name argument by @romange in #7655
- chore: migrate generic functions to use ParsedArgs by @romange in #7654
- Back Transaction::full_args_ with facade::ParsedArgs by @romange in #7656
- feat(facade): wire V2 dispatch loop into pipeline squashing by @romange in #7631
- refactor(facade): extract IoLoopV2 data-path into drain/parse helpers by @romange in #7618
- chore: migrate more families to tail_args() by @romange in #7657
- chore: add cuckoo to compact object by @kostasrim in #7645
- Migrate command init and dispatch paths to facade::ParsedArgs by @romange in #7664
- refactor(server): move VerifyCommandState out of squasher, migrate dispatch path to ParsedArgs by @romange in #7663
- chore(server): pass CmdArgParser to bitops/json handlers by @romange in #7662
- fix(ok_backend): track command_cnt_main in dispatch by @glevkovich in #7667
- Migrate more command handlers to CmdArgParser by @romange in #7665
- Migrate command handlers to CmdArgParser by @romange in #7659
- chore(server): migrate geo_family handlers to CmdArgParser by @romange in #7673
- fix(facade): count multishot recv in io read stats by @glevkovich in #7680
- chore(server): migrate DflyCmd/ScriptMgr/MemoryCmd handlers to CmdArgParser by @romange in #7669
- fix(search): serialize only KNN winners for filtered vector search by @vyavdoshenko in #7670
- chore(server): migrate cms/bloom families and remaining string handlers to CmdArgParser by @romange in #7672
- feat(tiering): Skip offloading keys with TTL below minimum threshold by @mkaruza in #7624
- fix(fuzz): enforce real pass/fail gates in experimental persistent workflow by @vyavdoshenko in #7687
- feat: add cuckoo_family.cc and cf.reserve by @kostasrim in #7646
- Migrate list family handlers to CmdArgParser by @romange in #7685
- refactor(facade): extract V2 OnRecv hook method by @glevkovich in #7689
- chore: add cf.add and cf.addnx by @kostasrim in #7681
- CI: generate and upload junit artifacts by @abhijat in #7683
- CI: package experimental AFL++ artifacts as tarballs to fix uploads by @vyavdoshenko in #7697
- chore: add cf.exists and cf.mexists by @kostasrim in #7682
- Migrate hset family handlers to CmdArgParser by @romange in #7686
- chore: Bring in rapidhash by @romange in #7694
- chore: add cf.info, cf.count and cf.del by @kostasrim in #7691
- fix: GETEX command replication by @BorysTheDev in #7701
- refactor(server): factor out metrics code into metrics.{h,cc} by @romange in #7695
- Add benchmark-report skill by @romange in #7706
- feat(search): support EF_RUNTIME for HNSW vector search by @vyavdoshenko in #7696
- Fix memtier latency plot for zero-count operations by @romange in #7704
- feat: Add BM25STD.NORM and BM25STD.TANH scorers by @vyavdoshenko in #7692
- feat(search): support KNN query attributes by @vyavdoshenko in #7708
- tests: Stop seeder before checking replica finished by @abhijat in #7714
- tests: ensure that proxy chooses random port and closes on teardown by @abhijat in #7699
- chore(tiering): Make disk storage initial size configurable and add grow policy by @mkaruza in #7715
- chore(server): migrate zset_family handlers to CmdArgParser by @romange in #7712
- fix: XREADGROUP key extraction for STREAMS consumer name by @vyavdoshenko in #7721
- Migrate set family handlers to CmdArgParser by @romange in #7684
- fix: stale AFL crash warnings in persistent fuzz health report by @vyavdoshenko in #7723
- fix(facade): bookkeeping in V2 connection. by @glevkovich in #7726
- Link memtier latency time axes by @romange in #7727
- chore: cuckoo rdb support by @kostasrim in #7700
- chore(server): migrate zset_family handlers to CmdArgParser by @romange in #7709
- feat: add HGETEX and HPEXPIRETIME by @BorysTheDev in #7717
- chore(server): migrate main_service handlers to CmdArgParser by @romange in #7724
- chore(server): migrate server_family handlers to CmdArgParser by @romange in #7711
- chore: add compaction on cf.del and add cf.compact cmd by @kostasrim in #7702
- chore(server): migrate stream_family handlers to CmdArgParser by @romange in #7710
- feat: add range processing to CmdArgParser by @BorysTheDev in #7732
- fix: SINTERCARD crash with zero keys by @vyavdoshenko in #7736
- feat(rdb): learn zstd dict and compress lists during load by @romange in #7734
- feat(facade): add parse-ahead and parse-in-proactor for IoLoopV2 by @glevkovich in #7722
- chore: add cf.insert and cf.insertnx by @kostasrim in #7719
- chore(server): migrate Eval/EvalSha handlers to CmdArgParser by @romange in #7725
- facade: add connection id to all connection logs by @glevkovich in #7742
- feat(search): support EPSILON for HNSW vector range search by @vyavdoshenko in #7718
- chore(server): migrate search_family handlers to CmdArgParser by @romange in #7741
- fix: Instantiate SendLongArr for long long by @vyavdoshenko in #7745
- feat(search): parse query-time =>{$weight} attributes by @vyavdoshenko in #7749
- fix: race condition in restore streamer by @BorysTheDev in #7707
- chore: CF and sbf/cms/topk dict entries for fuzzer by @kostasrim in #7731
- refactor: improve INFO performance by @BorysTheDev in #7746
- refactor: extract QList move helper and ZSTD dict predicates by @romange in #7755
- test: enable V2 in test_reply_count, tighten pipe_limit by @glevkovich in #7744
- fix(cms): avoid vector allocation in ParseMergeArgs and update helio by @kostasrim in #7743
- chore: cf chunked serialization and seeder support by @kostasrim in #7729
- feat: Add ReplyScope to SquashPipeline by @dranikpg in #7630
- Fix quadratic zstd list load compression by @romange in #7753
- feat(search): apply schema and query-time text weights to scoring by @vyavdoshenko in #7752
- fix: flaky FT.PROFILE timing assertion by @vyavdoshenko in #7757
- refactor: better CmdArgParserUsage by @BorysTheDev in #7758
- fix(facade): flush buffered replies before blocking in V2 pipeline by @glevkovich in #7733
- server: Tagged chunk single buffer design, reduce copies by @abhijat in #7658
- chore(server): bridge acl/cluster handlers to CmdArgParser dispatch by @romange in #7751
- Add list compression tuning flags by @romange in #7762
- fix(facade): revert 07850ce, track in-flight dispatches in IoLoopV2 by @glevkovich in #7764
- refactor(server): pass ParsedArgs through command dispatch by @romange in #7763
- Add pipeline latency panel to Grafana dashboard by @romange in #7765
- Adds
enable_resp_io_loop_v2as a matrix dimension to the regression tests by @glevkovich in #7748 - change test_squashed_reply_count limit by @dranikpg in #7770
- fix(facede): Include VerbatimString in reply capture by @dranikpg in #7772
- fix(transaction): Fix polling after running_tx conflict by @dranikpg in #7754
- chore(fuzz): default PR seed generation to OpenAI gpt-4.1 by @vyavdoshenko in #7775
- feat: add more rules for parsing by @BorysTheDev in #7767
- refactor: OAHSet - split OAHEntry on 3 classes by @BorysTheDev in #7716
- fix(facade): Fix reply builder batching by @dranikpg in #7778
- fix(facade): Use ReplyScope in loop2 by @dranikpg in #7779
- fix(server): decrement subscriptions on MONITOR teardown by @VincentNguyenDuc in #7777
- refactor: improve CmdArgParser usage by @BorysTheDev in #7785
- Optimize pipelined single-key command hot path by @romange in #7783
- chore(server): Write chunked tag header in place by @abhijat in #7661
- chore: add bf.info by @kostasrim in #7761
- fix(server): add squasher-local transaction role by @romange in #7784
- chore: missing v2 seeder data types by @kostasrim in #7730
- feat: Inline buffer for captured replies by @dranikpg in #7648
- perf(server): Lazy locking for optimistic single-shard transactions by @romange in #7788
- perf: prefetch squashed command contexts by @romange in #7796
- test: more benchmarks for Set by @BorysTheDev in #7798
- feat:extend CmdArgParser functionality by @BorysTheDev in #7799
- fix: bitops on tiered string values by @vyavdoshenko in #7806
- Default DEBUG TRAFFIC START to main listener by @romange in #7808
- feat: Write connection throttling and metrics exposed by @mkaruza in #7750
- Include Windows setup instructions in README by @kant2002 in #7809
- fix: macOS build by @vyavdoshenko in #7811
- feat(replica): Batch Redis stream commands by @mkaruza in #7501
- fix(server): MGET don't acess tx after running by @dranikpg in #7819
- server: Skip error on load EOF with pending tagged chunk state by @abhijat in #7660
- refactor: use ADL for CmdArgParser by @BorysTheDev in #7813
- feat: do more SIMD in OAHSet by @BorysTheDev in #7804
- test(replication): disable noisy test_bug_5221 by @glevkovich in #7821
- fix(facade): track in-flight V2 async commands by @glevkovich in #7805
- test: skip V2-only pause tests under V1 by @glevkovich in #7822
- server: Enable tagged chunk serialization by @abhijat in #7823
- Revert "refactor: use ADL for CmdArgParser (#7813)" by @romange in #7825
- fix: tiered-storage crashes in HLL commands under pipeline squashing by @vyavdoshenko in #7820
- perf: shrink squash callback and avoid regex stack overflow by @romange in #7807
- fix: skip heartbeat expiry/eviction while optimistic tx is suspended by @kostasrim in #7826
- chore: add WAIT command by @kostasrim in #7454
- fix: fix mgetparallel flaky test by @dranikpg in #7824
- test: Disable flaky tiered storage MGETParallel test by @vyavdoshenko in #7837
- fix: correct typos in code comments by @magic-peach in #7830
- docs: fix typo and formatting in docs by @magic-peach in #7829
- fix: fix typo 'Fore more' -> 'For more' in docker README by @magic-peach in #7831
- fix: fix typo 'recieved' -> 'received' in replica comment by @magic-peach in #7832
- feat: add OAHMap by @BorysTheDev in #7828
- test(snapshot): temporarily disable test_s3_snapshot by @glevkovich in #7841
- fix: tiered-storage crash when commands read an offloaded string value by @vyavdoshenko in #7836
- feat(search): add vector data-type foundation (types, kernels, validation) by @vyavdoshenko in #7839
- fix(server): validate startup flags in main() by @glevkovich in #7843
- feat: new format for OAHEntry size by @BorysTheDev in #7847
- feat: compile-time grammar for CmdArgParser by @BorysTheDev in #7845
- chore: pull helio to fix epoll livelock issue by @romange in #7850
- chore: enable test_bug_5221 by @kostasrim in #7852
- ci: bump test-fakeredis image to ubuntu-dev:24 by @vyavdoshenko in #7856
- feat(search): store & search vectors at native width (FLAT + HNSW, all dtypes) by @vyavdoshenko in #7849
- chore: enforce fuzzer coverage for newly registered commands by @kostasrim in #7827
- fix(core): Fix segment dangle by @dranikpg in #7851
- feat(tiering): Prefetch neighboring tiered list nodes on load by @mkaruza in #7834
- build: add memory tracking flag to release makefile by @romange in #7861
- Make cluster announce flags mutable by @romange in #7860
- build(cmake): add retry to third-party tarball downloads, bump helio by @glevkovich in #7855
- test(search): cover non-float32 vector dtypes (reload, replication, e2e, FT.INFO) by @vyavdoshenko in #7858
- feat(search): support per-term inside field groups by @vyavdoshenko in #7859
- refactor(facade): rename ClearPipelinedMessages by @glevkovich in #7864
- feat: add new size format for OAHPair by @BorysTheDev in #7853
- feat(server): Egress throttling for snapshot by @dranikpg in #7774
- fix(stream): honor COUNT when a blocked XREAD/XREADGROUP is woken by @jacovdbergh in #7872
- fix(server): emit db= once in CLIENT INFO by @vyavdoshenko in #7873
- fix(migration): race between Finish and SyncFb by @kostasrim in #7869
- fix(stream): avoid use-after-free garbling long stream ids in replies by @vyavdoshenko in #7874
- feat(server): implement RESET command by @VincentNguyenDuc in #7760
- Support optional path in JSON.STRAPPEND by @danfeideliaoji in #7868
- fix(takeover): guard takeover state by @abhiramkaushik in #7870
- fix(facade): decrement dropped checkpoint bc on connection close by @glevkovich in #7862
- docs: consolidate Pub/Sub backpressure documentation by @romange in #7887
- Cleanup repltests by @dranikpg in #7884
- Add SAVE HELP output by @romange in #7865
- feat(pubsub): close stuck subscribers to avoid publisher throttling by @romange in #7889
- feat: add ASCII packing for OAH by @BorysTheDev in #7881
- chore: monitor redis_replication_test by @kostasrim in #7879
- refactor: drop runtime parser by @BorysTheDev in #7882
- CI: do not upload individual gtest files by @abhijat in #7886
- ci(builder): enable ccache in shared build action by @glevkovich in #7895
- CI: minor QOL improvements to repeat-tests by @abhijat in #7885
- Fix Azure snapshot URI account resolution by @romange in #7878
- ci(docker): drop gha cache from image builds by @glevkovich in #7898
- refactor: unify TTL limitation for different commands by @BorysTheDev in #7899
- facade: reduce pipeline preference log verbosity by @romange in #7900
- chore(server): Small updates about LSN parsing by @dranikpg in #7891
- ci(cache): delete PR Actions caches on close by @glevkovich in #7901
- test(fuzz): add tiering coverage to long AFL++ campaigns by @vyavdoshenko in #7905
- chore(tests): run upstream Valkey stream TCL suites in CI by @vyavdoshenko in #7908
- feat(server): Cascaded psync by @dranikpg in #7866
- chore(facade): Track async_op_start_cycle_ in the V2 dispatch loop by @mkaruza in #7902
- fix(facade): preserve pub/sub order on unsubscribe (v1 IO loop) by @glevkovich in #7909
- feat(tls): enable V2 io loop for TLS connections by @glevkovich in #7890
- fix(acl): support arguments in DRYRUN by @danfeideliaoji in #7871
- fix(search): unescape quoted tag values by @alexluong in #7907
- chore(search): dedup quoted/unquoted tag value unescaping by @vyavdoshenko in #7921
- fix: name idle tasks and evict stalled Pub/Sub subscribers by @romange in #7917
- feat(rdb): Skip keys with unsupported module types instead of failing by @mkaruza in #7912
- feat(server): Cascading replication: force re-sync when upstream master changes by @dranikpg in #7913
- chore: print slot ranges for DFLYCLUSTER SLOT-MIGRATION-STATUS by @kostasrim in #7911
- fix(squash): avoid mutable cross-thread access on shared reply builder by @dranikpg in #7927
- fix(rdb): enforce one-consumer-per-PEL-entry when loading stream groups by @vyavdoshenko in #7929
- Handle EPERM in io_uring support check by @kant2002 in #7810
- feat(facade): add parse-in-proactor new park spots by @glevkovich in #7916
- feat(ci): warm ccache on push, unify cache key by @glevkovich in #7924
- feat(ci): replace PR cache cleanup with Reaper by @glevkovich in #7923
- fix(rdb): validate stream listpack field counts on load to prevent OOB walk by @vyavdoshenko in #7931
- fix(hset): journal emptied-key deletion in HRANDFIELD lazy field expiry by @vyavdoshenko in #7936
- fix(hset): journal emptied-key deletion in HEXPIRE/HGETEX lazy field expiry by @vyavdoshenko in #7937
- fix(server): journal emptied-key deletion in SHRINK lazy member expiry by @vyavdoshenko in #7938
- test: make slow Pub/Sub subscriber test bounded by @dragonclaw-dragonflydb in #7939
- chore: add tcp diagnostics when streamer disconnects by @kostasrim in #7920
- Fix borrowed Lua GET replies by @romange in #7934
- refactor: small improvements with CmdArgParser by @BorysTheDev in #7944
- tests: Fix linter errors by @abhijat in #7949
- fix(helm): remove .Release.Name to resolve name collisions by @VincentNguyenDuc in #7787
- fix(server): journal partial lazy-field expiry for hash probes and FIELDEXPIRE by @vyavdoshenko in #7948
- core: Report block size as used memory for small keys with TTL by @abhijat in #7947
- feat(server): include TLS certificate info in INFO output by @akhilp19 in #7844
- docs: update README and license date by @romange in #7914
- server: Change pytest to unit test for mem. accounting by @abhijat in #7950
- ci: cache 3rd-party dependencies by @glevkovich in #7935
- build: disable AWS support by default by @romange in #7945
- fix: do not serve blocking XREAD from an emptied stream by @BorysTheDev in #7958
- fix: check the requested id when waking a blocked XREAD by @BorysTheDev in #7959
- fix(cluster): enforce db0-only in cluster mode and fix two slot-ops crashes by @vyavdoshenko in #7960
- chore: improve debug compact-table docs and return type by @kostasrim in #7952
- fix(acl): close remaining ACL DRYRUN gaps on top of #7871 by @kostasrim in #7919
- test: Disable flaky tiered list RPopStashedNodes test by @vyavdoshenko in #7962
- chore(hll): sync hyperloglog.c with valkey upstream by @romange in #7961
- fix(facade): split read buffer accounting by @glevkovich in #7951
- fix(tiered): release the disk extent when a value is overwritten in place by @vyavdoshenko in #7968
- refactor: tune OAH for memory consumption by @BorysTheDev in #7964
- fix: delete a destination of another type on an empty *STORE result by @vyavdoshenko in #7977
- fix(ci): validate dependency cache restores by @glevkovich in #7967
- fix(test): wait for read buffer cleanup by @glevkovich in #7981
- refactor(ci): extract Actions cache logic by @glevkovich in #7980
- fix(server): Make egress throttling limit global by @dranikpg in #7978
- fix(server): make per-slot memory_bytes track resident RAM by @vyavdoshenko in #7966
- fix(tiering): Defrag uses DashTable + iteration cycles by @dranikpg in #7876
- fix: avoid command latency cycle conversion overflow by @romange in #7985
- fix(tiering): Reclaim cool memory for uploads by @dranikpg in #7982
- chore: Move OAH* non-performance-critical methods to the .cc file. by @BorysTheDev in #7988
- fix(server): make per-slot underflow log compatible with legacy glog by @vyavdoshenko in #7989
Full Changelog: v1.39.0...v1.40.0