Highlights
Added WAIT — Blocks after a write until N replicas acknowledge (or timeout), returning the ack count. Enables synchronous-style replication for stronger durability and consistency in Kvrocks.
Added T-Digest — Probabilistic data type for fast, memory-efficient approximate percentiles on streams and large datasets. Ideal for latency histograms, telemetry, and anomaly detection. See supported commands.
Lua scripting: strict key-access mode — Enforces access only to keys declared via EVAL/FCALL. In this mode the global lock is removed, delivering much higher concurrency and throughput. Recommended for workloads that heavily use Lua scripts.
Dep Updates — RocksDB is upgraded to version 10.6.2 in this release.
Other notable updates — Added RISC-V support; significant replication performance/stability improvements; and Search enhancements, including a compaction filter and skipping expired keys during queries.
New features
- feat(replication): implement WAIT without timeout support by @zhixinwen in #3047
- feat(tdigest): add
TDIGEST.MERGEcommand implementation by @LindaSummer in #3054 - feat(replication): make replication delay configurable by @zhixinwen in #3087
- feat(namespace): add a subcommand to show the current ns name by @PragmaTwice in #3088
- feat(replication): clean up all wait_contexts in CleanupWaitConnection by @zhixinwen in #3104
- feat(replication): replication support group sync by @zhixinwen in #3092
- feat(function): support subcommand FUNCTION FLUSH by @PragmaTwice in #3119
- feat: Add support for RISC-V architecture by @wanghan-sanechips in #3053
- feat(replication): WAIT cmd supports timeout by @zhixinwen in #3117
- feat(scripting): support strict key-accessing mode for lua scripting by @PragmaTwice in #3139
- feat(config): add RocksDB periodic compaction controls by @sryanyuan in #3170
- feat(info): expose RocksDB level file count and pending compaction bytes via info by @sryanyuan in #3181
- feat(replication): add replication-no-slowdown config by @zhixinwen in #3219
Improvements
- feat(replication): implement WAIT based on replica acks by @zhixinwen in #3061
- feat(replication): set low watermark when reading replication data by @zhixinwen in #3098
- feat(function): propagate FUNCTION FLUSH/DELETE to replicas by @PragmaTwice in #3121
- feat(Dockerfile): use a numeric UID instead of a username by @SpecLad in #3138
- feat(script): make EVAL & FCALL exclusive if lua-strict-key-accessing is disabled by @PragmaTwice in #3155
- feat(command): return all flags in COMMAND INFO by @PragmaTwice in #3160
- feat(replication): optimize wait and replication locks by @zhixinwen in #3090
- feat(search): support to skip expired keys in query by @PragmaTwice in #3086
- feat(replication): implement _getack for quick WAIT response by @zhixinwen in #3075
- feat(search): add a compaction filter for search column family by @PragmaTwice in #3084
- chore(common): refactor parse utils via std::from_chars by @PragmaTwice in #3052
- build: disable LTO in debug mode by @PragmaTwice in #3069
- chore(metadata): optimize RedisTypeNames & make timeseries an emptyable type by @PragmaTwice in #3083
- chore(function): make LUA_GC_CYCLE_PERIOD a global constant by @PragmaTwice in #3116
- chore: remove unused
autoResizeBlockAndSSTmethod and config by @jonahgao in #3136 - chore(config): enable
level_compaction_dynamic_level_bytesby default by @jonahgao in #3144 - perf(storage): eliminate unnecessary
rocksdb::DB::ListColumnFamilies()by @jonahgao in #3145 - build: fix build with Homebrew Clang on macOS by @sryanyuan in #3154
- perf(scan): optimise scan performance when scanning keys with a tag by @sryanyuan in #3156
- perf(repl): only calculate crc of fetched file when needed by @jonahgao in #3161
- refactor(storage): optimize MDel with MultiGet options by @cyningsun in #3195
- chore(cluster): check and send the migration batches when the buffer is full by @hll1213181368 in #3227
Bug fixes
- fix(config): the default log-dir should include stdout by @PragmaTwice in #3085
- fix(migration): send migration batch while full to avoid oom by @greatsharp in #3094
- fix(search): support number literal for tag fields by @zhenghaoz in #3096
- fix(key): check status returned from SETEX and PSETEX by @hll1213181368 in #3108
- fix(hscan): HSCAN support NOVALUES by @LiuQhahah in #3109
- fix(search): support escaped character in tags by @zhenghaoz in #3110
- fix(function): reset lua states from all workers in FUNCTION DELETE by @PragmaTwice in #3115
- fix(search): convert query tag to lowercase if case insensitive by @zhenghaoz in #3118
- fix(search): wrong upper bound in reverse scan for infinity by @zhenghaoz in #3124
- fix(replication): Fix Seg Fault On Signal When Replication is Enabled by @zhixinwen in #3131
- fix(scan): pattern-based SCAN iterations may skip remaining keys by @sryanyuan in #3146
- fix(namespace): set token can delete another namespace by @jonahgao in #3149
- fix(test): flaky test case in KMETADTA command by @git-hulk in #3150
- fix(repl): check the status of listing checkpoint files by @jonahgao in #3158
- fix(list): check the status of rocksdb iterator by @jonahgao in #3168
- fix(stream): XPENDING won't return the idle and deliver count when reading with id '<' by @git-hulk in #3185
- fix(ts): Disable
TS.MGET/MRANGEin cluster mode by @yezhizi in #3182 - fix(json): allow to insert at the end of the array by @git-hulk in #3186
- fix(ts): Avoid aggregating empty downstream bucket when writing to empty series by @yezhizi in #3184
- fix(ts): Ensure downstream deletion of all subsequent data from latest bucket by @yezhizi in #3183
- fix(command): RESET should be only allowed to run with admin role by @git-hulk in #3191
- fix(command): MONITOR command should redact sensitive tokens by @git-hulk in #3193
- fix(ts): Ensure required keywords in commands and correct
TS.CREATERULEsyntax by @yezhizi in #3192 - fix(server): data race when accessing the db scan info by @git-hulk in #3199
- fix(tests): flaky test cases due to the command execution order in WAIT command by @git-hulk in #3200
- fix(ts): Enhance retrieval of source and target series in compaction rule by @yezhizi in #3201
- fix(storage): data race when closing the DB by @git-hulk in #3203
- fix: gcc15 compiler warning
free-nonheap-objectincmd_search.ccby @LindaSummer in #3172 - fix(util): avoid the overload conflict of
StringJoinby @PragmaTwice in #3207 - fix(replication): send ack on ping even if no data written by @zhixinwen in #3220
- fix(config): disallow setting migrate-batch-rate-limit-mb to zero by @hll1213181368 in #3228
- fix(replication): fix stuck replication due to wrong watermark by @zhixinwen in #3243
Misc
- chore(ci): using golang-lint v2 by @aleksraiden in #3055
- chore(deps): bump cpptrace to v1.0.3 by @aleksraiden in #3056
- test: re-enable skipped TLS replica cases by @PragmaTwice in #3068
- chore(ci): bump golangci-lint to 2.3.0 by @aleksraiden in #3071
- chore(ci): bump crate-ci/typos to 1.35.1 by @aleksraiden in #3102
- chore(ci): bump golangci-lint to 2.4.0 by @aleksraiden in #3114
- chore(README): add RISC-V to supported platforms by @PragmaTwice in #3127
- chore(.asf.yaml): make 2.13 a protected branches by @PragmaTwice in #3129
- chore(.asf.yaml): enable auto merge and disable wiki by @PragmaTwice in #3137
- chore(deps): bump jsoncons 1.4.0 by @aleksraiden in #3152
- chore(ci): bump golang-ci to 2.5.0 by @aleksraiden in #3198
- chore(test): Update go test deps by @aleksraiden in #3196
- chore(ci): bump crate-ci/typos to v1.37.1 by @aleksraiden in #3206
- ci: update clang-format from 14 to 18 by @PragmaTwice in #3221
- chore(deps): Bump jsoncons to v1.4.3 by @aleksraiden in #3223
- chore(deps): bump spdlog to 1.16.0 by @aleksraiden in #3225
- chore(jemalloc): change the upstream to
facebook/jemallocdue tojemalloc/jemallochas been archived by @git-hulk in #3235 - chore(deps): Bump RocksDB version to v10.6.2 by @aleksraiden in #3229
- ci: update the version of clang-tidy to 18 by @PragmaTwice in #3237
- chore(deps): Update fmt library to version 12.1.0 by @aleksraiden in #3238
- chore(deps): Update golangci to 2.6.0 by @aleksraiden in #3241
- chore(deps): Update TBB version to 2022.3.0 by @aleksraiden in #3239
New Contributors
- @zhenghaoz made their first contribution in #3096
- @hll1213181368 made their first contribution in #3108
- @LiuQhahah made their first contribution in #3109
- @wanghan-sanechips made their first contribution in #3053
- @SpecLad made their first contribution in #3138
- @cyningsun made their first contribution in #3195
Full Changelog: v2.13.0...v2.14.0-rc1