)]}'
{
  "log": [
    {
      "commit": "8d021258308790627524f2cae594c75f22be2c31",
      "tree": "50ddffea422f47ffcb64713b7bc9382af8e68504",
      "parents": [
        "2520bdac5a61b3515c7db6aff3c145e04c26b1cb"
      ],
      "author": {
        "name": "Twice",
        "email": "twice.mliu@gmail.com",
        "time": "Fri Apr 24 13:18:31 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Apr 24 13:18:31 2026 +0800"
      },
      "message": "docs(agents): clarify agent workflow guidance (#3455)\n\nThis updates AGENTS.md to make repository-specific workflows clearer so\nagents can work more reliably and efficiently.\n\nAssisted-by: Codex"
    },
    {
      "commit": "2520bdac5a61b3515c7db6aff3c145e04c26b1cb",
      "tree": "2535319a0404ec8d7f6c23e68810aef414ff7d1d",
      "parents": [
        "7c4972814fcbeee94011fc17cafc542798379a51"
      ],
      "author": {
        "name": "hulk",
        "email": "hulk.website@gmail.com",
        "time": "Wed Apr 22 10:33:35 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Apr 22 02:33:35 2026 +0000"
      },
      "message": "fix(command): APPLYBATCH should use the admin permission (#3458)\n\nThe server will apply whatever it writes in APPLYBATCH command, so we\nshould make sure it is only being sent with the admin permission.\n\nThis is a breaking change from the user side, we need to highlight this\nin the release."
    },
    {
      "commit": "7c4972814fcbeee94011fc17cafc542798379a51",
      "tree": "c411a10ee127d8e9b95e19abfd02bfa39ca005f6",
      "parents": [
        "64188fedbe891aefaa6d24c4093b40c0c3f6d82a"
      ],
      "author": {
        "name": "纪华裕",
        "email": "jihuayu123@gmail.com",
        "time": "Tue Apr 21 22:22:54 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Apr 21 14:22:54 2026 +0000"
      },
      "message": "fix(geo): make geo store commands return the resulting set size with COUNT (#3457)\n\nFix the return value of geo store commands when `COUNT` is specified.\n\nPreviously, these commands stored only the limited number of members in\nthe destination zset, but returned the full matched result count instead\nof the actual stored count.\n\nAssisted-by: Codex"
    },
    {
      "commit": "64188fedbe891aefaa6d24c4093b40c0c3f6d82a",
      "tree": "98a4cf71b9c5480524ff6b9ed68990c9de93bd2b",
      "parents": [
        "98c051cacb0f77192f8f086050bcb3f5eee2351f"
      ],
      "author": {
        "name": "Songqing Zhang",
        "email": "zhangsongqing164@163.com",
        "time": "Fri Apr 17 11:24:38 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Apr 17 03:24:38 2026 +0000"
      },
      "message": "fix(geo): delete store_key instead of user_key in SearchStore (#3456)\n\nWhen GEOSEARCHSTORE yields zero results, the code incorrectly deleted\nthe source key (user_key) instead of the destination key (store_key)."
    },
    {
      "commit": "98c051cacb0f77192f8f086050bcb3f5eee2351f",
      "tree": "4657789455738a021cccd94499e847eb57fec3ed",
      "parents": [
        "5ebde751f0e15058e9823978a02b062b3a20c115"
      ],
      "author": {
        "name": "Songqing Zhang",
        "email": "zhangsongqing164@163.com",
        "time": "Fri Apr 17 09:13:43 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Apr 17 01:13:43 2026 +0000"
      },
      "message": "fix(stream): allow group and consumer names starting with digits (#3442)\n\nRedis does not restrict group or consumer names from starting with\ndigits. The restriction was kvrocks-specific and broke compatibility."
    },
    {
      "commit": "5ebde751f0e15058e9823978a02b062b3a20c115",
      "tree": "22938c57741d65456f9faa90e1123408aefc21e6",
      "parents": [
        "8d4d8ea6f40fb57fc1f0148e4d1582934592397f"
      ],
      "author": {
        "name": "Songqing Zhang",
        "email": "zhangsongqing164@163.com",
        "time": "Thu Apr 16 22:26:12 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Apr 16 22:26:12 2026 +0800"
      },
      "message": "fix(hyperloglog): use namespace-prefixed key in PFMERGE GetMetadata (#3441)\n\nMerge called GetMetadata with the raw user key instead of the\nnamespace-prefixed key, causing the destination\u0027s existing metadata to\nnever be found and potentially orphaning old sub-keys.\n\n---------\n\nCo-authored-by: 纪华裕 \u003cjihuayu123@gmail.com\u003e"
    },
    {
      "commit": "8d4d8ea6f40fb57fc1f0148e4d1582934592397f",
      "tree": "b10a5c88324a593a156b14f6508eb0b192b38f94",
      "parents": [
        "d942f530af1bdbf442dd0ae063bb77c1965ff510"
      ],
      "author": {
        "name": "Twice",
        "email": "twice.mliu@gmail.com",
        "time": "Thu Apr 16 11:18:42 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Apr 16 11:18:42 2026 +0800"
      },
      "message": "feat(commands): expose hash, list and json metadata in kmetadata (#3454)\n\nThis extends KMETADATA to expose hash, list, and JSON-specific metadata\nfields. It makes debugging and tests easier by improving observability\naround internal metadata.\n\nAssisted-by: Codex"
    },
    {
      "commit": "d942f530af1bdbf442dd0ae063bb77c1965ff510",
      "tree": "91db75b2331e4f57dc1cf153ba1c0549f416bf66",
      "parents": [
        "27fbff104fe918ff8733bbf6d9ac8810facc0552"
      ],
      "author": {
        "name": "纪华裕",
        "email": "jihuayu123@gmail.com",
        "time": "Wed Apr 15 15:38:09 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Apr 15 07:38:09 2026 +0000"
      },
      "message": "feat(ci): add caching for CMake FetchContent in CI workflow (#3448)\n\nDue to the current instability of GitHub services, dependency download\nfailures occur frequently during CI runs. I add FetchContent caching to\nprevent these network issues from failing the CI."
    },
    {
      "commit": "27fbff104fe918ff8733bbf6d9ac8810facc0552",
      "tree": "0aec4ea4d3b2684cd47ba922f90739ee65b9da89",
      "parents": [
        "505108c35fbce3eae16db870141bb34e9d3654bf"
      ],
      "author": {
        "name": "Reilly.tang",
        "email": "tang.ruilin@foxmail.com",
        "time": "Wed Apr 15 14:25:16 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Apr 15 06:25:16 2026 +0000"
      },
      "message": "fix(tdigest): correct TDIGEST.MERGE parser for COMPRESSION parameter. (#3449)\n\nFix #3447\n\nThe parser incorrectly used two independent `if` statements to check\nCOMPRESSION and OVERRIDE parameters. When COMPRESSION was successfully\nparsed, the code continued to the second `if` which would fail since the\nparser had reached the end, causing \"ERR wrong keyword\" error.\n\nFixed by changing the second `if` to `else if` to form a proper\nif-else-if-else chain.\n\nSigned-off-by: reilly \u003creilly@example.com\u003e\nCo-authored-by: 纪华裕 \u003cjihuayu123@gmail.com\u003e"
    },
    {
      "commit": "505108c35fbce3eae16db870141bb34e9d3654bf",
      "tree": "4d5f0a0e575550784665db944d71546876c8b66a",
      "parents": [
        "75df3740ae2f65c4f1b5382a1a57ba42d947a8b2"
      ],
      "author": {
        "name": "Reilly.tang",
        "email": "tang.ruilin@foxmail.com",
        "time": "Wed Apr 15 10:42:04 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Apr 15 02:42:04 2026 +0000"
      },
      "message": "fix(tdigest): merge into existing dest without OVERRIDE (#3412)\n\nCo-authored-by: 纪华裕 \u003cjihuayu123@gmail.com\u003e\nCo-authored-by: Edward Xu \u003cxuxiangad@gmail.com\u003e"
    },
    {
      "commit": "75df3740ae2f65c4f1b5382a1a57ba42d947a8b2",
      "tree": "0b022cc984d548dd128b974aa835c5cc698dc8e0",
      "parents": [
        "37140d6c30be4fa91e8a810e8be83981d618ce12"
      ],
      "author": {
        "name": "Aleks Lozovyuk",
        "email": "aleks.raiden@gmail.com",
        "time": "Tue Apr 14 20:24:47 2026 +0300"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Apr 14 17:24:47 2026 +0000"
      },
      "message": "chore(deps): bump jemalloc to 5.3.1 (#3451)\n\nBump jemalloc to 5.3.1 (use jemalloc repo again, see full changelog:\nhttps://github.com/jemalloc/jemalloc/releases/tag/5.3.1)\n\nLot of bugfix, portability improvements and optimizations.\n\nCo-authored-by: Twice \u003ctwice.mliu@gmail.com\u003e"
    },
    {
      "commit": "37140d6c30be4fa91e8a810e8be83981d618ce12",
      "tree": "d91829b64ec585fb661f3c25051c405e8b950c7d",
      "parents": [
        "94e4c8ef7e6bb5a98d892a05c4cbc6280c15f280"
      ],
      "author": {
        "name": "Twice",
        "email": "twice.mliu@gmail.com",
        "time": "Tue Apr 14 23:03:38 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Apr 14 23:03:38 2026 +0800"
      },
      "message": "feat(hash): initialize field expiration metadata and subkey en/decoding (#3444)\n\nPart of #3436. See proposal #3432.\n\nThis PR includes:\n- metadata changes for the new encoding\n- subkey encoding/decoding and related logic in `redis_hash.cc`\n- new config option adding\n- an enhancement to `SubKeyScanner` so that it can be used for HFE\n- run hash test cases for both modes\n\nAssisted-by: Codex"
    },
    {
      "commit": "94e4c8ef7e6bb5a98d892a05c4cbc6280c15f280",
      "tree": "9da937043f369d938354ebdea4a20987c0161404",
      "parents": [
        "61f4dc232704c589b28c9fd1b4374b31fffe7d7b"
      ],
      "author": {
        "name": "Songqing Zhang",
        "email": "zhangsongqing164@163.com",
        "time": "Fri Apr 10 22:35:19 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Apr 10 14:35:19 2026 +0000"
      },
      "message": "fix(geo): use strict weak ordering in sortGeoPointDESC comparator (#3439)\n\nThe GEO sort DESC comparator used \u003e\u003d instead of \u003e, violating the strict\nweak\nordering requirement of std::sort and causing undefined behavior when\n    elements have equal distances."
    },
    {
      "commit": "61f4dc232704c589b28c9fd1b4374b31fffe7d7b",
      "tree": "778a031ce6529b8e4e8e243cc6bbb1fc7389e285",
      "parents": [
        "2815e082fe2478331f645feb9b994e733c9fbe42"
      ],
      "author": {
        "name": "Twice",
        "email": "twice.mliu@gmail.com",
        "time": "Fri Apr 10 13:46:20 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Apr 10 13:46:20 2026 +0800"
      },
      "message": "build: disable LTO by default (#3440)\n\nDisabled link-time optimization (LTO) by default and removed related\nconditions to simplify CMake configuration.\n\nUsers need to manually enable LTO by `-DENABLE_LTO\u003dON` if they want LTO."
    },
    {
      "commit": "2815e082fe2478331f645feb9b994e733c9fbe42",
      "tree": "dba9d96c74ca9d13c0fbc0f73c860f2d5c4d7c83",
      "parents": [
        "29b23731ca9096f60be82bbc72d8c1c45be8d021"
      ],
      "author": {
        "name": "Songqing Zhang",
        "email": "zhangsongqing164@163.com",
        "time": "Fri Apr 10 11:26:03 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Apr 10 03:26:03 2026 +0000"
      },
      "message": "fix(stream): correct XREVRANGE minimum argument count from 2 to 4 (#3438)\n\nXREVRANGE requires key, end, start and [COUNT count] arguments (4\nminimum), but was registered with -2 which could cause out-of-bounds\naccess and crashes.\nRefs: https://redis.io/docs/latest/commands/xrevrange/"
    },
    {
      "commit": "29b23731ca9096f60be82bbc72d8c1c45be8d021",
      "tree": "41a257b5769f8687fa0cb9dc09269a7f45c69bac",
      "parents": [
        "ec523ccec1fe77bde23b942bba1bdef1542448e9"
      ],
      "author": {
        "name": "sryan yuan",
        "email": "sryan@qq.com",
        "time": "Thu Apr 09 15:20:44 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Apr 09 07:20:44 2026 +0000"
      },
      "message": "fix(command): fix static initialization crash on Kunpeng/Kylin platform (#3416)\n\n## Problem:\n\nWe\u0027ve identified a critical startup crash specific to Kunpeng processors\n(aarch64) running Kylin OS v10 with GCC 12.5.0. The root cause is a\nstatic initialization order issue where:\n\n* Static command registration objects (e.g., RegisterToCommandTable in\ncommand files) initialize before CommandTable\u0027s static containers\n* This leads to accessing uninitialized containers during startup:\n```cpp\nCommandTable::commands[attr.name] \u003d ...;  // ❌ Accesses uninitialized map\n```\n\n* On Kunpeng/Kylin/GCC12.5, this consistently manifests as:\n  * Segmentation faults during static initialization\n  * 100% failure rate in cold starts\n\n## Solution:\n\nImplement the \"construct on first use\" pattern to guarantee safe\ninitialization.\n\n## Key Changes:\n\n* Converted all static members in CommandTable to accessor functions\n* Updated all references to use function-call \n* Maintained identical public interface while fixing initialization\nguarantees\n\nCo-authored-by: Twice \u003ctwice.mliu@gmail.com\u003e"
    },
    {
      "commit": "ec523ccec1fe77bde23b942bba1bdef1542448e9",
      "tree": "1f6df0ba8f275ec5676c863a8e3c8e01ca08e55e",
      "parents": [
        "9a3b8176b8c976d759d571d5105da49f24d08b94"
      ],
      "author": {
        "name": "nagisa-kunhah",
        "email": "61525444+nagisa-kunhah@users.noreply.github.com",
        "time": "Thu Apr 09 13:04:31 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Apr 09 05:04:31 2026 +0000"
      },
      "message": "feat: Add support for dictionary compression settings (#3425)\n\nissue: #3409\n\n---------\n\nCo-authored-by: 纪华裕 \u003cjihuayu123@gmail.com\u003e\nCo-authored-by: Twice \u003ctwice.mliu@gmail.com\u003e"
    },
    {
      "commit": "9a3b8176b8c976d759d571d5105da49f24d08b94",
      "tree": "abf45dc920957a66900635585e52a4f3ecb96a4a",
      "parents": [
        "b272b5c1b673385ca6e58cf5c595fce252782e22"
      ],
      "author": {
        "name": "纪华裕",
        "email": "jihuayu123@gmail.com",
        "time": "Thu Apr 09 11:57:22 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Apr 09 03:57:22 2026 +0000"
      },
      "message": "fix(script): upgrade Lua version to fix CVE-2024-31449 and CVE-2025-49844 (#3435)\n\nUpgrade Lua version to fix CVE-2024-31449 and CVE-2025-49844.\nhttps://github.com/RocksLabs/lua/commit/c77781d0c23df021a903a9a6199d301ec559e9cd\n\n\nfix https://github.com/apache/kvrocks/issues/3434 fix\nhttps://github.com/apache/kvrocks/issues/3433"
    },
    {
      "commit": "b272b5c1b673385ca6e58cf5c595fce252782e22",
      "tree": "3387530d68a69520840dc878a161536070b5f37f",
      "parents": [
        "4aede367b72416a591623c2f04f176ab3e74c40a"
      ],
      "author": {
        "name": "Songqing Zhang",
        "email": "zhangsongqing164@163.com",
        "time": "Thu Apr 09 09:01:42 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Apr 09 01:01:42 2026 +0000"
      },
      "message": "fix(set): propagate storage errors in Set instead of treating as NotFound (#3428)\n\nPreviously, when `storage_-\u003eGet()` returned a non-NotFound error (e.g.,\nI/O error or corruption) during SADD, the code fell through to the\n`batch-\u003ePut` path, incorrectly treating the error as \"member not found\"\nand adding the member. This could silently inflate `metadata.size` and\ninsert duplicate members on storage failures.\n\nAdd an explicit `!s.IsNotFound()` check to propagate real errors, which\nis consistent with how `Set::Remove` already handles the same pattern.\n\n---------\n\nCo-authored-by: 纪华裕 \u003cjihuayu123@gmail.com\u003e"
    },
    {
      "commit": "4aede367b72416a591623c2f04f176ab3e74c40a",
      "tree": "075663e5a753e4846ff0ef39f4d48a037b0f9984",
      "parents": [
        "797649012faa4ebf010e1558ba891df67d68cfc9"
      ],
      "author": {
        "name": "Songqing Zhang",
        "email": "zhangsongqing164@163.com",
        "time": "Wed Apr 08 20:39:43 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Apr 08 12:39:43 2026 +0000"
      },
      "message": "fix(string,hash): use compact float format in IncrByFloat to match Redis (#3427)\n\nPreviously, String::IncrByFloat and Hash::IncrByFloat used\nstd::to_string(double) to persist float values, which produces C-style\n%f format with 6 fixed decimal places (e.g., \"10.500000\"). Redis uses a\n    compact %g-like format that strips trailing zeros (e.g., \"10.5\").\n\n    This caused GET/HGET after INCRBYFLOAT/HINCRBYFLOAT to return values\nlike \"10.500000\" instead of \"10.5\", breaking Redis protocol\ncompatibility.\n\nReplace std::to_string with util::Float2String (which uses fmt {:.17g})\n    in both String::IncrByFloat and Hash::IncrByFloat. The INCRBYFLOAT\ncommand reply already used Float2String correctly; this fix aligns the\n    stored representation with both the reply format and Redis behavior.\n\nCo-authored-by: 纪华裕 \u003cjihuayu123@gmail.com\u003e"
    },
    {
      "commit": "797649012faa4ebf010e1558ba891df67d68cfc9",
      "tree": "492ada65c1960861df005c06ba20658114254c05",
      "parents": [
        "5f6d7b2053e0a0c514556a99aa66b06e30b76eaf"
      ],
      "author": {
        "name": "Songqing Zhang",
        "email": "zhangsongqing164@163.com",
        "time": "Wed Apr 08 18:29:12 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Apr 08 10:29:12 2026 +0000"
      },
      "message": "fix(zset): initialize *inter_cnt before early return in InterCard (#3421)\n\nWhen any input key is empty (mscores.empty()), InterCard returned OK\n    without ever assigning *inter_cnt, leaving callers with an\n    uninitialized value. Redis ZINTERCARD should return 0 in this case.\n\nFix by initializing *inter_cnt \u003d 0 at the function entry.\n\nAlthough the count at the caller layer is initialized to 0, which seems\nto be fortuitously safe, other potential callers (such as internal\ncalls, test code, and future refactoring) may not necessarily initialize\nit beforehand.\n\nCo-authored-by: 纪华裕 \u003cjihuayu123@gmail.com\u003e"
    },
    {
      "commit": "5f6d7b2053e0a0c514556a99aa66b06e30b76eaf",
      "tree": "20f92278845e66dc19e8b25cab791ffab5ae3285",
      "parents": [
        "c1f57aab7d0febbe40e6e38281e149a1d30de0e0"
      ],
      "author": {
        "name": "纪华裕",
        "email": "jihuayu123@gmail.com",
        "time": "Wed Apr 08 17:19:18 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Apr 08 17:19:18 2026 +0800"
      },
      "message": "fix(ci): modify Redis build cache keys (#3430)\n\nUbuntu 22.04 incorrectly uses the cached redis-cli from Ubuntu 24.04,\ncausing go test to fail.\nUpdate the cache key to prevent this issue."
    },
    {
      "commit": "c1f57aab7d0febbe40e6e38281e149a1d30de0e0",
      "tree": "d0b4605e962eaf1566c4d4ced7a666852d983a43",
      "parents": [
        "fdcfd437fa835df6c919099aae9a3160d389ed11"
      ],
      "author": {
        "name": "纪华裕",
        "email": "jihuayu123@gmail.com",
        "time": "Wed Apr 08 15:19:56 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Apr 08 07:19:56 2026 +0000"
      },
      "message": "chore(ci):  Update paths-filter and header action versions (#3426)\n\n\u003cimg width\u003d\"1996\" height\u003d\"284\" alt\u003d\"image\"\nsrc\u003d\"https://github.com/user-attachments/assets/fe2e4893-ba8c-46cb-bb37-bf801ab74991\"\n/\u003e"
    },
    {
      "commit": "fdcfd437fa835df6c919099aae9a3160d389ed11",
      "tree": "256a913c03e063ea55c2f11d25968ed22375d4b4",
      "parents": [
        "c7d91ed722ec91299d8e2caf439f7ffcf5db4c35"
      ],
      "author": {
        "name": "Songqing Zhang",
        "email": "zhangsongqing164@163.com",
        "time": "Wed Apr 08 10:25:44 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Apr 08 10:25:44 2026 +0800"
      },
      "message": "fix(stream): correct subkey prefix encoding in DestroyGroup (#3420)\n\nDestroyGroup was constructing scan prefixes using only\n    PutFixed64(group_name.size()) + group_name, which does not match the\nactual internal key format used by\n[internalKeyFromGroupName](https://github.com/apache/kvrocks/blob/da5e46307047b3e89753f0c9c02996430e758a5f/src/types/redis_stream.cc#L171),\n    internalKeyFromConsumerName, and internalPelKeyFromGroupAndEntryId.\n\nThe real keys are prefixed with PutFixed64(UINT64_MAX) + PutFixed8(type)\nbefore the group name length and name. The wrong prefix meant the scan\nrange could miss all group/consumer/PEL keys or match unrelated stream\n    entry keys, causing data leaks or corruption on XGROUP DESTROY.\n\nFix by iterating over the three subkey types (GroupMetadata,\nConsumerMetadata, PelEntry) and building the correct prefix for each,\n    consistent with the internal key encoding helpers.\n\nBesides, add two test cases verifying that DestroyGroup correctly cleans\nup all\ngroup-related subkeys (group metadata, consumer metadata, PEL entries):\n\n- DestroyGroupCleansUpConsumersAndPelEntries: verifies full cleanup\n      including that stream entries are preserved and the group can be\n      re-created cleanly.\n- DestroyGroupDoesNotAffectOtherGroups: verifies that destroying one\n      group does not affect another group\u0027s consumers or PEL entries."
    },
    {
      "commit": "c7d91ed722ec91299d8e2caf439f7ffcf5db4c35",
      "tree": "852c8de1564cd627c03b28db75fd3c10517407b9",
      "parents": [
        "784344e3c34db8d9df2065f42f998af46dae8d09"
      ],
      "author": {
        "name": "纪华裕",
        "email": "jihuayu123@gmail.com",
        "time": "Mon Apr 06 09:35:51 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Apr 06 09:35:51 2026 +0800"
      },
      "message": "fix(ci): add check-and-lint success as a merge condition (#3423)"
    },
    {
      "commit": "784344e3c34db8d9df2065f42f998af46dae8d09",
      "tree": "d2204233ecb9c17c64603c571ef46f6efe5150b2",
      "parents": [
        "c4934951e85476c15288b9771b3b5c8310cbaf7a"
      ],
      "author": {
        "name": "Songqing Zhang",
        "email": "zhangsongqing164@163.com",
        "time": "Sun Apr 05 15:46:57 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sun Apr 05 07:46:57 2026 +0000"
      },
      "message": "fix(conf): cap proto-max-bulk-len to 4 GiB instead of UINT64_MAX  (#3419)\n\n Change proto_max_bulk_len to 4G so that bulk_len_+2 used for\nCRLF accounting in RESP parsing can never wrap around, see` if\n(evbuffer_get_length(input) \u003c bulk_len_ + 2) return Status::OK();` in\n[code](https://github.com/apache/kvrocks/blob/da5e46307047b3e89753f0c9c02996430e758a5f/src/server/redis_request.cc#L123).\n\n---------\n\nCo-authored-by: hulk \u003chulk.website@gmail.com\u003e"
    },
    {
      "commit": "c4934951e85476c15288b9771b3b5c8310cbaf7a",
      "tree": "0a29af8d8bead958e41395ccde2e669dc4748972",
      "parents": [
        "a841726d630e8565ba6e80d5f2fc63320f0b6277"
      ],
      "author": {
        "name": "Aleks Lozovyuk",
        "email": "aleks.raiden@gmail.com",
        "time": "Sun Apr 05 06:07:17 2026 +0300"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sun Apr 05 11:07:17 2026 +0800"
      },
      "message": "chore(ci): bump typos action to version 1.45.0 (#3422)\n\nBump typos action to version 1.45.0 (see:\nhttps://github.com/crate-ci/typos/releases/tag/v1.45.0)\n\n- Updated the dictionary with the\nhttps://github.com/crate-ci/typos/issues/1509 changes\n- Updated the dictionary with the\nhttps://github.com/crate-ci/typos/issues/1488 changes\n- Don\u0027t correct pincher\n- Adjust how typos are reported to github\n- Corrections for Python\n\n---------\n\nCo-authored-by: 纪华裕 \u003cjihuayu123@gmail.com\u003e"
    },
    {
      "commit": "a841726d630e8565ba6e80d5f2fc63320f0b6277",
      "tree": "cf7a9ab4f155767055625219b23723d96bb7d02b",
      "parents": [
        "da5e46307047b3e89753f0c9c02996430e758a5f"
      ],
      "author": {
        "name": "Aleks Lozovyuk",
        "email": "aleks.raiden@gmail.com",
        "time": "Sat Apr 04 05:19:19 2026 +0300"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sat Apr 04 10:19:19 2026 +0800"
      },
      "message": "chore(deps): bump jsoncons version to v1.6.0 (#3401)"
    },
    {
      "commit": "da5e46307047b3e89753f0c9c02996430e758a5f",
      "tree": "bd6092594868303618a1133a56f9fd9f92842372",
      "parents": [
        "833bf36a0571995fae7a18de4fa40e604dc27b39"
      ],
      "author": {
        "name": "Songqing Zhang",
        "email": "zhangsongqing164@163.com",
        "time": "Wed Apr 01 22:07:01 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Apr 01 14:07:01 2026 +0000"
      },
      "message": "fix(server): data race when accessing the db scan infos in GetLatestKeyNumStats (#3414)\n\ndb_scan_infos_.find() was called without holding db_job_mu_, while\n    background threads mutate the map under that lock. Acquire the lock\n    before find() to match the pattern used in GetLastScanTime.\n\nCo-authored-by: hulk \u003chulk.website@gmail.com\u003e"
    },
    {
      "commit": "833bf36a0571995fae7a18de4fa40e604dc27b39",
      "tree": "552b6d25aa5e51555528ec8d9538c5e9cdce968b",
      "parents": [
        "96dd8cb2601b88314567ea6e253e73f01eed7c94"
      ],
      "author": {
        "name": "hulk",
        "email": "hulk.website@gmail.com",
        "time": "Wed Apr 01 14:00:58 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Apr 01 06:00:58 2026 +0000"
      },
      "message": "fix(ci): failure in macOS due to the unavailable cmake version (#3415)\n\nRelated CI logs:\nhttps://github.com/apache/kvrocks/actions/runs/23828447043/job/69456664463?pr\u003d3413\n\n```\nSome possibly relevant errors from pip install:\n    ERROR: Could not find a version that satisfies the requirement cmake\u003d\u003d3.31 (from versions: 0.1.0, 0.2.0, 0.4.0, 0.5.0, 0.6.0, 0.7.0, 0.7.1, 0.8.0, 0.9.0, 3.6.3.post1, 3.7.2, 3.8.2, 3.9.6, 3.10.3, 3.11.0, 3.11.4, 3.11.4.post1, 3.12.0, 3.13.0, 3.13.1, 3.13.2.post1, 3.14.3.post1, 3.14.4.post1, 3.15.3.post1, 3.16.3.post1, 3.16.5, 3.16.6, 3.16.7, 3.16.8, 3.17.0, 3.17.1, 3.17.2, 3.17.3, 3.18.0, 3.18.2.post1, 3.18.4.post1, 3.20.2, 3.20.3, 3.20.4, 3.20.5, 3.21.0, 3.21.1.post1, 3.21.2, 3.21.3, 3.21.4, 3.22.0, 3.22.1, 3.22.2, 3.22.3, 3.22.4, 3.22.5, 3.22.6, 3.23.3, 3.24.0, 3.24.1, 3.24.1.1, 3.24.2, 3.24.3, 3.25.0, 3.25.2, 3.26.0, 3.26.1, 3.26.3, 3.26.4, 3.27.0, 3.27.1, 3.27.2, 3.27.4.1, 3.27.5, 3.27.6, 3.27.7, 3.27.9, 3.28.1, 3.28.3, 3.28.4, 3.29.0.1, 3.29.2, 3.29.3, 3.29.5, 3.29.5.1, 3.29.6, 3.30.0, 3.30.1, 3.30.2, 3.30.3, 3.30.4, 3.30.5, 3.30.9, 3.31.0.1, 3.31.1, 3.31.2, 3.31.4, 3.31.6, 3.31.10, 4.0.0, 4.0.2, 4.0.3, 4.1.0, 4.1.2, 4.1.3, 4.2.0, 4.2.1, 4.2.3, 4.3.0, 4.3.1)\n    ERROR: No matching distribution found for cmake\u003d\u003d3.31\nError installing cmake from spec \u0027cmake\u003d\u003d3.31\u0027.\n```"
    },
    {
      "commit": "96dd8cb2601b88314567ea6e253e73f01eed7c94",
      "tree": "3ed366c7fa86bf806d7ace77e33286ba60d0638e",
      "parents": [
        "e61c81478c27a2309081d219b9dcb8f81b19d9aa"
      ],
      "author": {
        "name": "XYenon",
        "email": "register@xyenon.bid",
        "time": "Sat Mar 28 22:18:19 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sat Mar 28 22:18:19 2026 +0800"
      },
      "message": "fix(stream): accept `~` modifier in XADD and XTRIM (#3403)\n\nFixes https://github.com/apache/kvrocks/issues/3402\n\nXADD and XTRIM commands only recognized `\u003d` as the optional modifier for\nMAXLEN/MINID but not `~`, causing a parse error. Redis supports both\nmodifiers for compatibility."
    },
    {
      "commit": "e61c81478c27a2309081d219b9dcb8f81b19d9aa",
      "tree": "52ce3e5a7a323ab63b04da3d8d28899eca7dc91d",
      "parents": [
        "b7423c48042b272958d3f036b04f729c717fb7c4"
      ],
      "author": {
        "name": "chakkk309",
        "email": "chakk6870@gmail.com",
        "time": "Wed Mar 25 09:42:49 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Mar 25 01:42:49 2026 +0000"
      },
      "message": "feat(tdigest): implement TDIGEST.TRIMMED_MEAN command (#3312)\n\nCo-authored-by: Copilot \u003c175728472+Copilot@users.noreply.github.com\u003e\nCo-authored-by: Edward Xu \u003cxuxiangad@gmail.com\u003e"
    },
    {
      "commit": "b7423c48042b272958d3f036b04f729c717fb7c4",
      "tree": "f09a956a5737df31cd4575b52ba8e6faa70e2f3f",
      "parents": [
        "73e202dc96fafa068a2caab9cbe3793fd61c7a4d"
      ],
      "author": {
        "name": "Yatrik Solanki",
        "email": "yatriksolanki@gmail.com",
        "time": "Tue Mar 24 12:37:51 2026 -0400"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Mar 24 16:37:51 2026 +0000"
      },
      "message": "chore(config): remove the deprecated configuration `rocksdb.max_background_{compactions,flushes}`  and set default to -1 (#3398)\n\nThis PR will:\n- update the default values of `rocksdb.max_background_compactions` and\n`rocksdb.max_background_flushes` from `2` to `-1`\n- unset them from `kvrocks.conf` and update comments to reflect\nRocksDB\u0027s decision logic for max background threads\n\nNOTE: This doesn\u0027t make it so that `rocksdb.max_background_compactions`\nis unsettable, like `rocksdb.max_background_flushes` currently is. This\nmay be desirable for people who do currently use the old overrides, but\nafaik it would lock people in to `max_background_flushes \u003d 2` - but\nthat\u0027s already the case as far as I can tell.\n\nI ran each of:\n```\n./x.py format (unrelated changes)\n./x.py build --unittest\n./x.py test cpp \n```\nTests all pass and formatting changes are unrelated.\n\nThis is effectively an addition to\nhttps://github.com/apache/kvrocks/issues/1665\nSee https://github.com/apache/kvrocks/discussions/3395 for more\nbackground.\n\n---------\n\nCo-authored-by: Yatrik S. \u003cyatrik@molniya.space\u003e\nCo-authored-by: Aleks Lozovyuk \u003caleks.raiden@gmail.com\u003e\nCo-authored-by: hulk \u003chulk.website@gmail.com\u003e"
    },
    {
      "commit": "73e202dc96fafa068a2caab9cbe3793fd61c7a4d",
      "tree": "19201420fc87bf3ed9ee460f7853141aecbb38e7",
      "parents": [
        "bf66a9e24ba3dd4b5740721d89526e3cd687f224"
      ],
      "author": {
        "name": "Edward Xu",
        "email": "xuxiangad@gmail.com",
        "time": "Tue Mar 24 23:21:32 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Mar 24 15:21:32 2026 +0000"
      },
      "message": "chore(ci): use git-hash in actions for ASF actions approval list (#3400)"
    },
    {
      "commit": "bf66a9e24ba3dd4b5740721d89526e3cd687f224",
      "tree": "102dbaa93abb5b7d300d9cbbb78033fa80e4b1c7",
      "parents": [
        "6f40a95bb66513c3c7fce6fa25370e9063ee8335"
      ],
      "author": {
        "name": "Twice",
        "email": "twice.mliu@gmail.com",
        "time": "Fri Mar 20 09:59:03 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Mar 20 09:59:03 2026 +0800"
      },
      "message": "chore(util): replace strtof/strtod with fast-float (#3394)\n\nIt closes #3344."
    },
    {
      "commit": "6f40a95bb66513c3c7fce6fa25370e9063ee8335",
      "tree": "8000613982be193ba14e3c31dcdaca6a82742100",
      "parents": [
        "8f56bf04ac5bdf1b7455167d14faffb2ccc94d9d"
      ],
      "author": {
        "name": "纪华裕",
        "email": "jihuayu123@gmail.com",
        "time": "Mon Mar 16 22:39:42 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Mar 16 22:39:42 2026 +0800"
      },
      "message": "chore(ci): fix sonarcloud security hotspots (#3392)"
    },
    {
      "commit": "8f56bf04ac5bdf1b7455167d14faffb2ccc94d9d",
      "tree": "7b5b2b24943f9bee21109ee39913f50dad91d46a",
      "parents": [
        "3b02893fbcd1e30b707f6d2f09fda01e63394551"
      ],
      "author": {
        "name": "Sanjana",
        "email": "sanju250506@gmail.com",
        "time": "Mon Mar 16 07:24:31 2026 +0530"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Mar 16 09:54:31 2026 +0800"
      },
      "message": "chore: fix typos in README and redis_bitmap.cc (#3390)"
    },
    {
      "commit": "3b02893fbcd1e30b707f6d2f09fda01e63394551",
      "tree": "33f68e6e9c24fe05713c3d94062e99a0ac08bffa",
      "parents": [
        "f2058ceab287c49e2869ef0575480e52bbb1db82"
      ],
      "author": {
        "name": "Sanjana",
        "email": "sanju250506@gmail.com",
        "time": "Thu Mar 12 20:23:33 2026 +0530"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Mar 12 22:53:33 2026 +0800"
      },
      "message": "refactor: use stderr for CLI error output (#3372)\n\nI noticed that the CLI was printing error messages (like invalid\narguments or config load failures) to `stdout`, which isn\u0027t ideal for\nscripting or standard error handling. This PR redirects those critical\nerrors to `stderr`.\n\nI also enhanced the\n[PrintUsage](cci:1://file:///Users/sanjana./kvrocks/src/cli/main.cc:62:0-73:1)\nfunction to accept an output stream, so `-h`/`--help` still goes to\n`stdout` (as expected), but incorrect usage warnings go to `stderr`. The\nusage message itself has been slightly polished for better readability.\n\nChanges:\n- PrintUsage now takes an optional `std::ostream\u0026` argument (defaults to\n`cout`).\n- Invalid command-line arguments now print usage to `cerr` and return\nexit code 1.\n- Config loading and logger initialization errors now print to `cerr`.\n- Added `\u003ciostream\u003e` include for correctness.\n\n---------\n\nCo-authored-by: 纪华裕 \u003cjihuayu123@gmail.com\u003e"
    },
    {
      "commit": "f2058ceab287c49e2869ef0575480e52bbb1db82",
      "tree": "829c4712b41c55408bf84c7eb583fd9eecc99925",
      "parents": [
        "1a50c0bfa938714d370438098f9480280e505dc5"
      ],
      "author": {
        "name": "纪华裕",
        "email": "jihuayu123@gmail.com",
        "time": "Thu Mar 12 15:22:04 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Mar 12 15:22:04 2026 +0800"
      },
      "message": "chore(ci): Use the lastest version of clang-format-18 \u0026 clang-tidy-18 (#3389)\n\nThe clang-format-18 provided by Ubuntu is version 18.1.3, while the\nlatest is 18.1.8. This discrepancy causes mismatches with the versions\nmany developers have installed locally. Pinning clang-format-18 to the\nlatest minor release of version 18 would significantly improve the\ndeveloper experience.\n\nRefer https://github.com/apache/kvrocks/pull/3372"
    },
    {
      "commit": "1a50c0bfa938714d370438098f9480280e505dc5",
      "tree": "a538c3bcb93f8d274d1ea9eccdeba6a60c5fdf49",
      "parents": [
        "e1de9414289f83adb3503f9ed22ef9c9a637d9d3"
      ],
      "author": {
        "name": "Ruifeng Guo",
        "email": "paragrf@163.com",
        "time": "Thu Mar 12 11:33:10 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Mar 12 11:33:10 2026 +0800"
      },
      "message": "feat(cluster): propagate slave failure state via CLUSTER NODES fail flag (#3386)\n\nThis closes https://github.com/apache/kvrocks/issues/3385\n\n### Background\nTo maintain parity with Redis Cluster\u0027s behavior during slave node\noutages, this update enables Kvrocks to refresh its topology\naccordingly. This ensures clients stay synchronized with the server\nstate and helps mitigate the effects of node failures.\n\n### Implementation\nSupport the \"slave,fail\" role token in CLUSTERX SETNODES so that\ncontrollers can mark a downed slave in the cluster topology. Surviving\nnodes reflect the failed state as a \"fail\" flag in CLUSTER NODES output,\nallowing cluster-aware clients to update their routing tables without\nmanual intervention.\n\n---------\n\nCo-authored-by: paragrf \u003cguoruifeng@kanzhun.com\u003e\nCo-authored-by: 纪华裕 \u003cjihuayu123@gmail.com\u003e"
    },
    {
      "commit": "e1de9414289f83adb3503f9ed22ef9c9a637d9d3",
      "tree": "da59a6fb3c983aa3be2c5f541780a5ea5ff7146f",
      "parents": [
        "222711fd0e1a6e0f121b3713cacb63bb971b420a"
      ],
      "author": {
        "name": "Aleks Lozovyuk",
        "email": "aleks.raiden@gmail.com",
        "time": "Tue Mar 10 14:47:59 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Mar 10 20:47:59 2026 +0800"
      },
      "message": "chore(ci): bump docker/build-push-action to v7 (#3384)\n\nBump docker/build-push-action to v7 (see:\nhttps://github.com/docker/build-push-action/releases/tag/v7.0.0)"
    },
    {
      "commit": "222711fd0e1a6e0f121b3713cacb63bb971b420a",
      "tree": "8076750b5472fb5a19f0011b07c7d8e716b97500",
      "parents": [
        "d09cdc12946803691fe949f76dbc916ad8cec86a"
      ],
      "author": {
        "name": "Paragrf",
        "email": "paragrf@163.com",
        "time": "Fri Mar 06 12:19:40 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Mar 06 12:19:40 2026 +0800"
      },
      "message": "feat(client): Add support for the CLIENT PAUSE/UNPAUSE commands to provide a temporary solution for failover (#3378)\n\n### Summary\nThis PR aims to provide a streamlined solution for graceful failover\nwithin the cluster. Previously, proposed failover schemes remained\nunmerged due to unresolved complexities and architectural concerns.\n\nTo address this, this modification introduces the CLIENT PAUSE and\nCLIENT UNPAUSE commands—capabilities that were previously missing in\nKvrocks. These commands provide the necessary primitives to temporarily\nsuspend client traffic, ensuring data consistency and a seamless\ntransition during the failover process.\n\n### Background\nBased on https://github.com/apache/kvrocks/issues/3377, this PR\nimplements two missing Redis protocols.\n\n- Implemented CLIENT PAUSE [timeout] [WRITE|ALL] to block client\nrequests.\n\n- Implemented CLIENT UNPAUSE to resume normal operations.\n\n### Implementation\nThe behavior of CLIENT PAUSE/UNPAUSE is consistent with Redis:\n\n- Blocking Mechanism: After executing CLIENT PAUSE, Kvrocks will block\nconnections attempting to run restricted commands.\n\n- Release/Error Handling: These commands are released once the timeout\nexpires or CLIENT UNPAUSE is called.\n\n- Role Transition: If a role change occurs (e.g., Master → Slave) during\nthe pause, any previously blocked write requests will return a READONLY\nerror upon resumption.\n\n- Exemption mechanism:master-slave replication, and the PAUSE/UNPAUSE\nprotocols themselves will not be blocked.\n\n- Testing:Comprehensive C++ unit tests and Go integration tests have\nbeen added\n\n---------\n\nCo-authored-by: paragrf \u003cguoruifeng@kanzhun.com\u003e\nCo-authored-by: hulk \u003chulk.website@gmail.com\u003e"
    },
    {
      "commit": "d09cdc12946803691fe949f76dbc916ad8cec86a",
      "tree": "13e0f62d5c3dd9fe77d3a021f013b17b5119fb23",
      "parents": [
        "792df3612c2d6bde2159cacbd104f12e0f73c6d5"
      ],
      "author": {
        "name": "Aleks Lozovyuk",
        "email": "aleks.raiden@gmail.com",
        "time": "Thu Mar 05 04:35:51 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Mar 05 10:35:51 2026 +0800"
      },
      "message": "chore(ci): bump all used actions to latest (#3383)\n\n"
    },
    {
      "commit": "792df3612c2d6bde2159cacbd104f12e0f73c6d5",
      "tree": "e14906809222e1bb56c6da9e60f28d6a1e0c0312",
      "parents": [
        "cc2bb3c7e3d77c6b88af5f1b42e9018e0bb31ec8"
      ],
      "author": {
        "name": "sryan yuan",
        "email": "sryan@qq.com",
        "time": "Tue Mar 03 16:32:27 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Mar 03 16:32:27 2026 +0800"
      },
      "message": "feat(info): add thread CPU time measurement for worker thread monitoring (#3379)\n\n## Summary\nThis PR introduces worker thread CPU time monitoring to identify\nbottlenecks and fixes precision issues in process CPU time calculations.\n\n## Problem Statement\n1. **Lack of granular thread monitoring**: The current `INFO` command\nprovides only overall process CPU time, which includes background\nthreads. This makes it difficult to identify bottlenecks in worker\nthreads specifically, as background thread activity can mask true worker\nthread utilization.\n\n2. **Precision loss in CPU time calculation**: The existing CPU time\ncalculation truncates microsecond values due to integer division\n(`tv_usec / 1000000`), causing millisecond data loss. This results in\ninaccurate reporting, especially for short operations where sub-second\nprecision matters.\n\n## Solution\n### 1. Worker Thread CPU Time Monitoring\n- Added new `worker_cpu_time` metric to track CPU usage per worker\nthread\n- Implemented per-thread CPU time collection using platform-specific\nAPIs\n- Formatted output with microsecond precision (6 decimal places) to\nmatch system precision\n- Sample output: `worker_cpu_time:[0.123456,0.456789,1.234567]`\n\n### 2. CPU Time Calculation Fix\n- Fixed precision loss in `used_cpu_user` and `used_cpu_sys`\ncalculations\n- Replaced integer division with floating point division:  \n  **Before**: `tv_usec / 1000000` → truncates to integer  \n**After**: `static_cast\u003cdouble\u003e(tv_usec) / 1e6` → preserves microseconds\n\n## Benefits\n- **Pinpoint worker thread bottlenecks**: Isolate worker thread CPU\nusage from background threads\n- **Accurate performance analysis**: Microsecond-precision timing\nenables precise performance profiling\n- **Better load diagnosis**: Distinguish between actual worker\nsaturation and background activity\n\n---------\n\nCo-authored-by: yxj25245 \u003cyxj25245@ly.com\u003e"
    },
    {
      "commit": "cc2bb3c7e3d77c6b88af5f1b42e9018e0bb31ec8",
      "tree": "d5145f03cc024146b9aa8bbe1908b37791b2e1c1",
      "parents": [
        "fa14a6bb12997702cd58fb9577652ffada2784c1"
      ],
      "author": {
        "name": "sryan yuan",
        "email": "sryan@qq.com",
        "time": "Fri Feb 27 13:41:53 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Feb 27 13:41:53 2026 +0800"
      },
      "message": "feat(command): add FLUSHSLOTS command to clear keys in specified slot ranges in cluster mode (#3375)\n\nAdd FLUSHSLOTS command to clear keys in specified slot ranges in cluster\nmode\n\nFLUSHSLOTS allows clearing keys from one or more cluster slots without\naffecting other slots.\nIt operates on the current connection\u0027s namespace (cluster mode does not\nsupport multiple namespaces).\n\nThe command returns an error if a slot migration is in progress to\nprevent conflicts.\n\nSlot ranges can be specified as:\n    - Single slot: FLUSHSLOTS 1234\n    - Range: FLUSHSLOTS 100-200\n    - Multiple ranges: FLUSHSLOTS “0 2 4 6-9”\n\nExample:\n    FLUSHSLOTS \"0 2 4 6-9\"\n\nUnit tests have been added to verify clearing multiple slots and\nensuring remaining keys match expectations.\n\n---------\n\nCo-authored-by: yxj25245 \u003cyxj25245@ly.com\u003e"
    },
    {
      "commit": "fa14a6bb12997702cd58fb9577652ffada2784c1",
      "tree": "83befc74c1c02e00fd8d6fabec79c3d3a90433c9",
      "parents": [
        "83afb41034d1a2821a7f5c14222a22c0c9d1aacf"
      ],
      "author": {
        "name": "hulk",
        "email": "hulk.website@gmail.com",
        "time": "Fri Feb 27 09:57:22 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Feb 27 09:57:22 2026 +0800"
      },
      "message": "chore(.asf.yaml): add 2.15 into protected branches (#3376)\n\n"
    },
    {
      "commit": "83afb41034d1a2821a7f5c14222a22c0c9d1aacf",
      "tree": "65e75e0fd14225285eff8dc0c63bda682a74e7c8",
      "parents": [
        "818d4198013d4ef832265fcb650fe71afe941323"
      ],
      "author": {
        "name": "Cancai Cai",
        "email": "77189278+caicancai@users.noreply.github.com",
        "time": "Mon Feb 23 14:57:52 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Feb 23 14:57:52 2026 +0800"
      },
      "message": "chore: update copyright year in NOTICE (#3374)\n\n"
    },
    {
      "commit": "818d4198013d4ef832265fcb650fe71afe941323",
      "tree": "d0ab91a7bfbea840ffb11136c5391b71cb723ffa",
      "parents": [
        "90f51e7a6e08a2f17bd7d71d87ae2b769c81bed7"
      ],
      "author": {
        "name": "Aleks Lozovyuk",
        "email": "aleks.raiden@gmail.com",
        "time": "Sun Feb 22 13:47:27 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sun Feb 22 19:47:27 2026 +0800"
      },
      "message": "chore(ci): bump golang lint to v2.9.0 (#3370)\n\nBump golang lint to v2.9.0 (see:\nhttps://golangci-lint.run/docs/product/changelog/#290)\n\n**Key changes**:\n\n- go1.26 support\n- Update linters, bug fix\n- Emit an error when no linters enabled"
    },
    {
      "commit": "90f51e7a6e08a2f17bd7d71d87ae2b769c81bed7",
      "tree": "88e72616bde5f3bd19de52f1687da35d22324ec4",
      "parents": [
        "a10b6e1e6c7f6917de3b12731f75eaeafab83018"
      ],
      "author": {
        "name": "hulk",
        "email": "hulk.website@gmail.com",
        "time": "Thu Feb 12 14:14:00 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Feb 12 14:14:00 2026 +0800"
      },
      "message": "chore(docs): add AGENTS.md for AI coding agent guidance (#3369)\n\nAI coding agents like Claude Code, Cursor, and Codex are increasingly\nused by contributors.\nTo mitigate the issue of AI coding agents generating low-quality PR,\nwe could provide guidance to help them better understand Kvrocks.\n\n---------\nCo-authored-by: Twice \u003ctwice@apache.org\u003e"
    },
    {
      "commit": "a10b6e1e6c7f6917de3b12731f75eaeafab83018",
      "tree": "119382369515662568dd7a17c815dabbf41d8f90",
      "parents": [
        "11fa20bc796249dbdf0e7db42128637bb27caa3b"
      ],
      "author": {
        "name": "Zakir",
        "email": "zakir03032002@gmail.com",
        "time": "Tue Feb 10 19:42:10 2026 +0530"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Feb 10 14:12:10 2026 +0000"
      },
      "message": "feat(rdb): add DUMP support for SortedInt type (#3366)\n\n- Serialize SortedInt as RDB Set for Redis compatibility\n- Use RangeByValue() to get all integers deterministically\n- No RESTORE changes (SortedInt dumps restore as Set, like\nBitmap→String)\n- Resolves part of #3319\n\nTesting:\n- Manual test confirms DUMP no longer returns error\n- RESTORE successfully creates Set with preserved data\n- All integers maintained in restored Set\n\nManuel test:\nroot@codespaces-6e5713:/workspaces/kvrocks# # Connect to Kvrocks\nredis-cli -p 6666\n\n127.0.0.1:6666\u003e SIADD testkey 100 200 300\n(integer) 0 // already exists\n\n127.0.0.1:6666\u003e SICARD testkey\n(integer) 3\n\n127.0.0.1:6666\u003e TYPE testkey\nsortedint\n\n127.0.0.1:6666\u003e DUMP testkey\n\n\"\\x02\\x03\\xc0d\\xc1\\xc8\\x00\\xc1,\\x01\\x06\\x00\\xb2\\x01\\xaa\\xe2\\x06h\\xba\\x8d\"\n\n127.0.0.1:6666\u003e SIADD mykey 5 12 23 89 100\n(integer) 0\n127.0.0.1:6666\u003e DUMP mykey\n\n\"\\x02\\x05\\xc0\\x05\\xc0\\x0c\\xc0\\x17\\xc0Y\\xc0d\\x06\\x00\\xa8\\x19U\\x90\\x8f\\x011o\"\n\n127.0.0.1:6666\u003e RESTORE newkey 0\n\"\\x02\\x05\\xc0\\x05\\xc0\\x0c\\xc0\\x17\\xc0Y\\xc0d\\x06\\x00\\xa8\\x19U\\x90\\x8f\\x011o\"\nOK\n\n127.0.0.1:6666\u003e TYPE newkey\nset\n\n127.0.0.1:6666\u003e SMEMBERS newkey\n1) \"100\"\n2) \"12\"\n3) \"23\"\n4) \"5\"\n5) \"89\"\n127.0.0.1:6666\u003e DUMP nonexistent\n(nil)\n127.0.0.1:6666\u003e exit\n\n---------\n\nCo-authored-by: hulk \u003chulk.website@gmail.com\u003e"
    },
    {
      "commit": "11fa20bc796249dbdf0e7db42128637bb27caa3b",
      "tree": "ed88f601dc64a1552c41a0d032ff69a64d791c28",
      "parents": [
        "270c10b528b39a76eb7c7a6811647d147e752ce5"
      ],
      "author": {
        "name": "Aleks Lozovyuk",
        "email": "aleks.raiden@gmail.com",
        "time": "Wed Feb 04 14:20:03 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Feb 04 12:20:03 2026 +0000"
      },
      "message": "chore(deps): Bump zlib version to v2.3.3 (#3361)\n\nBump zlib version to v2.3.3 (changelog:\nhttps://github.com/zlib-ng/zlib-ng/releases/tag/2.3.3)\n\nBugfix release\n\n**Key changes**\n\n- Make deflate output deterministic if stream is reused after\ndeflateReset\n- Use GCC\u0027s may_alias attribute for access to buffers in crc32_chorba\n- Fix false-positive infinite loop warning detected by GCC-14 static\nanalyzer\n- Fix warning for potentially uninitialized local variable ft used\n\nCo-authored-by: hulk \u003chulk.website@gmail.com\u003e"
    },
    {
      "commit": "270c10b528b39a76eb7c7a6811647d147e752ce5",
      "tree": "7ba8747cc5fb2661cad344f358d7ade0c9a6ba29",
      "parents": [
        "559a667bef223a07fea350a27168e91fe0a74601"
      ],
      "author": {
        "name": "Aleks Lozovyuk",
        "email": "aleks.raiden@gmail.com",
        "time": "Wed Feb 04 13:12:01 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Feb 04 19:12:01 2026 +0800"
      },
      "message": "chore(ci): bump crate-ci/typos action to v1.43.1 (#3362)\n\nBump crate-ci/typos action to v1.43.1 (see:\nhttps://github.com/crate-ci/typos/releases/tag/v1.43.1)\n\n**Changes**:\n\n- Ignore hex literals with suffixes (e.g. 0xffffUL)\n- Don\u0027t correct substituters\n- Don\u0027t correct loosing\n- Don\u0027t correct consts\n- Updated the dictionary with the\nhttps://github.com/crate-ci/typos/issues/1453 changes"
    },
    {
      "commit": "559a667bef223a07fea350a27168e91fe0a74601",
      "tree": "127d95dbed0548c679b2d93fb22b796760a164f6",
      "parents": [
        "38e3c1ff0763190fa606d0dbf05d6c86e216442e"
      ],
      "author": {
        "name": "Mario de Frutos Dieguez",
        "email": "mario@revenuecat.com",
        "time": "Wed Feb 04 02:36:05 2026 +0100"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Feb 04 09:36:05 2026 +0800"
      },
      "message": "fix(replication): prevent WAL exhaustion from slow consumers (#3357)\n\nThe replication feed thread could block indefinitely when sending data\nto a slow replica. If the replica wasn\u0027t consuming data fast enough, the\nTCP send buffer would fill and the feed thread would block on write()\nwith no timeout. During this time, WAL files would rotate and be pruned,\nleaving the replica\u0027s sequence unavailable when the thread eventually\nunblocked or the connection dropped.\n\nThis commit adds three mechanisms to address the issue:\n\n1. Socket send timeout: New SockSendWithTimeout() function that uses\npoll() to wait for socket writability with a configurable timeout\n(default 30 seconds). This prevents indefinite blocking.\n\n2. Replication lag detection: At the start of each loop iteration, check\nif the replica has fallen too far behind (configurable via\nmax-replication-lag, default 100M sequences). If exceeded, disconnect\nthe slow consumer before WAL is exhausted, allowing psync on reconnect.\n\n3. Exponential backoff on reconnection: When a replica is disconnected,\nit now waits with exponential backoff (1s, 2s, 4s... up to 60s) before\nreconnecting. This prevents rapid reconnection loops for persistently\nslow replicas. The backoff resets on successful psync or fullsync.\n\nNew configuration options:\n- max-replication-lag: Maximum sequence lag before disconnecting\n(default: 100M)\n- replication-send-timeout-ms: Socket send timeout in ms (default:\n30000)\n\nFixes https://github.com/apache/kvrocks/issues/3356\n\n---------\n\nCo-authored-by: hulk \u003chulk.website@gmail.com\u003e"
    },
    {
      "commit": "38e3c1ff0763190fa606d0dbf05d6c86e216442e",
      "tree": "06408d38a3b550e7ce197ea70ebd0b065f0636f5",
      "parents": [
        "4404eb7e9662e92d2d3e304ada73322f50fa84a0"
      ],
      "author": {
        "name": "Aleks Lozovyuk",
        "email": "aleks.raiden@gmail.com",
        "time": "Tue Feb 03 08:57:48 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Feb 03 06:57:48 2026 +0000"
      },
      "message": "chore(deps): Bump rocksdb to v10.10.1 (#3360)\n\nBump rocksdb to v10.10.1 (see changelog:\nhttps://github.com/facebook/rocksdb/releases/tag/v10.10.1)\n\nA bugfix-only release"
    },
    {
      "commit": "4404eb7e9662e92d2d3e304ada73322f50fa84a0",
      "tree": "048202737f2ca99e0c59532d0869f0e6eb8c58c7",
      "parents": [
        "cf384eb09dae69ab0b857964ca1a7c8e30094e41"
      ],
      "author": {
        "name": "sryan yuan",
        "email": "sryan@qq.com",
        "time": "Thu Jan 29 19:43:00 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Jan 29 19:43:00 2026 +0800"
      },
      "message": "fix(string): add empty string value check for INCR to match Redis behavior (#3354)\n\n### Background\nPreviously, Kvrocks allowed INCR on a key whose value was an empty\nstring (\"\"),\ntreating it as zero and returning 1.\n\nIn Redis, the same operation results in an error:\nERR value is not an integer or out of range\n\nThis difference caused inconsistent behavior between Kvrocks and Redis.\n\n### Changes\n- Added check for empty string values before performing INCR\n- Return error when value is an empty string, matching Redis behavior\n\n### Result\nKvrocks now behaves consistently with Redis when performing INCR on\nempty string values,\nimproving compatibility and reducing unexpected results in client\napplications.\n\nCo-authored-by: yxj25245 \u003cyxj25245@ly.com\u003e"
    },
    {
      "commit": "cf384eb09dae69ab0b857964ca1a7c8e30094e41",
      "tree": "8cc0059d103440a92ccca3fa01ca7aab2b03fe2b",
      "parents": [
        "7ed063acfdf525c4f68ced1d4ac3a4108afe6039"
      ],
      "author": {
        "name": "Byeonggyu Park",
        "email": "zarami1214@g.skku.edu",
        "time": "Wed Jan 28 12:09:09 2026 +0900"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Jan 28 03:09:09 2026 +0000"
      },
      "message": "chore(tests): replace to slices.Reverse() in go test (#3352)\n\nRemove `util.ReverseSlice()` and replace to `slices.Reverse()`\n- From Go 1.21, `slices.Reverse()` included in standard library\n- Refer to https://pkg.go.dev/slices#Reverse"
    },
    {
      "commit": "7ed063acfdf525c4f68ced1d4ac3a4108afe6039",
      "tree": "c34bb02574743853f7699c450939fe42156256fc",
      "parents": [
        "40904b003176ecab5fbf1f204e4540b2d5dc727f"
      ],
      "author": {
        "name": "Luigi Tagliamonte",
        "email": "51684360+ltagliamonte-dd@users.noreply.github.com",
        "time": "Tue Jan 20 18:53:23 2026 -0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Jan 21 02:53:23 2026 +0000"
      },
      "message": "fix(sideloading): avoid the expected data deletion during SST side loading (#3342)\n\n"
    },
    {
      "commit": "40904b003176ecab5fbf1f204e4540b2d5dc727f",
      "tree": "4fd3362d6ede5d7b12d6eee651295ad4c3550787",
      "parents": [
        "5c8088241ba9f385f19ceb273d5cc6241bb37f15"
      ],
      "author": {
        "name": "hulk",
        "email": "hulk.website@gmail.com",
        "time": "Mon Jan 19 11:15:42 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Jan 19 11:15:42 2026 +0800"
      },
      "message": "chore(conf): change the default cache to hyper clock cache (#3343)\n\nRocksDB has made the default cache implementation to HyperClockCache\nsince the version\n[v10.7.5](https://github.com/facebook/rocksdb/releases/tag/v10.7.5), so\nwe could change it as our default cache accordingly.\n\nAccording to [Hyping the hyper clock cache in\nRocksDB](https://smalldatum.blogspot.com/2022/10/hyping-hyper-clock-cache-in-rocksdb.html),\nusing the hyper clock cache can provide better performance than LRU. But\nI didn\u0027t reproduce the significant performance difference between them\nvia `redis-benchmark` on my local."
    },
    {
      "commit": "5c8088241ba9f385f19ceb273d5cc6241bb37f15",
      "tree": "550e3c5eaf27fb5dc1d56733da65445ff5f0b88b",
      "parents": [
        "25216331bce6f9e97b945aad1cbb04e2db261287"
      ],
      "author": {
        "name": "Aleks Lozovyuk",
        "email": "aleks.raiden@gmail.com",
        "time": "Fri Jan 09 14:24:13 2026 +0300"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Jan 09 11:24:13 2026 +0000"
      },
      "message": "chore(ci): bump typos checker to 1.42.0 (#3334)\n\nBump typos checker to 1.42.0 (see:\nhttps://github.com/crate-ci/typos/releases/tag/v1.42.0)\n\nIn this release - dictionary updates\n\nCo-authored-by: Twice \u003ctwice.mliu@gmail.com\u003e"
    },
    {
      "commit": "25216331bce6f9e97b945aad1cbb04e2db261287",
      "tree": "afec10c9d476e21def1578950161b4ba8d416c10",
      "parents": [
        "a68caeb5719a54489238924e45b483c4284c508e"
      ],
      "author": {
        "name": "Nick Sweeting",
        "email": "nsweeting@gmail.com",
        "time": "Thu Jan 08 22:05:41 2026 -0500"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Jan 09 03:05:41 2026 +0000"
      },
      "message": "fix(stream): add missing return after empty response in XREAD/XREADGROUP OnWrite (#3337)\n\nWhen the `OnWrite()` callback for blocking `XREAD`/`XREADGROUP` commands\nreceives empty results, it sends a null array response but then\nunconditionally calls `SendReply()`, which sends an additional empty\narray response.\n\nThis causes clients to receive two RESP responses (`*-1\\r\\n*0\\r\\n`) for\na single command, leading to protocol desynchronization.\n\n### Root Cause\n\n**CommandXReadGroup::OnWrite() - lines 1666-1670:**\n```cpp\nif (results.empty()) {\n  conn_-\u003eReply(redis::MultiLen(-1));  // Sends *-1\\r\\n\n  // BUG: missing return here!\n}\n\nSendReply(results);  // Always called, sends *0\\r\\n when results is empty\n```\n\n**CommandXRead::OnWrite() - lines 1354-1358:**\n```cpp\nif (results.empty()) {\n  conn_-\u003eReply(conn_-\u003eNilArray());  // Sends *-1\\r\\n\n  // BUG: missing return here!\n}\n\nSendReply(results);  // Always called, sends *0\\r\\n when results is empty\n```\n\n### Fix\n\nAdd `return;` statements after sending the empty response to prevent the\nduplicate `SendReply()` call.\n\n## Reproduction\n\nThe bug triggers under concurrent load when multiple clients are\nblocking on `XREADGROUP BLOCK` while messages are being added via\n`XADD`.\n\n\u003cdetails\u003e\n\u003csummary\u003eReproduction script (Go)\u003c/summary\u003e\n\n```go\n// Build: go build -o repro repro.go\n// Run:   ./repro localhost:6666\n\npackage main\n\nimport (\n\t\"bytes\"\n\t\"fmt\"\n\t\"net\"\n\t\"os\"\n\t\"strconv\"\n\t\"sync\"\n\t\"time\"\n)\n\nvar host \u003d \"localhost:6666\"\n\nfunc encodeCommand(args ...string) []byte {\n\tvar buf bytes.Buffer\n\tbuf.WriteString(fmt.Sprintf(\"*%d\\r\\n\", len(args)))\n\tfor _, arg :\u003d range args {\n\t\tbuf.WriteString(fmt.Sprintf(\"$%d\\r\\n%s\\r\\n\", len(arg), arg))\n\t}\n\treturn buf.Bytes()\n}\n\nfunc sendCommand(conn net.Conn, args ...string) ([]byte, error) {\n\tconn.Write(encodeCommand(args...))\n\tbuf :\u003d make([]byte, 4096)\n\tconn.SetReadDeadline(time.Now().Add(5 * time.Second))\n\tn, _ :\u003d conn.Read(buf)\n\treturn buf[:n], nil\n}\n\nfunc main() {\n\tif len(os.Args) \u003e 1 {\n\t\thost \u003d os.Args[1]\n\t}\n\n\tstream, group :\u003d \"test_stream\", \"test_group\"\n\n\t// Setup\n\tconn, _ :\u003d net.Dial(\"tcp\", host)\n\tsendCommand(conn, \"DEL\", stream)\n\tsendCommand(conn, \"XGROUP\", \"CREATE\", stream, group, \"0\", \"MKSTREAM\")\n\tconn.Close()\n\n\tvar errors []string\n\tvar mu sync.Mutex\n\tvar wg sync.WaitGroup\n\n\t// 5 concurrent blocking readers\n\tfor i :\u003d 0; i \u003c 5; i++ {\n\t\twg.Add(1)\n\t\tgo func(id int) {\n\t\t\tdefer wg.Done()\n\t\t\tconn, _ :\u003d net.Dial(\"tcp\", host)\n\t\t\tdefer conn.Close()\n\n\t\t\tfor j :\u003d 0; j \u003c 100; j++ {\n\t\t\t\tcmd :\u003d encodeCommand(\"XREADGROUP\", \"GROUP\", group, fmt.Sprintf(\"reader%d\", id),\n\t\t\t\t\t\"COUNT\", \"1\", \"BLOCK\", \"50\", \"STREAMS\", stream, \"\u003e\")\n\t\t\t\tconn.Write(cmd)\n\n\t\t\t\tbuf :\u003d make([]byte, 4096)\n\t\t\t\tconn.SetReadDeadline(time.Now().Add(2 * time.Second))\n\t\t\t\tn, _ :\u003d conn.Read(buf)\n\n\t\t\t\tif bytes.Contains(buf[:n], []byte(\"*-1\\r\\n*0\\r\\n\")) {\n\t\t\t\t\tmu.Lock()\n\t\t\t\t\terrors \u003d append(errors, fmt.Sprintf(\"Reader %d: got *-1\\\\r\\\\n*0\\\\r\\\\n\", id))\n\t\t\t\t\tmu.Unlock()\n\t\t\t\t\tfmt.Printf(\"[BUG] Reader %d: received double response *-1\\\\r\\\\n*0\\\\r\\\\n\\n\", id)\n\t\t\t\t\treturn\n\t\t\t\t}\n\t\t\t}\n\t\t}(i)\n\t}\n\n\t// Writer adding messages concurrently\n\tgo func() {\n\t\tconn, _ :\u003d net.Dial(\"tcp\", host)\n\t\tdefer conn.Close()\n\t\tfor i :\u003d 0; i \u003c 200; i++ {\n\t\t\tsendCommand(conn, \"XADD\", stream, \"*\", \"msg\", strconv.Itoa(i))\n\t\t\ttime.Sleep(5 * time.Millisecond)\n\t\t}\n\t}()\n\n\twg.Wait()\n\n\t// Cleanup\n\tconn, _ \u003d net.Dial(\"tcp\", host)\n\tsendCommand(conn, \"DEL\", stream)\n\tconn.Close()\n\n\tif len(errors) \u003e 0 {\n\t\tfmt.Printf(\"\\nBUG REPRODUCED: %d occurrence(s)\\n\", len(errors))\n\t\tos.Exit(1)\n\t}\n\tfmt.Println(\"No bug detected this run (try again - it\u0027s a race condition)\")\n}\n```\n\n\u003c/details\u003e\n\nThe go-redis client detects this and logs:\n```\nredis: pool.go:768: Conn has unread data (not push notification), removing it\n```\n\nI have verified locally that this fix eliminates the bug completely.\n\n## Test\n\nAdded a test case `XREADGROUP BLOCK concurrent readers should not\nreceive double responses` in\n`tests/gocase/unit/type/stream/stream_test.go` that exercises concurrent\nblocking readers with concurrent writers.\n\n## Type of change\n\n- [x] Bug fix (non-breaking change which fixes an issue)\n\nResolves #3338"
    },
    {
      "commit": "a68caeb5719a54489238924e45b483c4284c508e",
      "tree": "2dbe0fd6f030cb55520c98300a20617f90aaacfa",
      "parents": [
        "ff1cf2b389cd8b59cc1bfbf53ba684178083b63d"
      ],
      "author": {
        "name": "Byeonggyu Park",
        "email": "zarami1214@g.skku.edu",
        "time": "Fri Jan 09 02:40:22 2026 +0900"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Jan 08 17:40:22 2026 +0000"
      },
      "message": "fix(command): Fix MSETEX key range for command (#3336)\n\nFix key range of MSETEX to return accurate key list with `COMMAND\nGETKEYS MSETEX`\nclose #3335"
    },
    {
      "commit": "ff1cf2b389cd8b59cc1bfbf53ba684178083b63d",
      "tree": "7045277f851ce19bb17629197cb586dc31cb7bf6",
      "parents": [
        "d85232b00bbe3a167da217c8cb4f181ee48aef86"
      ],
      "author": {
        "name": "Aleks Lozovyuk",
        "email": "aleks.raiden@gmail.com",
        "time": "Wed Jan 07 16:24:20 2026 +0300"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Jan 07 13:24:20 2026 +0000"
      },
      "message": "chore(deps): use BUILD_TESTING instead of deprecated ZLIB_ENABLE_TESTS  (#3326)\n\n"
    },
    {
      "commit": "d85232b00bbe3a167da217c8cb4f181ee48aef86",
      "tree": "d98dc00de8427f074c7c2545c4654be8512a30ca",
      "parents": [
        "c124922accd6cb8af3cb99d10901d2909a2c9268"
      ],
      "author": {
        "name": "Aleks Lozovyuk",
        "email": "aleks.raiden@gmail.com",
        "time": "Wed Jan 07 15:08:36 2026 +0300"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Jan 07 12:08:36 2026 +0000"
      },
      "message": "chore(deps): Bump RocksDB to v10.9.1 (#3329)\n\nBump RocksDB to v10.9.1, a first public release of 10.9 line (see:\nhttps://github.com/facebook/rocksdb/releases/tag/v10.9.1)\n\n**Key changes**\n\n- Added optimization that allowed for the asynchronous prefetching of\nall data outlined in a multiscan iterator\n- Updated standalone range deletion L0 file compaction behavior to avoid\ncompacting with any newer L0 files (which is expensive and not useful)\n- To reduce risk of ODR violations or similar,\nROCKSDB_USING_THREAD_STATUS has been removed from public headers and\nreplaced with static const bool ThreadStatus::kEnabled\n- Added an auto-tuning feature for DB manifest file size that also (by\ndefault) improves the safety of existing configurations in case\nmax_manifest_file_size is repeatedly exceeded\n- Added a new API to support option migration for multiple column\nfamilies\n- Fix resumable compaction incorrectly allowing resumption from a\ntruncated range deletion that is not well handled currently\n- Fixed a bug for WAL_ttl_seconds \u003e 0 use cases where the newest\narchived WAL files could be incorrectly deleted when the system clock\nmoved backwards\n- Other bug fix\n\nCo-authored-by: Twice \u003ctwice.mliu@gmail.com\u003e"
    },
    {
      "commit": "c124922accd6cb8af3cb99d10901d2909a2c9268",
      "tree": "dbb827a02ea458c4d1c65940b857cd99af26a7c6",
      "parents": [
        "dfc2936073f4d8e26705723c476ea1f4c940675f"
      ],
      "author": {
        "name": "sryan yuan",
        "email": "sryan@qq.com",
        "time": "Wed Jan 07 18:59:34 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Jan 07 10:59:34 2026 +0000"
      },
      "message": "perf(hash): use MultiGet to reduce RocksDB calls in HMSET (#3327)\n\nHMSET previously compared existing values by issuing a separate RocksDB\nGet\nfor each field. When the number of fields is large, this results in\nmultiple\nGet calls and extra overhead.\n\nThis change replaces multiple Get calls with a single MultiGet call,\nbatching\nthe reads and improving performance for HMSET with many fields.\n\n---------\n\nCo-authored-by: yxj25245 \u003cyxj25245@ly.com\u003e\nCo-authored-by: hulk \u003chulk.website@gmail.com\u003e\nCo-authored-by: Twice \u003ctwice.mliu@gmail.com\u003e"
    },
    {
      "commit": "dfc2936073f4d8e26705723c476ea1f4c940675f",
      "tree": "97763601c758d94d2b8f7cd0b87f7217fabdbf9d",
      "parents": [
        "035f4f437215b471a7e9b9e4b64f8fc1e1f99236"
      ],
      "author": {
        "name": "Aleks Lozovyuk",
        "email": "aleks.raiden@gmail.com",
        "time": "Wed Jan 07 12:49:11 2026 +0300"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Jan 07 09:49:11 2026 +0000"
      },
      "message": "chore(deps): Bump RocksDB to v10.8.3 (#3328)\n\nBump RocksDB to v10.8.3 (full changelog:\nhttps://github.com/facebook/rocksdb/releases/tag/v10.8.3)\n\n**Key changes**\n\n- Fixed a performance regression in LZ4 compression that started in\nversion 10.6.0\n- The MultiScan API contract is updated\n- Add kFSPrefetch to FSSupportedOps enum to allow file systems to\nindicate prefetch support capability, avoiding unnecessary prefetch\nsystem calls on file systems that don\u0027t support them\n- Added an auto-tuning feature for DB manifest file size that also (by\ndefault) improves the safety of existing configurations in case\nmax_manifest_file_size is repeatedly exceeded\n- Add a GetColumnFamilyMetaData API variant in DB to get the SST files\nintersecting a given key range\n- Bug Fixes\n\nCo-authored-by: Twice \u003ctwice.mliu@gmail.com\u003e"
    },
    {
      "commit": "035f4f437215b471a7e9b9e4b64f8fc1e1f99236",
      "tree": "e32e604aa6d27ea36d61102432a1f8a5120c4094",
      "parents": [
        "5e958d5cb8c16d4a1869c1c727e31a475b054c7d"
      ],
      "author": {
        "name": "Aleks Lozovyuk",
        "email": "aleks.raiden@gmail.com",
        "time": "Wed Jan 07 11:41:55 2026 +0300"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Jan 07 08:41:55 2026 +0000"
      },
      "message": "chore(deps): Bump RocksDB version to v10.7.5 (#3232)\n\nBump RocksDB version to v10.7.5 (see:\nhttps://github.com/facebook/rocksdb/releases/tag/v10.7.5)\n\nPlease merge after PR #3229 \n\n**Key changes**\n\n- The MultiScan API contract is updated. After a multi scan range got\nprepared with Prepare API call, the following seeks must seek the start\nof each prepared scan range in order. In addition, when limit is set,\nupper bound must be set to the same value of limit before each seek\n- Fixed a performance regression in LZ4 compression that started in\nversion 10.6.0\n- Add the fail_if_no_udi_on_open flag in BlockBasedTableOption to\ncontrol whether a missing user defined index block in a SST is a hard\nerror or not\n- A new flag memtable_veirfy_per_key_checksum_on_seek is added to\nAdvancedColumnFamilyOptions. When it is enabled, it will validate key\nchecksum along the binary search path on skiplist based memtable during\nseek operation\n- Introduce option MultiScanArgs::use_async_io to enable asynchronous\nI/O during MultiScan\n- Add new option MultiScanArgs::max_prefetch_size that limits the memory\nusage of per file pinning of prefetched blocks\n- Improved sst_dump\n- HyperClockCache with no estimated_entry_charge is now production-ready\nand is the preferred block cache implementation vs. LRUCache. Please\nconsider updating your code to minimize the risk of hitting performance\nbottlenecks or anomalies from LRUCache. See cache.h for more detail.\n- **RocksDB now requires a C++20 compatible compiler (GCC \u003e\u003d 11, Clang\n\u003e\u003d 10, Visual Studio \u003e\u003d 2019)**, including for any code using RocksDB\nheaders\n- The default provided block cache implementation is now HyperClockCache\ninstead of LRUCache, when block_cache is nullptr (default) and\nno_block_cache\u003d\u003dfalse (default)\n- Add a new experimental PerKeyPointLockManager to improve efficiency\nunder high lock contention\n- Majorly improved CPU efficiency and scalability of parallel\ncompression (CompressionOptions::parallel_threads \u003e 1), though this\nefficiency improvement makes parallel compression\n- Add a new table property \"rocksdb.key.smallest.seqno\" which records\nthe smallest sequence number of all keys in file\n- Bug fixes\n\nCo-authored-by: Twice \u003ctwice.mliu@gmail.com\u003e"
    },
    {
      "commit": "5e958d5cb8c16d4a1869c1c727e31a475b054c7d",
      "tree": "95a4fa7fec751643fcfdd04b3ca492f05407112b",
      "parents": [
        "a7f9b40c2d7826dde77d2cda4b04a8c08e216e70"
      ],
      "author": {
        "name": "Aleks Lozovyuk",
        "email": "aleks.raiden@gmail.com",
        "time": "Wed Jan 07 10:36:11 2026 +0300"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Jan 07 15:36:11 2026 +0800"
      },
      "message": "chore(ci): Downgrade Alpine to 3.22 to avoid cluster test crash (#3330)\n\nAfter extensive testing, I identified the root cause of the broken CI\ntests: the Alpine version used in the tests is too new. Alpine 3.23\nintroduces many changes, some of which cause compatibility issues.\nSpecifically, our C++ tests for the Cluster fail to start and crash\nwithout any output.\n\nAs a quick fix, this PR switches to Alpine 3.22 by updating the image\nversion in the CI matrix\n\nThis patch fix a bugs into #3329 #3328 #3232"
    },
    {
      "commit": "a7f9b40c2d7826dde77d2cda4b04a8c08e216e70",
      "tree": "db1e82ef32096cd4db2b1ef06915a321d10bc89c",
      "parents": [
        "7d7e81ec1c6940ebe80d03ae1b55f63b747bfa39"
      ],
      "author": {
        "name": "Aleks Lozovyuk",
        "email": "aleks.raiden@gmail.com",
        "time": "Mon Jan 05 16:22:59 2026 +0300"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Jan 05 21:22:59 2026 +0800"
      },
      "message": "chore(deps): bump spdlog version to v1.17.0 (#3325)\n\nBump spdlog version to v1.17.0 (full changelog -\nhttps://github.com/gabime/spdlog/releases/tag/v1.17.0)\n\n**Key changes**\n\n- Fix the %z formatter (UTC offset)\n- Fix include \u003cfcntl.h\u003e in tcp_client.h to avoid compilation failures\n- Fix sign-compare warning\n- Bump bundled {fmt} library to 12.1.0"
    },
    {
      "commit": "7d7e81ec1c6940ebe80d03ae1b55f63b747bfa39",
      "tree": "8604d401e9fe5788f70b8fea2e29e00153f66061",
      "parents": [
        "9dbd4dedff263d513d9a2ca7cf5746d6c4f5b0ef"
      ],
      "author": {
        "name": "Aleks Lozovyuk",
        "email": "aleks.raiden@gmail.com",
        "time": "Sun Jan 04 16:54:42 2026 +0300"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sun Jan 04 21:54:42 2026 +0800"
      },
      "message": "chore(test): update go deps (#3323)\n\nUpdate deps for Go tests\n\n- ebitengine/purego v0.9.0 \u003d\u003e v0.9.1\n- lufia/plan9stats v0.0.0-20250827001030-24949be3fa54 \u003d\u003e\nv0.0.0-20251013123823-9fd1530e3ec3\n- redis/go-redis/v9 v9.17.0 \u003d\u003e v9.17.2\n- shirou/gopsutil/v4 v4.25.8 \u003d\u003e v4.25.12\n- tklauser/go-sysconf v0.3.15 \u003d\u003e v0.3.16\n- tklauser/numcpus v0.10.0 \u003d\u003e v0.11.0\n- x/exp v0.0.0-20250911091902-df9299821621 \u003d\u003e\nv0.0.0-20251219203646-944ab1f22d93\n- x/sync v0.17.0 \u003d\u003e v0.19.0\n- x/sys v0.36.0 \u003d\u003e v0.39.0"
    },
    {
      "commit": "9dbd4dedff263d513d9a2ca7cf5746d6c4f5b0ef",
      "tree": "8004553d1405bd7c503994aad90c01d474ebfeee",
      "parents": [
        "6148f9bccfd81a36213cd5427bac00b74427d875"
      ],
      "author": {
        "name": "Byeonggyu Park",
        "email": "zarami1214@g.skku.edu",
        "time": "Sat Jan 03 22:59:50 2026 +0900"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sat Jan 03 21:59:50 2026 +0800"
      },
      "message": "perf(string): reduce the unnecessary reads in MSETEX (#3322)\n\nWhen running `MSETEX` command with `NX|XX` and `KEEPTTL`, it access 2*N\ntimes for read.\n- Reduce read access from 2*N to N.\n- Change `Exists` ret type from `int` to `uint32_t`."
    },
    {
      "commit": "6148f9bccfd81a36213cd5427bac00b74427d875",
      "tree": "742435d24bcfaf1e5a08c01e74c2b58c90fcdf2c",
      "parents": [
        "576d575724a921aa1bf3533b93771ec813e6e5d2"
      ],
      "author": {
        "name": "Valay Saitwadekar",
        "email": "51906989+Valay17@users.noreply.github.com",
        "time": "Sat Jan 03 01:59:55 2026 -0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sat Jan 03 17:59:55 2026 +0800"
      },
      "message": "feat(string): Implement DELEX Command (#3317)\n\nFixes #3310\n\nImplement DELEX Command\n\nDigest function commented out\n\n---------\n\nCo-authored-by: hulk \u003chulk.website@gmail.com\u003e\nCo-authored-by: Twice \u003ctwice@apache.org\u003e"
    },
    {
      "commit": "576d575724a921aa1bf3533b93771ec813e6e5d2",
      "tree": "cbd1ea82b557b56c90ea4b7e854b92a806451657",
      "parents": [
        "dca7134890a558f6fcd2a17dea176965c0607ad8"
      ],
      "author": {
        "name": "Aleks Lozovyuk",
        "email": "aleks.raiden@gmail.com",
        "time": "Thu Jan 01 19:01:41 2026 +0300"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Jan 01 16:01:41 2026 +0000"
      },
      "message": "chore(ci): Update typos action to version 1.41.0 (#3321)\n\nUpdate typos action to version 1.41.0\n\n**Key changes**\n\n- Updated the dictionary with the\nhttps://github.com/crate-ci/typos/issues/1431 changes\n- Treat incrementer and incrementor the same for now\n- Updated the dictionary with the\nhttps://github.com/crate-ci/typos/issues/1405 changes\n- Don\u0027t offer entry as a correction for entrys\n-"
    },
    {
      "commit": "dca7134890a558f6fcd2a17dea176965c0607ad8",
      "tree": "222746406972ba5a8a1bc7e0cca244d7a7c7c297",
      "parents": [
        "270d5754f5c9cd065566b4e401e82713f705f38b"
      ],
      "author": {
        "name": "Byeonggyu Park",
        "email": "55678893+ggyuchive@users.noreply.github.com",
        "time": "Thu Jan 01 17:54:45 2026 +0900"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Jan 01 08:54:45 2026 +0000"
      },
      "message": "feat(string): Add to Support MSETEX Command (#3318)\n\n## Issue\ncloses #3307 \n\n## Description\nIn redis, it supports MSETEX which supports MSET with TTL options from\nv8.4.0.\nSyntax of `MSETEX` is below.\n```\nMSETEX numkeys key value [key value ...] [NX | XX] [EX seconds |\n  PX milliseconds | EXAT unix-time-seconds |\n  PXAT unix-time-milliseconds | KEEPTTL]\n```\nThis change adds support for the `MSETEX` command in kvrocks, making it\ncompatible with Redis.\n\n- Reference: https://redis.io/docs/latest/commands/msetex/\n\n---------\n\nCo-authored-by: Twice \u003ctwice.mliu@gmail.com\u003e"
    },
    {
      "commit": "270d5754f5c9cd065566b4e401e82713f705f38b",
      "tree": "f63eff8aed2682f3c20da27269149aaa487c1460",
      "parents": [
        "c2c5d094d4335c4951f88e7de319d78e1bf5b3b8"
      ],
      "author": {
        "name": "chakkk309",
        "email": "chakk6870@gmail.com",
        "time": "Thu Jan 01 13:22:50 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Jan 01 13:22:50 2026 +0800"
      },
      "message": "feat(digest): implement DIGEST command (#3320)\n\nClose #3309 \n\n### Description\nThis adds the `DIGEST` command that calculates a hash digest for string\nkeys using XXH3, ref to https://redis.io/docs/latest/commands/digest/.\nThis PR aims to provide a clearer design rationale and a more focused\nscope.\n\nFiles changed\n  - Added the `DIGEST`command implementation in `cmd_string.cc`\n  - Added hash function using XXH3\n  - Added go tests\n\nNotes: The changes were tested and validated locally with successful\nbuilds and test runs."
    },
    {
      "commit": "c2c5d094d4335c4951f88e7de319d78e1bf5b3b8",
      "tree": "305bcccb30dae6c510aabfa9d07b6ae850efbf71",
      "parents": [
        "a320c90205bbe7a289e197470cd380a41e81f357"
      ],
      "author": {
        "name": "Byeonggyu Park",
        "email": "55678893+ggyuchive@users.noreply.github.com",
        "time": "Tue Dec 30 02:48:16 2025 +0900"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Dec 29 17:48:16 2025 +0000"
      },
      "message": "fix(command): Enhance zdiff parse error case to avoid crash (#3316)\n\ncloses #3315"
    },
    {
      "commit": "a320c90205bbe7a289e197470cd380a41e81f357",
      "tree": "b4a1367961b3cafc37d3a9fee582458201505020",
      "parents": [
        "cb829a6136e77fa7a510cd5e6a5919a9e4517f89"
      ],
      "author": {
        "name": "i18n.site",
        "email": "i18n.site@gmail.com",
        "time": "Tue Dec 23 22:19:10 2025 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Dec 23 22:19:10 2025 +0800"
      },
      "message": "chore(info): change redis compatibility version to 7.0.0 (#3286)\n\nClose https://github.com/apache/kvrocks/issues/3285.\n\n\n## Root Cause Analysis\n\nThe issue occurs because Kvrocks reports its Redis version as `4.0.0`\n(defined in `src/server/server.h:61`), while RESP3 protocol was\nintroduced in Redis 6.0.\n\n**Most Redis client libraries perform version checking before attempting\nto use RESP3.** When clients see a server version below 6.0, they skip\nthe `HELLO 3` command entirely and default to RESP2, even if the server\nactually supports RESP3.\n\n### How Redis Clients Check Version\n\n1. Client connects to Redis/Kvrocks\n2. Client checks server version (via `INFO` or `HELLO` response)\n3. **If version \u003c 6.0**: Client assumes RESP3 is not supported and uses\nRESP2\n4. **If version \u003e\u003d 6.0**: Client sends `HELLO 3` to negotiate RESP3\n\n### Why This Affects Sentinel Connections\n\nWhen connecting through Redis Sentinel:\n- Sentinel provides the master address to the client\n- Client connects to the master and checks its version\n- If Kvrocks reports version `4.0.0`, the client library won\u0027t attempt\nRESP3\n- This happens regardless of the `resp3-enabled` configuration\n\n## Solution\n\n**Update `REDIS_VERSION` from `\"4.0.0\"` to `\"7.0.0\"`** in\n`src/server/server.h`.\n\n### Why 7.0.0 Instead of 6.0.0?\n\nWhile RESP3 was introduced in Redis 6.0, **Redis 7.0 is the first\nversion with full, production-ready RESP3 support**. Some client\nlibraries may have additional checks or optimizations specifically for\nRedis 7.0+. Using version `7.0.0` ensures maximum compatibility with all\nmodern Redis clients.\n\n### Code Change Required\n\n```cpp\n// src/server/server.h:61\n-constexpr const char *REDIS_VERSION \u003d \"4.0.0\";\n+constexpr const char *REDIS_VERSION \u003d \"7.0.0\";\n```\n\n### Test Updates\n\nAlso update the test expectations in:\n- `tests/gocase/unit/hello/hello_test.go` (lines 48, 57)\n\n```go\n-require.EqualValues(t, \"4.0.0\", rList[3])\n+require.EqualValues(t, \"7.0.0\", rList[3])\n```\n\nCo-authored-by: Aleks Lozovyuk \u003caleks.raiden@gmail.com\u003e\nCo-authored-by: hulk \u003chulk.website@gmail.com\u003e"
    },
    {
      "commit": "cb829a6136e77fa7a510cd5e6a5919a9e4517f89",
      "tree": "7fd1c340efbadbc29d6f3fdee3b8c85b0a666ca8",
      "parents": [
        "7ca56db2510abe23ffbcdf40d6fc0a9b610de6f9"
      ],
      "author": {
        "name": "Twice",
        "email": "twice.mliu@gmail.com",
        "time": "Tue Dec 23 10:47:49 2025 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Dec 23 02:47:49 2025 +0000"
      },
      "message": "ci: re-enable ubuntu 24 build jobs (#3305)\n\nIt closes #2411.\n\nCo-authored-by: hulk \u003chulk.website@gmail.com\u003e"
    },
    {
      "commit": "7ca56db2510abe23ffbcdf40d6fc0a9b610de6f9",
      "tree": "782b0ae4a1d710be2dd33804f5b41d0ae362af98",
      "parents": [
        "0874e865c6a66a65eae2da70d0b893399b522215"
      ],
      "author": {
        "name": "Twice",
        "email": "twice.mliu@gmail.com",
        "time": "Tue Dec 23 09:35:37 2025 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Dec 23 09:35:37 2025 +0800"
      },
      "message": "chore(.asf.yaml): add 2.14 into protected branches (#3304)\n\nSee changes."
    },
    {
      "commit": "0874e865c6a66a65eae2da70d0b893399b522215",
      "tree": "091eb34b41033002b1c155ce557cffd9e0e6ea74",
      "parents": [
        "81115726b1ae2cebb703db5e8bf27a3ad89a436e"
      ],
      "author": {
        "name": "Zhangjian He",
        "email": "hezhangjian97@gmail.com",
        "time": "Mon Dec 22 11:36:04 2025 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Dec 22 03:36:04 2025 +0000"
      },
      "message": "chore(parse_util): fix comment typos and clarify base parameter range (#3303)\n\n"
    },
    {
      "commit": "81115726b1ae2cebb703db5e8bf27a3ad89a436e",
      "tree": "db68d8eb56a09f0c4a982cfe03c4976919d6ef4e",
      "parents": [
        "4989ee9820799dc37c4076d0652f342499b2ed3c"
      ],
      "author": {
        "name": "Twice",
        "email": "twice.mliu@gmail.com",
        "time": "Sun Dec 21 19:54:10 2025 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sun Dec 21 19:54:10 2025 +0800"
      },
      "message": "build: bump C++ standard to 20 (#3300)\n\nSince rocksdb now requires c++20, we\u0027d better to bump the c++ standard\ntoo so that it\u0027s easy to upgrade rocksdb.\n\nSome changes:\n- logging functions now implemented in macros. due to some changes\nrelated to fmt and c++20.\n- now gcc 11+ or clang 12+ is required. all released in 2021 (4 yrs\nago)."
    },
    {
      "commit": "4989ee9820799dc37c4076d0652f342499b2ed3c",
      "tree": "4600b2db0187b5e35b2adc8fc442bea1989ab1f3",
      "parents": [
        "f64021e95cb8368da00d590a3c23ee5292e35d95"
      ],
      "author": {
        "name": "Twice",
        "email": "twice.mliu@gmail.com",
        "time": "Sun Dec 21 16:30:19 2025 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sun Dec 21 16:30:19 2025 +0800"
      },
      "message": "ci: move license check to check-typos (#3302)\n\nMove license check to check-typos so we don\u0027t need to run all rest\nchecks if there\u0027s a license issue."
    },
    {
      "commit": "f64021e95cb8368da00d590a3c23ee5292e35d95",
      "tree": "b58a227fedad580b3ac8b68b439f2db51a72aec1",
      "parents": [
        "e51d2cc02c6d701bb4d8befa290c89d914e8dcbf"
      ],
      "author": {
        "name": "Twice",
        "email": "twice.mliu@gmail.com",
        "time": "Fri Dec 19 15:57:54 2025 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Dec 19 15:57:54 2025 +0800"
      },
      "message": "ci: execute check-and-lint and build jobs in parallel (#3301)\n\nBefore: \n\ntotal time \u003d time(check-and-lint) + time(build jobs) \u003d ~70min\n\nAfter:\n\ntotal time \u003d max(time(check-and-lint), time(build jobs)) \u003d ~40min"
    },
    {
      "commit": "e51d2cc02c6d701bb4d8befa290c89d914e8dcbf",
      "tree": "4c6fa5efa339cde7b963d9aaf79f81dd243d62cb",
      "parents": [
        "381f88a7987cd1731cdfbb1759f09bc079991d21"
      ],
      "author": {
        "name": "Hao Dong",
        "email": "donghao526@gmail.com",
        "time": "Fri Dec 19 11:40:17 2025 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Dec 19 03:40:17 2025 +0000"
      },
      "message": "feat(tdigest): add the support of TDIGEST.BYRANK and TDIGEST.BYREVRANK command (#3296)\n\nCo-authored-by: Twice \u003ctwice.mliu@gmail.com\u003e\nCo-authored-by: Edward Xu \u003cxuxiangad@foxmail.com\u003e\nCo-authored-by: donghao526 \u003ctonidong@tencent.com\u003e\nCo-authored-by: Copilot \u003c175728472+Copilot@users.noreply.github.com\u003e\n"
    },
    {
      "commit": "381f88a7987cd1731cdfbb1759f09bc079991d21",
      "tree": "4247ca8cc7f55ad41e70737bd8cf3cdf7e9b7527",
      "parents": [
        "65db00a86bc9031f4d974eb0b6f1893bd126c524"
      ],
      "author": {
        "name": "涵曦",
        "email": "im.hanxi@gmail.com",
        "time": "Thu Dec 18 21:51:58 2025 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Dec 18 13:51:58 2025 +0000"
      },
      "message": "feat: add redis-databases option to support SELECT command (#3294)\n\nCloses #3291\n\nImplements redis-select-compatible configuration option that enables\nRedis SELECT command support by mapping database indices to namespaces.\nWhen enabled, SELECT 0-15 commands are translated to namespace switches,\nallowing legacy Redis clients to work seamlessly with Kvrocks.\n\nKey Implementation:\n- redis-select-compatible: Enable/disable SELECT command support\n(default: no)\n- redis-select-db-prefix: Namespace prefix for database mapping\n(default: __db)\n- redis-select-db-count: Number of logical databases (default: 16,\nrange: 1-10000)\n- SELECT \u003cdbid\u003e internally calls SetNamespace({prefix}{dbid}) to switch\ncontext\n- Validates namespace conflicts on startup to prevent data corruption\n\nChanges:\n- Add three new readonly config options in kvrocks.conf\n- Implement SELECT command handler with namespace-based switching\n- Add startup validation to check namespace conflicts\n- Add comprehensive configuration documentation\n\nThis provides native SELECT command support without external proxies,\nmaintaining compatibility with Redis clients while leveraging Kvrocks\u0027\nnamespace architecture.\n\n---------\n\nCo-authored-by: Twice \u003ctwice@apache.org\u003e"
    },
    {
      "commit": "65db00a86bc9031f4d974eb0b6f1893bd126c524",
      "tree": "4eb6b92619c42c24d6c642f622fb573d82367a68",
      "parents": [
        "cbaf4fd9f3a4265d6d4d1c8f63612d557d02a6a6"
      ],
      "author": {
        "name": "Hao Dong",
        "email": "donghao526@gmail.com",
        "time": "Sat Dec 13 21:03:13 2025 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sat Dec 13 13:03:13 2025 +0000"
      },
      "message": "refactor(tdigest): refactor the `TDigest::Rank` `reverse` flag into a compile-time argument (#3268)\n\nCo-authored-by: Twice \u003ctwice.mliu@gmail.com\u003e\nCo-authored-by: Edward Xu \u003cxuxiangad@foxmail.com\u003e\n"
    },
    {
      "commit": "cbaf4fd9f3a4265d6d4d1c8f63612d557d02a6a6",
      "tree": "b1019612a93841001f5cdbe6e8fd1b29a36730e0",
      "parents": [
        "645e1a3acf59fed67833fb077b68d9ef8d4e6839"
      ],
      "author": {
        "name": "Twice",
        "email": "twice.mliu@gmail.com",
        "time": "Sat Dec 13 17:26:20 2025 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sat Dec 13 17:26:20 2025 +0800"
      },
      "message": "ci: apply maximizing build space step to all linux build jobs (#3292)\n\nThis should solve https://github.com/apache/kvrocks/issues/3290."
    },
    {
      "commit": "645e1a3acf59fed67833fb077b68d9ef8d4e6839",
      "tree": "1fe893dc4221564c554e069fb6f198e77d7dc12c",
      "parents": [
        "74f4a513bca2566f307482deaabc2f2aec6fe2ee"
      ],
      "author": {
        "name": "Aleks Lozovyuk",
        "email": "aleks.raiden@gmail.com",
        "time": "Thu Dec 04 16:46:17 2025 +0300"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Dec 04 21:46:17 2025 +0800"
      },
      "message": "chore(ci): bump Golang lint to 2.7.0 (#3289)\n\nBump Golang lint to 2.7.0 (see:\nhttps://golangci-lint.run/docs/product/changelog/#270)\n\nIn fact, bugfix release."
    },
    {
      "commit": "74f4a513bca2566f307482deaabc2f2aec6fe2ee",
      "tree": "773d6c990ae5f04e3a4263738b8e29fa5273c619",
      "parents": [
        "8127eb6fd44c50bb32dc805c7885830cf7be9fc2"
      ],
      "author": {
        "name": "Aleks Lozovyuk",
        "email": "aleks.raiden@gmail.com",
        "time": "Thu Dec 04 08:00:49 2025 +0300"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Dec 04 05:00:49 2025 +0000"
      },
      "message": "chore(deps): Bump zlib-ng to 2.3.2 (#3288)\n\nBump zlib-ng to 2.3.2 (see:\nhttps://github.com/zlib-ng/zlib-ng/releases/tag/2.3.1 because 2.3.2 is\nquick bugfix)\n\n**Key changes**\n\n- Several optimizations and improvements\n- Implement Chorba CRC32\n- Optimize compress_block() and build_tree()\n- Inline some function\n- Add AVX512 version of compare256\n- A lot of optimization for arch: x86, RISC-V, PowerPC, ARM, Loongarch64\n- Use memalign or _aligned_malloc only, when available, fallback to\nmalloc\n- Update build system\n\n---------\n\nCo-authored-by: Twice \u003ctwice.mliu@gmail.com\u003e"
    },
    {
      "commit": "8127eb6fd44c50bb32dc805c7885830cf7be9fc2",
      "tree": "ffc9ef607e99413ee7e8792a5d0824fe634dc534",
      "parents": [
        "cc9e6bde4e98297f77360cce9014a46eff4c6be0"
      ],
      "author": {
        "name": "Aleks Lozovyuk",
        "email": "aleks.raiden@gmail.com",
        "time": "Thu Dec 04 06:22:40 2025 +0300"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Dec 04 03:22:40 2025 +0000"
      },
      "message": "chore(deps): bump jsoncons to v1.5.0 (#3287)\n\nBump jsoncons to v1.5.0 (see:\nhttps://github.com/danielaparker/jsoncons/releases/tag/v1.5.0)\n\n**Key changes**\n\n- Bugfix\n- jsonpointer::unflatten now throws an exception if passed an empty\nobject\n- The functors strict_json_parsing and allow_trailing_commas have been\ndeprecated and will be removed in a future release. Use the\nallow_trailing_comma and allow_comments options instead"
    },
    {
      "commit": "cc9e6bde4e98297f77360cce9014a46eff4c6be0",
      "tree": "22307e93ea6a1b29fa177e0cbad23089686c382e",
      "parents": [
        "e9391650ebc8464af63bbd8e70f99f1ff6f094da"
      ],
      "author": {
        "name": "hulk",
        "email": "hulk.website@gmail.com",
        "time": "Mon Dec 01 21:17:08 2025 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Dec 01 13:17:08 2025 +0000"
      },
      "message": "fix(ci): use the wrong string in sonar action arguments (#3284)\n\nIt should work well now. The following is CI on my repo and it failed at\nmissing SONAR_TOKEN:\nhttps://github.com/git-hulk/kvrocks/actions/runs/19819874006/job/56779553664."
    },
    {
      "commit": "e9391650ebc8464af63bbd8e70f99f1ff6f094da",
      "tree": "bf9ccd524da5f1730e978c865f7fb4e875a90f4c",
      "parents": [
        "a7c51db98f3f2245eb9ff17b3e6a61ef562af808"
      ],
      "author": {
        "name": "hulk",
        "email": "hulk.website@gmail.com",
        "time": "Mon Dec 01 13:40:18 2025 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Dec 01 13:40:18 2025 +0800"
      },
      "message": "fix(ci): the sonar c/cpp action has been deprecated (#3280)\n\n"
    },
    {
      "commit": "a7c51db98f3f2245eb9ff17b3e6a61ef562af808",
      "tree": "ce22b6ec1766799cd6e5a736ba00f1037a84aacb",
      "parents": [
        "2dc7e9ea623b4009e4522b02f4b3ff9ba22618c8"
      ],
      "author": {
        "name": "Raphael",
        "email": "greatsharp@hotmail.com",
        "time": "Thu Nov 27 11:58:52 2025 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Nov 27 03:58:52 2025 +0000"
      },
      "message": "fix(info): the slave lag in INFO command might be overflowed (#3271)\n\nwe found the master_repl_offset is smaller than slave offset during exec\n\"info replication\" command, then the lag value is overflowed\n\neg:\n#Replication\nrole:master\nconnected_slaves:2\nslave0:xxxxxx\nslave1:ip\u003dxxxxx,port\u003dxxxxx,offset\u003d190907912,lag\u003d18446744073709551607\nmaster_repl_offset:190907903"
    },
    {
      "commit": "2dc7e9ea623b4009e4522b02f4b3ff9ba22618c8",
      "tree": "be6126a0f2a41a6e1268c486c3061ebd9c2c44e1",
      "parents": [
        "e19164f032b43c9408a5a0badf53aebeb092d97c"
      ],
      "author": {
        "name": "Raja Nandhan",
        "email": "54595311+var-nan@users.noreply.github.com",
        "time": "Fri Nov 21 02:04:00 2025 -0600"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Nov 21 16:04:00 2025 +0800"
      },
      "message": "feat(ts): add the support of TS.ALTER command (#3264)\n\nIt closes #3214.\n\n---------\n\nCo-authored-by: var-nan \u003ckrs.nandhan999@protonmail.com\u003e\nCo-authored-by: DeEMO \u003cyzzxrx@gmail.com\u003e"
    },
    {
      "commit": "e19164f032b43c9408a5a0badf53aebeb092d97c",
      "tree": "3feb1577547435469f592503513464b4c1974aa5",
      "parents": [
        "62dabea4a8ab1502c4c340053f18f7972b3703df"
      ],
      "author": {
        "name": "Twice",
        "email": "twice.mliu@gmail.com",
        "time": "Sun Nov 16 14:28:02 2025 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sun Nov 16 06:28:02 2025 +0000"
      },
      "message": "ci: disable rockylinux8 due to no-space-left issue (#3263)\n\nI\u0027ve observed that sometimes the rockylinux8 ci fails due to \"No space\nleft on the device\" error:\n-\nhttps://github.com/apache/kvrocks/actions/runs/19390696392/job/55505160831?pr\u003d3260\n-\nhttps://github.com/apache/kvrocks/actions/runs/19385812630/job/55475151645\n\nAnd since it\u0027s in container we cannot do similiar thing like\nhttps://github.com/apache/kvrocks/pull/3261.\n\nSo currently we can just disable it."
    },
    {
      "commit": "62dabea4a8ab1502c4c340053f18f7972b3703df",
      "tree": "f7a5de3eb284134400dfdda30cb4adfd494a39d0",
      "parents": [
        "34a36a1fa24928459f76e28559a6d970fbc55074"
      ],
      "author": {
        "name": "Twice",
        "email": "twice.mliu@gmail.com",
        "time": "Sun Nov 16 12:54:57 2025 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sun Nov 16 04:54:57 2025 +0000"
      },
      "message": "chore: update hat-trie to v0.7.1 (#3260)\n\nRefer to https://github.com/Tessil/hat-trie/commits/v0.7.1."
    },
    {
      "commit": "34a36a1fa24928459f76e28559a6d970fbc55074",
      "tree": "726d0145c29ec8216c76a60f8718aaec74e39fb3",
      "parents": [
        "b28eb40f518a6111227188d09d8bce0443c814e5"
      ],
      "author": {
        "name": "Hao Dong",
        "email": "donghao526@gmail.com",
        "time": "Sat Nov 15 20:49:16 2025 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sat Nov 15 12:49:16 2025 +0000"
      },
      "message": "feat(tdigest): add the support of TDIGEST.RANK command (#3249)\n\nCo-authored-by: tonidong \u003ctonidong@tencent.com\u003e\n"
    },
    {
      "commit": "b28eb40f518a6111227188d09d8bce0443c814e5",
      "tree": "66a05640f9bfdb615766eefda542a1fca3a9c94d",
      "parents": [
        "1df49b0a60450845a2721c53c48d4bfac61a8f85"
      ],
      "author": {
        "name": "Twice",
        "email": "twice.mliu@gmail.com",
        "time": "Sat Nov 15 18:14:44 2025 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sat Nov 15 18:14:44 2025 +0800"
      },
      "message": "ci(riscv): remove toolchain archive and unused packages to save disk space (#3261)\n\nRecently I observed that some riscv CI jobs fail due to \"No space left\non device\", e.g.\nhttps://github.com/apache/kvrocks/actions/runs/19371505965/job/55431064244?pr\u003d3260.\n\nThis PR is trying to solve it."
    },
    {
      "commit": "1df49b0a60450845a2721c53c48d4bfac61a8f85",
      "tree": "1eafaf0d81c80c9823ef1fa63dbfee1dc6e65e54",
      "parents": [
        "91450d84949cd0f6426b87941be8b2d5b95f5ab1"
      ],
      "author": {
        "name": "Twice",
        "email": "twice.mliu@gmail.com",
        "time": "Wed Nov 12 13:20:47 2025 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Nov 12 05:20:47 2025 +0000"
      },
      "message": "build: introduce subcommand fetch-deps in x.py (#3258)\n\nThis is a follow-up PR of https://github.com/apache/kvrocks/pull/3257.\n\nThis PR introduces a new subcommand `fetch-deps` in `x.py`.\n\nSteps to use it:\n- run `./x.py fetch-deps`\n- dependency archives are now in dir `build-deps` (then you can copy it\nto an offline environment)\n- run `./x.py build --dep-dir build-deps` to use these dep archives\n(build without internet)\n\nNote that the default build method `./x.py build` is not changed."
    },
    {
      "commit": "91450d84949cd0f6426b87941be8b2d5b95f5ab1",
      "tree": "9b3a866028313eb0e812feddb2763d50a9562d21",
      "parents": [
        "e5b074aa04313dee32638a4822347f21f120e949"
      ],
      "author": {
        "name": "Twice",
        "email": "twice.mliu@gmail.com",
        "time": "Wed Nov 12 00:17:13 2025 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Nov 11 16:17:13 2025 +0000"
      },
      "message": "build: support to cache archives of fetched dependencies (#3257)\n\nThis patch adds a new cmake variable `DEPS_FETCH_DIR`:\n- fetched dependence archives will be put to this dir;\n- if the archive file in this dir exists, downloading phase will be\nskipped.\n\nHence this patch enables \"offline building\" of kvrocks.\n\nSteps for offline building:\n\n1. in an online environment, fetch kvrocks source repo and run cmake\nwith `-DDEPS_FETCH_DIR\u003d\u003cdep-dir\u003e`.\n2. copy kvrocks source code along with `\u003cdep-dir\u003e` to an offline\nenvironment.\n3. in the offline environment, build kvrocks with\n`-DDEPS_FETCH_DIR\u003d\u003cdep-dir\u003e`.\n\nAn example of files in the dep dir:\n```sh\n$ ll build/deps\ntotal 40M\n-rw-r--r-- 1 twice twice  559K Nov 11 18:44 cpptrace-v1.0.3.zip\n-rw-r--r-- 1 twice twice  747K Nov 11 18:43 fmt-12.1.0.zip\n-rw-r--r-- 1 twice twice  1.1M Nov 11 18:42 gtest-v1.17.0.zip\n-rw-r--r-- 1 twice twice  958K Nov 11 18:42 jemalloc-5.3.0.zip\n-rw-r--r-- 1 twice twice  2.2M Nov 11 18:43 jsoncons-v1.4.3.zip\n-rw-r--r-- 1 twice twice  904K Nov 11 18:43 libevent-release-2.1.12-stable.zip\n-rw-r--r-- 1 twice twice  1.2M Nov 11 18:44 luajit-c0a8e68325ec261a77bde1c8eabad398168ffe74.zip\n-rw-r--r-- 1 twice twice  479K Nov 11 18:42 lz4-v1.10.0.zip\n-rw-r--r-- 1 twice twice  460K Nov 11 18:43 pegtl-3.2.8.zip\n-rw-r--r-- 1 twice twice 1015K Nov 11 18:44 rangev3-0.12.0.zip\n-rw-r--r-- 1 twice twice   15M Nov 11 18:43 rocksdb-v10.6.2.zip\n-rw-r--r-- 1 twice twice  1.2M Nov 11 18:42 snappy-1.2.2-rtti.zip\n-rw-r--r-- 1 twice twice   70K Nov 11 18:43 span-v0.11.0.zip\n-rw-r--r-- 1 twice twice  355K Nov 11 18:43 spdlog-v1.16.0.zip\n-rw-r--r-- 1 twice twice  7.4M Nov 11 18:43 tbb-v2022.3.0.zip\n-rw-r--r-- 1 twice twice   98K Nov 11 18:43 trie-906e6abd1e7063f1dacd3a6b270aa654b525eb0a.zip\n-rw-r--r-- 1 twice twice  1.2M Nov 11 18:43 xxhash-v0.8.3.zip\n-rw-r--r-- 1 twice twice  2.5M Nov 11 18:42 zlib-2.2.4.zip\n-rw-r--r-- 1 twice twice  2.7M Nov 11 18:43 zstd-v1.5.7.zip\n```"
    },
    {
      "commit": "e5b074aa04313dee32638a4822347f21f120e949",
      "tree": "d4be6a5250b0fb91185ce52c32b2a1ffe3238e7f",
      "parents": [
        "4c9edb510d99ac2251f0f00bb4f62758f0516869"
      ],
      "author": {
        "name": "Twice",
        "email": "twice.mliu@gmail.com",
        "time": "Tue Nov 11 22:43:02 2025 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Nov 11 22:43:02 2025 +0800"
      },
      "message": "chore: refine .gitignore to remove useless entries (#3256)\n\nmisc changes to make .gitignore look good."
    }
  ],
  "next": "4c9edb510d99ac2251f0f00bb4f62758f0516869"
}
