)]}'
{
  "log": [
    {
      "commit": "c9ab283ca4aff17a672b80124b1167fde3e89b68",
      "tree": "5d1ff122c712ac471c0c06fb2ec827abdaca2572",
      "parents": [
        "5f228c03040df8a1d98cfe77c8d4abd2ebf574fa",
        "11b7d80049ed7482b73bb7c80f0a1996f4a7cbfb"
      ],
      "author": {
        "name": "Yang,Liming",
        "email": "liming.yang@139.com",
        "time": "Tue Jul 28 14:45:15 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Jul 28 14:45:15 2026 +0800"
      },
      "message": "Merge pull request #3407 from yanglimingcn/feat/attachment_with_checksum\n\nSupport checksumming the attachment together with the body"
    },
    {
      "commit": "5f228c03040df8a1d98cfe77c8d4abd2ebf574fa",
      "tree": "3bf48856352702cf1c31528c9888880d7777293e",
      "parents": [
        "7c1b52253911f4d7359ce2a3b34870d2bcccf714"
      ],
      "author": {
        "name": "Lijin Xiong",
        "email": "legion.xiong@gmail.com",
        "time": "Mon Jul 27 14:49:40 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Jul 27 08:49:40 2026 +0200"
      },
      "message": "Fix race when falling back from RDMA to TCP (#3406)\n\nMake the handshake state atomic and publish RDMA_OFF before\nFALLBACK_TCP. This prevents TCP event handling from observing a\npartially published fallback state. Use a relaxed load for the\ncompletion-path check because it does not consume related data.\n\nSigned-off-by: Lijin Xiong \u003clegion.xiong@gmail.com\u003e\nCo-authored-by: Lijin Xiong \u003clijin.xiong@zstack.io\u003e"
    },
    {
      "commit": "11b7d80049ed7482b73bb7c80f0a1996f4a7cbfb",
      "tree": "45e94aad1c6afd6fd09594eb4d9c125e2471a70d",
      "parents": [
        "e044428713e1980925ac65303a893a67a401edb7"
      ],
      "author": {
        "name": "Yang Liming",
        "email": "liming.yang@139.com",
        "time": "Fri Jul 24 18:24:59 2026 +0800"
      },
      "committer": {
        "name": "Yang Liming",
        "email": "liming.yang@139.com",
        "time": "Mon Jul 27 11:01:39 2026 +0800"
      },
      "message": "Support checksumming the attachment together with the body\n\nController::set_request/response_checksum_type() previously only\ncovered the serialized protobuf body; the attachment (if any) was\nnever protected. Add set_request/response_checksum_attachment(bool)\nso callers can opt the attachment into the same checksum.\n\n- baidu_rpc_meta.proto: add RpcMeta.checksum_with_attachment so the\n  receiver knows whether to fold the attachment into verification.\n  Defaults to false, so old peers that don\u0027t understand the field\n  keep verifying against the body only (backward compatible).\n- Controller: add the two setters/getters, thread the flag through\n  ClientSettings (Save/ApplyClientSettings) so ParallelChannel/\n  SelectiveChannel sub-controllers inherit it correctly, and reset it\n  in ResetPods().\n- ChecksumIn: add an optional `attachment\u0027 field consumed by checksum\n  handlers.\n- crc32c_checksum.cpp: extend the crc32c over body then attachment (in\n  that fixed order) when requested.\n- baidu_rpc_protocol.cpp: wire checksum_attachment through\n  SerializeRpcMessage/DeserializeRpcMessage and every client/server\n  send/receive path; skip it when progressive attachment reading is\n  enabled since there\u0027s no single complete IOBuf to checksum in that\n  case.\n\nAdd brpc_checksum_unittest.cpp covering Crc32cCompute/Crc32cVerify\ndirectly (including corruption/omission/order sensitivity) and an\nend-to-end Server/Channel test for both request- and response-side\nattachment checksums.\n"
    },
    {
      "commit": "7c1b52253911f4d7359ce2a3b34870d2bcccf714",
      "tree": "9e601b88583b379fb7d04dc67a8dd27b8eb39327",
      "parents": [
        "e044428713e1980925ac65303a893a67a401edb7"
      ],
      "author": {
        "name": "UB",
        "email": "ubed@bugqore.com",
        "time": "Sun Jul 26 15:26:42 2026 +0530"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sun Jul 26 17:56:42 2026 +0800"
      },
      "message": "Fix use-after-free of the new block in SingleIOBuf::assign (#3397)\n\nSigned-off-by: ubeddulla khan \u003cubed@bugqore.com\u003e"
    },
    {
      "commit": "e044428713e1980925ac65303a893a67a401edb7",
      "tree": "16d219688632de78e3aa568f4d124ef2f80bdd98",
      "parents": [
        "5197621b915084ac9ca357763c6870d086cd7e12"
      ],
      "author": {
        "name": "darion-yaphet",
        "email": "darion.yaphets@gmail.com",
        "time": "Wed Jul 22 23:41:08 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Jul 22 23:41:08 2026 +0800"
      },
      "message": "refactor(bvar): replace NULL with nullptr (#3403)\n\nModernize pointer null literals across bvar sources for C++11\nconsistency, including pthread APIs and related comments."
    },
    {
      "commit": "5197621b915084ac9ca357763c6870d086cd7e12",
      "tree": "2c60d735ca9e37f0ee92bb5ef53f684603c0863a",
      "parents": [
        "d026d69be06d11f27d5fe568b83ce36427abc984"
      ],
      "author": {
        "name": "Felix-Gong",
        "email": "gongxiaofei24@iscas.ac.cn",
        "time": "Wed Jul 22 17:00:33 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Jul 22 17:00:33 2026 +0800"
      },
      "message": "Optimize StringPiece memcmp/memchr for RISC-V with RVV (#3396)\n\nThis patch adds RVV-accelerated memcmp and memchr for StringPiece operations\non RISC-V 64-bit platforms.\n\nThe implementation follows glibc\u0027s official RVV memcmp/memchr patterns:\n- e8m8 LMUL for maximum throughput\n- Hardware-adaptive vector length via vsetvl\n- vfirst.m for early-out on first difference/match\n\nPerformance on SOPHGO SG2044 (RVV 1.0, VLEN \u003e\u003d 128, GCC 15.1):\nglibc 2.38 scalar memcmp (no RVV acceleration) as baseline.\n\n  memcmp (worst-case full scan, 50000 iterations):\n    64 B:   20 ns -\u003e   6 ns  (3.4x)\n   256 B:   54 ns -\u003e  15 ns  (3.6x)\n     1 KB: 120 ns -\u003e  55 ns  (2.2x)\n     4 KB: 435 ns -\u003e 225 ns  (1.9x)\n    16 KB: 1968 ns -\u003e 1258 ns (1.6x)\n    64 KB: 10962 ns -\u003e 9044 ns (1.2x)\n   256 KB: 46893 ns -\u003e 43108 ns (1.1x)\n     1 MB: 446161 ns -\u003e 454717 ns (1.01x)\n\n  memchr (worst-case full scan, 50000 iterations):\n    64 B:    5 ns -\u003e  0.9 ns  (5.8x)\n   256 B:   12 ns -\u003e   3 ns  (4.0x)\n     1 KB:   40 ns -\u003e  12 ns  (3.3x)\n     4 KB:  148 ns -\u003e  44 ns  (3.4x)\n    16 KB:  558 ns -\u003e 158 ns  (3.5x)\n    64 KB: 2150 ns -\u003e  635 ns (3.4x)\n   256 KB: 9200 ns -\u003e 2900 ns (3.2x)\n     1 MB: 39000 ns -\u003e 13000 ns (3.0x)\n\nCorrectness:\n  - 59/59 expanded correctness tests passed (64B - 1MB)\n  - string_piece_unittest: 24/24 passed\n  - test_butil: 724/725 passed (1 pre-existing StackTrace failure)\n  - test_bvar: 64/64 passed\n\nFiles changed:\n  - src/butil/string_compare_rvv.cc (new): RVV memcmp + memchr implementations\n  - src/butil/strings/string_piece.h: RVV dispatch declarations\n  - src/butil/strings/string_piece.cc: RVV dispatch in find(char) for memchr\n  - BUILD.bazel: added string_compare_rvv.cc to BUTIL_SRCS\n  - CMakeLists.txt: added string_compare_rvv.cc\n  - Makefile: added string_compare_rvv.cc\n\nSigned-off-by: Xiaofei Gong \u003cgongxiaofei24@iscas.ac.cn\u003e\nSigned-off-by: YuanSheng \u003cyuansheng@isrc.iscas.ac.cn\u003e"
    },
    {
      "commit": "d026d69be06d11f27d5fe568b83ce36427abc984",
      "tree": "4a8d9e9d613c7e59426248192d9a62df7fc5d2f3",
      "parents": [
        "f818ebc05bd8f1b9a260faff2623aad615d511a4"
      ],
      "author": {
        "name": "Felix-Gong",
        "email": "gongxiaofei24@iscas.ac.cn",
        "time": "Wed Jul 22 11:19:10 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Jul 22 11:19:10 2026 +0800"
      },
      "message": "Optimize StringPiece memcmp for RISC-V with RVV (#3390)\n\n* optimize StringPiece memcmp for RISC-V with RVV\n\nThis patch adds RVV-accelerated memcmp for StringPiece operations\non RISC-V 64-bit platforms.\n\nThe implementation follows glibc\u0027s official RVV pattern:\n- e8m8 LMUL for maximum throughput\n- Hardware-adaptive vector length via vsetvl\n- vfirst.m for early-out on first difference\n\nPerformance on SOPHGO SG2044 (RVV 1.0, VLEN \u003e\u003d 128, GCC 15.1):\nglibc 2.38 scalar memcmp (no RVV acceleration) as baseline.\n\n  memcmp (worst-case full scan, 50000 iterations):\n    64 B:   20 ns -\u003e   6 ns  (3.4x)\n   256 B:   54 ns -\u003e  15 ns  (3.6x)\n     1 KB: 120 ns -\u003e  55 ns  (2.2x)\n     4 KB: 435 ns -\u003e 225 ns  (1.9x)\n    16 KB: 1968 ns -\u003e 1258 ns (1.6x)\n    64 KB: 10962 ns -\u003e 9044 ns (1.2x)\n   256 KB: 46893 ns -\u003e 43108 ns (1.1x)\n     1 MB: 446161 ns -\u003e 454717 ns (1.01x)\n\nCorrectness:\n  - 59/59 expanded correctness tests passed (64B - 1MB)\n  - string_piece_unittest: 24/24 passed\n  - test_butil: 724/725 passed (1 pre-existing StackTrace failure)\n  - test_bvar: 64/64 passed\n\nFiles changed:\n  - src/butil/string_compare_rvv.cc (new): RVV memcmp implementation\n  - src/butil/strings/string_piece.h: RVV dispatch in wordmemcmp (N \u003e\u003d 16)\n  - BUILD.bazel: added string_compare_rvv.cc to BUTIL_SRCS\n  - CMakeLists.txt: added string_compare_rvv.cc\n\nSigned-off-by: Xiaofei Gong \u003cgongxiaofei24@iscas.ac.cn\u003e\nSigned-off-by: YuanSheng \u003cyuansheng@isrc.iscas.ac.cn\u003e\n\n* optimize StringPiece memcmp for RISC-V with RVV\n\nThis patch adds RVV-accelerated memcmp for StringPiece operations\non RISC-V 64-bit platforms.\n\nThe implementation follows glibc\u0027s official RVV pattern:\n- e8m8 LMUL for maximum throughput\n- Hardware-adaptive vector length via vsetvl\n- vfirst.m for early-out on first difference\n\nPerformance on SOPHGO SG2044 (RVV 1.0, VLEN \u003e\u003d 128, GCC 15.1):\nglibc 2.38 scalar memcmp (no RVV acceleration) as baseline.\n\n  memcmp (worst-case full scan, 50000 iterations):\n    64 B:   20 ns -\u003e   6 ns  (3.4x)\n   256 B:   54 ns -\u003e  15 ns  (3.6x)\n     1 KB: 120 ns -\u003e  55 ns  (2.2x)\n     4 KB: 435 ns -\u003e 225 ns  (1.9x)\n    16 KB: 1968 ns -\u003e 1258 ns (1.6x)\n    64 KB: 10962 ns -\u003e 9044 ns (1.2x)\n   256 KB: 46893 ns -\u003e 43108 ns (1.1x)\n     1 MB: 446161 ns -\u003e 454717 ns (1.01x)\n\nCorrectness:\n  - 59/59 expanded correctness tests passed (64B - 1MB)\n  - string_piece_unittest: 24/24 passed\n  - test_butil: 724/725 passed (1 pre-existing StackTrace failure)\n  - test_bvar: 64/64 passed\n\nFiles changed:\n  - src/butil/string_compare_rvv.cc (new): RVV memcmp implementation\n  - src/butil/strings/string_piece.h: RVV dispatch in wordmemcmp (N \u003e\u003d 16)\n  - BUILD.bazel: added string_compare_rvv.cc to BUTIL_SRCS\n  - CMakeLists.txt: added string_compare_rvv.cc\n\nSigned-off-by: Xiaofei Gong \u003cgongxiaofei24@iscas.ac.cn\u003e\nSigned-off-by: YuanSheng \u003cyuansheng@isrc.iscas.ac.cn\u003e\n\n* add string_compare_rvv.cc to Makefile BUTIL_SOURCES\n\n---------\n\nSigned-off-by: Xiaofei Gong \u003cgongxiaofei24@iscas.ac.cn\u003e\nSigned-off-by: YuanSheng \u003cyuansheng@isrc.iscas.ac.cn\u003e"
    },
    {
      "commit": "f818ebc05bd8f1b9a260faff2623aad615d511a4",
      "tree": "b2d1626bc644948e1e525dd4e2e9612835a94bbc",
      "parents": [
        "6a8bbc7f92f222d227cc61754983c574fa6b6acd"
      ],
      "author": {
        "name": "UB",
        "email": "ubed@bugqore.com",
        "time": "Wed Jul 22 08:45:03 2026 +0530"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Jul 22 11:15:03 2026 +0800"
      },
      "message": "Guard negative value_size in memcache PopStore (#3392)\n\n* guard negative value_size in memcache PopStore\n\nSigned-off-by: ubeddulla khan \u003cubed@bugqore.com\u003e\n\n* memcache: drop only the declared message when value_size is negative\n\nMove the value_size \u003c 0 check ahead of the pop_front so a malformed\nreply no longer pops sizeof(header) + extras_length + key_length past\nthe declared message boundary. Discard exactly\nsizeof(header) + total_body_length instead, keeping the following\npipelined responses aligned.\n\nSigned-off-by: ubeddulla khan \u003cubed@bugqore.com\u003e\n\n---------\n\nSigned-off-by: ubeddulla khan \u003cubed@bugqore.com\u003e"
    },
    {
      "commit": "6a8bbc7f92f222d227cc61754983c574fa6b6acd",
      "tree": "4ce11148576c3ec173210c9bbdb31f18b71f16fb",
      "parents": [
        "a80df6fa2ab760a004403a4c91b29e773ae6f167",
        "e2172be6e5433302e79cef9911adcd3e4564908f"
      ],
      "author": {
        "name": "Yang,Liming",
        "email": "liming.yang@139.com",
        "time": "Tue Jul 21 17:02:50 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Jul 21 17:02:50 2026 +0800"
      },
      "message": "Merge pull request #3352 from chenBright/ece\n\nSupport end-to-end ECE negotiation in RDMA handshake V3"
    },
    {
      "commit": "a80df6fa2ab760a004403a4c91b29e773ae6f167",
      "tree": "29e0ffdd2fec80da67966434256d575dc67b4ac3",
      "parents": [
        "f094566f54359ed4a3a1fffa61927356e5888863"
      ],
      "author": {
        "name": "UB",
        "email": "ubed@bugqore.com",
        "time": "Tue Jul 21 08:02:01 2026 +0530"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Jul 21 10:32:01 2026 +0800"
      },
      "message": "Read GOAWAY fields before additional debug data (#3395)\n\nSigned-off-by: ubeddulla khan \u003cubed@bugqore.com\u003e"
    },
    {
      "commit": "f094566f54359ed4a3a1fffa61927356e5888863",
      "tree": "b8916447b539cbdf6aa9c2475d549ee2ab0e96b9",
      "parents": [
        "72bf13a3957eee22dbc6293605080e846b9054a0"
      ],
      "author": {
        "name": "darion-yaphet",
        "email": "darion.yaphets@gmail.com",
        "time": "Tue Jul 21 09:26:06 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Jul 21 09:26:06 2026 +0800"
      },
      "message": "build(example): extract shared CMake dependency helper for examples (#3391)\n\nExample CMakeLists duplicated the same dependency discovery and link\nsetup. Move that into brpc_example_find_common_deps in\nBrpcExample.cmake, migrate MySQL and other examples to use it, and\nimplement the helper as a macro so CMAKE_PREFIX_PATH, include paths,\nand DYNAMIC_LIB propagate to the caller scope.\nExample-specific deps stay local (e.g. readline/ncurses/thriftnb for\nMySQL, gperftools for redis/http). LINK_SO behavior is unchanged."
    },
    {
      "commit": "72bf13a3957eee22dbc6293605080e846b9054a0",
      "tree": "d042593909a31591b2b8e93b38a0300b0ffcc3ec",
      "parents": [
        "881077d15bce70df3cec46ed59dfaaf95aa2993b"
      ],
      "author": {
        "name": "Chuang Zhang",
        "email": "zchuang185@gmail.com",
        "time": "Sun Jul 19 13:02:08 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sun Jul 19 13:02:08 2026 +0800"
      },
      "message": "Interconnecting with the UBShmTransport Based on the LD/ST Shared Memory Semantics. (#3290)\n\n* add ubring transport\n\n* fix the  bug for ub ring transport\n\n* fix the  bug for ub ring transport and other\n\n* add the license for ub transport\n\n* Modifying the variable naming style\n\n* optimize the log message and some field name\n\n* fix some bug for ubring\n\n* add some log ubring endpoint\n\n* add todo\n\n* fix the bug for handshake for ub endpoint\n\n* fix the bug for client ub endpoint\n\n* optimize the iobuf file code\n\n* modify the log level\n\n* fix the declare_shm_ubs define not found bug\n\n* add the timer_mgr support for macos and format code style\n\n* fix the bug for macos epoll\n\n* fix the timespece bug\n\n* adaptor the itimerspec for macos platform\n\n* optimize the cmakelist config\n\n* add the ubring docs for ubring transport\n\n* modify some file name and directory structure\n\n* modify some code style and optimize code logical\n\n* add the cmake ubshm transport ci/testing\n\n* add the dependency header\n\n* bug fix the code\n\n* Fix UB shm allocation cleanup crashes (#11)\n\nCo-authored-by: 郭业昌 \u003clvpengfei@MacBook-Air.local\u003e\n\n* remove the brpc_ubshm_unittest\n\n* Found and fixed two stability issues (#13)\n\n* 修复ubring server端关闭连接coredump问题\n\n* 修复PollIn/PollOut解引用已释放Socket指针的问题\n\nPollIn/PollOut通过ep-\u003e_socket(裸指针)读取data socket,当data socket\n被销毁时该指针悬空,导致Socket::Address读到垃圾id触发SIGSEGV。\n改为存储_socket_id(SocketId),用Address获取引用计数的Socket,\n并在整个回调期间持有该引用,避免解引用悬空指针。\n\n* 修复client非正常退出导致UBRING shm残留的问题\n\nclient被强杀(SIGTERM/崩溃/OOM)时teardown没跑完,localShm(_C)的\nshm_unlink未执行,导致/dev/shm残留_C文件。server的remoteShm只munmap\n不unlink(正确),无法清理client的名字。\n\n在握手ESTABLISHED时(client/server都确认对方已mmap自己的localShm)\n立即unlink localShm名字。此时对端已持有mmap引用,unlink只删名字不\n影响通信;进程任意时刻退出都不会残留文件名。\n\n* Address chenBright\u0027s review: use English comments and BAIDU_CACHELINE_ALIGNMENT\n\n- Convert all Chinese comments in ubshm to English (per chenBright\u0027s\n  \u0027Please use English\u0027 on ub_endpoint.cpp:723, ub_ring.cpp:337,\n  shm_ubs.cpp:316, and similar)\n- Replace __attribute__((aligned(64))) with BAIDU_CACHELINE_ALIGNMENT\n  in ubr_msg.h (per chenBright\u0027s comment on ubr_msg.h:41)\n- Remove unnecessary TODO comment in ub_ring.cpp:551 (per chenBright\u0027s\n  \u0027Unnecessary comments, please delete\u0027)\n\n* Remove unused lock macros in thread_lock.h\n\nPer chenBright\u0027s review, the functions and macros defined in\nthread_lock.h are largely unused. Verified usage across ubshm:\n- LOCK_GUARD / UnlockMutex: 8 call sites in shm_ubs.cpp and\n  ub_ring_manager.cpp, kept.\n- SPIN_LOCK_GUARD, R_LOCK_GUARD, W_LOCK_GUARD, SEMAPHORE_WAIT_GUARD,\n  SEMAPHORE_WAIT_GUARD_WITH_CLOSE and their helper functions\n  (UnlockSpinLock, UnlockRWLock, PostSem, PostSemWithClose): 0 call\n  sites, removed.\n\n* Apply chenBright\u0027s review on timer_mgr globals\n\nPer chenBright\u0027s review on timer_mgr.cpp:32-37:\n- Add explicit default values to uninitialized globals\n  (g_total_timer_num\u003d0, g_max_system_fd\u003d0, g_epoll_execute_thread\u003d0,\n  g_timer_module_initialized\u003d0)\n- Rename globals to snake_case (g_epollFd -\u003e g_epoll_fd,\n  g_totalTimerNum -\u003e g_total_timer_num, g_timerFdCtxMap -\u003e\n  g_timer_fd_ctx_map, maxSystemFd -\u003e g_max_system_fd,\n  g_epollExecuteThread -\u003e g_epoll_execute_thread,\n  g_timerModuleInitialized -\u003e g_timer_module_initialized)\n- maxSystemFd also gains the g_ prefix to match global naming style\n\nAlso fix the missing std:: qualifier on atomic_fetch_sub/add/load\n(per chenBright\u0027s earlier comment on timer_mgr.cpp:80).\n\n* Change CloseTimerFd fd type from uint32_t to int\n\nPer chenBright\u0027s review on timer_mgr.cpp:399 (uint32_t -\u003e int).\nfd is a system file descriptor; POSIX APIs use int and -1 denotes an\ninvalid fd, which uint32_t cannot represent. Changed the CloseTimerFd\nsignature (header + definition) and removed the now-unnecessary\n(uint32_t) casts at the two call sites.\n\n* Use BAIDU_LIKELY/BAIDU_UNLIKELY instead of custom __builtin_expect\n\nPer chenBright\u0027s review on common.h:27. Rather than redefine the\nmacros with __builtin_expect directly, forward LIKELY/UNLIKELY to\nbrpc\u0027s standard BAIDU_LIKELY/BAIDU_UNLIKELY (from butil/compiler_specific.h).\nThe 122 call sites keep using LIKELY()/UNLIKELY() unchanged; only the\nmacro bodies change, preserving semantics.\n\n* Add unit tests for UBShmEndpoint\n\nPer chenBright\u0027s request to add unit tests for UBShmTransport in this\nPR (rather than a follow-up).\n\nAdds test/brpc_ubring_unittest.cpp with tests covering the public\ninterface of UBShmEndpoint under the g_skip_ub_init\u003dtrue mode (which\nskips real shared-memory/poller setup):\n- construct_and_destruct: lifecycle safety\n- is_writable_false_when_skip_init: skip-mode behavior\n- reset_is_idempotent: Reset() is safe to call repeatedly\n\nThe file follows the brpc_*_unittest.cpp naming convention so it is\nauto-collected by test/CMakeLists.txt\u0027s file(GLOB). Verified: compiles,\nlinks, and all 3 tests pass (g++ 15.2, C++17, gtest, BRPC_WITH_UBRING\u003dON).\n\n* Rewrite UBShmEndpoint unit tests with real coverage\n\nPer chenBright\u0027s feedback that the previous tests were too simple and\ndid not cover the main methods.\n\nSource changes to enable testing:\n- Move HelloMessage struct declaration from ub_endpoint.cpp to\n  ub_endpoint.h so tests can access it\n- Expose private members under #ifdef UNIT_TEST (precedent:\n  butil/containers/stack_container.h) so tests can call\n  AllocateClientResources without -Dprivate\u003dpublic (which breaks\n  GCC 15 + new libstdc++ \u003cany\u003e/\u003csstream\u003e)\n\nTests (9, all passing on Ubuntu 26.04 g++ 15.2 C++17 gtest):\nHelloMessageTest (5): serialize/deserialize roundtrip, network byte\norder verification, uint64 max boundary, full shm_name, toString\nUBShmEndpointTest (4): construct, real IPC shm\nAllocateClientResources (g_skip_ub_init\u003dfalse), reset cleanup, reset\nidempotency\n\n* rename the variable to snake_case style\n\n---------\n\nCo-authored-by: YeChang Guo \u003c52730608+YChange01@users.noreply.github.com\u003e\nCo-authored-by: 郭业昌 \u003clvpengfei@MacBook-Air.local\u003e\nCo-authored-by: gure \u003c740684863@qq.com\u003e"
    },
    {
      "commit": "e2172be6e5433302e79cef9911adcd3e4564908f",
      "tree": "9372483303e3833c8d60bdfc60e4e15851c07899",
      "parents": [
        "881077d15bce70df3cec46ed59dfaaf95aa2993b"
      ],
      "author": {
        "name": "chenBright",
        "email": "chenguangmingfe@foxmail.com",
        "time": "Fri Jun 19 23:43:45 2026 +0800"
      },
      "committer": {
        "name": "chenBright",
        "email": "chenguangmingfe@foxmail.com",
        "time": "Sun Jul 19 01:03:20 2026 +0800"
      },
      "message": "Support end-to-end ECE negotiation in RDMA handshake V3\n\nPreviously BringUpQp only did a local ibv_query_ece + ibv_set_ece\nroundtrip and never exchanged ECE capabilities with the peer.\nThis patch wires up the standard requestor/responder ECE negotiation\nflow on top of the existing v3 handshake without adding any extra\nround trip:\n\n1. Client queries local ECE, advertises it in its v3 hello.\n\n2. Server applies the client\u0027s ECE in INIT-\u003eRTR (set_ece), then\n   after RTS queries the reduced/negotiated ECE and sends it back\n   in the reply hello.\n\n3. Client applies the server\u0027s reduced ECE in INIT-\u003eRTR.\n"
    },
    {
      "commit": "881077d15bce70df3cec46ed59dfaaf95aa2993b",
      "tree": "7dc5d79dd5cf69b71999c65f5c2470ce7a78cad6",
      "parents": [
        "853fa6bede7d34ca950f7f6166ca9a5ae206f0c2"
      ],
      "author": {
        "name": "Bright Chen",
        "email": "chenguangmingfe@foxmail.com",
        "time": "Sat Jul 18 17:42:52 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sat Jul 18 17:42:52 2026 +0800"
      },
      "message": "Support RDMA handshake protocol (#3350)\n\n* Support RDMA handshake protocol\n\n* Fix comment"
    },
    {
      "commit": "853fa6bede7d34ca950f7f6166ca9a5ae206f0c2",
      "tree": "d54943556e72b8b3bd1712a1c382a752226e4766",
      "parents": [
        "92a0aba3165eb01ebca19e659414c29a6fe95753"
      ],
      "author": {
        "name": "sunhao",
        "email": "sunhao_bupt@163.com",
        "time": "Sat Jul 18 16:50:30 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sat Jul 18 16:50:30 2026 +0800"
      },
      "message": "fix: set socket buffer options before connect (#3368)"
    },
    {
      "commit": "92a0aba3165eb01ebca19e659414c29a6fe95753",
      "tree": "d93748074b5a69a65cef9f917daf63219a35d6d2",
      "parents": [
        "e5ff754b316d3bdceea6581d19af298f0f0d6f9c",
        "af2d3e158629c8440f598865c9be22bcf980dcee"
      ],
      "author": {
        "name": "Yang,Liming",
        "email": "liming.yang@139.com",
        "time": "Sat Jul 18 12:59:13 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sat Jul 18 12:59:13 2026 +0800"
      },
      "message": "Merge pull request #3394 from altman08/dev\n\nbthread: convert ADD/SUB_TLS_PTHREAD_LOCK_COUNT macros to inline function"
    },
    {
      "commit": "af2d3e158629c8440f598865c9be22bcf980dcee",
      "tree": "d93748074b5a69a65cef9f917daf63219a35d6d2",
      "parents": [
        "e5ff754b316d3bdceea6581d19af298f0f0d6f9c"
      ],
      "author": {
        "name": "altman08",
        "email": "936396749@qq.com",
        "time": "Fri Jul 17 19:40:01 2026 +0800"
      },
      "committer": {
        "name": "altman08",
        "email": "936396749@qq.com",
        "time": "Fri Jul 17 19:40:01 2026 +0800"
      },
      "message": "bthread: convert ADD/SUB_TLS_PTHREAD_LOCK_COUNT macros to inline functions\n\nReplace the function-like macros ADD_TLS_PTHREAD_LOCK_COUNT and\nSUB_TLS_PTHREAD_LOCK_COUNT with inline functions\nAddTlsPthreadLockCount() and SubTlsPthreadLockCount() (with matching\nno-op definitions in the BRPC_DEBUG_BTHREAD_SCHE_SAFETY\u003d0 branch).\nMacros lack type safety and scoping, so encapsulating the logic in\nregular functions is clearer and safer while keeping the same\nbehavior. All call sites are updated accordingly.\n"
    },
    {
      "commit": "e5ff754b316d3bdceea6581d19af298f0f0d6f9c",
      "tree": "331a3c45fd572e498cc5e3170245119c1ed6f013",
      "parents": [
        "868f381c52868c39273fdafdd4499b3c200cad2f",
        "ef64bc1e0ac036a94b1ea358e4ea55c447ed684a"
      ],
      "author": {
        "name": "Yang,Liming",
        "email": "liming.yang@139.com",
        "time": "Fri Jul 17 19:26:32 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Jul 17 19:26:32 2026 +0800"
      },
      "message": "Merge pull request #3393 from altman08/dev\n\nbthread: use BAIDU_GET_VOLATILE_THREAD_LOCAL to access tls_unique_use…"
    },
    {
      "commit": "ef64bc1e0ac036a94b1ea358e4ea55c447ed684a",
      "tree": "331a3c45fd572e498cc5e3170245119c1ed6f013",
      "parents": [
        "868f381c52868c39273fdafdd4499b3c200cad2f"
      ],
      "author": {
        "name": "altman08",
        "email": "936396749@qq.com",
        "time": "Fri Jul 17 18:45:26 2026 +0800"
      },
      "committer": {
        "name": "altman08",
        "email": "936396749@qq.com",
        "time": "Fri Jul 17 18:45:26 2026 +0800"
      },
      "message": "bthread: use BAIDU_GET_VOLATILE_THREAD_LOCAL to access tls_unique_user_ptr in sched_to\n\ntls_unique_user_ptr was read directly without going through the\nBAIDU_GET_VOLATILE_THREAD_LOCAL macro in TaskGroup::sched_to, while\nthe paired write later in the same function correctly used\nBAIDU_SET_VOLATILE_THREAD_LOCAL. sched_to contains jump_stack, a\nsuspend-point where GCC (aarch64) and Clang may incorrectly cache\nthe address of a thread_local variable, which is exactly the hazard\nBAIDU_GET_VOLATILE_THREAD_LOCAL is designed to avoid. Fix the read to\nuse the macro for consistency and correctness.\n"
    },
    {
      "commit": "868f381c52868c39273fdafdd4499b3c200cad2f",
      "tree": "5536efdb557dd49beb1988bc9a43a926d2aa1022",
      "parents": [
        "796666368ac775e876be28645d4bbebe89a3ad07"
      ],
      "author": {
        "name": "stdpain",
        "email": "34912776+stdpain@users.noreply.github.com",
        "time": "Fri Jul 17 15:49:41 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Jul 17 15:49:41 2026 +0800"
      },
      "message": "Reclaim unscheduled timer tasks instead of holding slots until run_time (#3384)\n\nTimerThread only reclaims a Task\u0027s pooled slot when the task is popped at\nits run_time. A task unscheduled after being pulled into the internal heap\ntherefore keeps its slot until run_time, and tasks that pile up in the\nbuckets while the thread sleeps on a far-future deadline are not consumed\n(and thus not reclaimed) until that deadline. With large timeouts the live\nTask count grows to ~ qps * timeout even though almost all of those tasks\nwere unscheduled long ago.\n\nAdd two independent, bounded reclamation paths:\n\n- Heap sweep: when the internal heap grows past\n  brpc_timer_heap_sweep_min_size (default 4096) and has roughly doubled\n  since the last sweep, drop unscheduled tasks from it. The trigger is a\n  timer-thread-local heuristic, so the unschedule() hot path is unchanged\n  (no new shared atomics/contention). Amortized O(1) per task.\n\n- Periodic wakeup: cap the sleep at brpc_timer_max_wakeup_interval_ms\n  (default 0 \u003d disabled, legacy behavior) so the thread wakes up to drain\n  the buckets and sweep the heap even when every pending task is far in\n  the future. An empty heap still sleeps until woken by schedule().\n\nExpose pending_task_count() and allocated_task_count() for observability,\nand add unit tests covering both the heap-retention and bucket-accumulation\ncases (each verified to fail with the corresponding fix disabled)."
    },
    {
      "commit": "796666368ac775e876be28645d4bbebe89a3ad07",
      "tree": "8acafe81d4fe70eadbfe14622918e364b503245c",
      "parents": [
        "841aab132fea97ab95f796bc30249632ae57d4ee"
      ],
      "author": {
        "name": "UB",
        "email": "ubed@bugqore.com",
        "time": "Thu Jul 16 14:49:06 2026 +0530"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Jul 16 17:19:06 2026 +0800"
      },
      "message": "Fix char-signedness out-of-bounds read in url and header lookup tables (#3376)\n\n* fix char-signedness out-of-bounds read in url and header lookup tables\n\n* test: cover high-bit bytes in uri and ascii_tolower lookups\n\nSigned-off-by: ubeddulla khan \u003cubed@bugqore.com\u003e\n\n---------\n\nSigned-off-by: ubeddulla khan \u003cubed@bugqore.com\u003e"
    },
    {
      "commit": "841aab132fea97ab95f796bc30249632ae57d4ee",
      "tree": "426d0139795c280cc2bd48dfbe372b705ee4f852",
      "parents": [
        "7c27076255b9fe15bd88a250f73eede95904eb35"
      ],
      "author": {
        "name": "UB",
        "email": "ubed@bugqore.com",
        "time": "Thu Jul 16 14:45:40 2026 +0530"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Jul 16 17:15:40 2026 +0800"
      },
      "message": "Avoid undefined shift in hpack DecodeInteger on crafted integer (#3379)\n\n* avoid undefined shift in hpack DecodeInteger on crafted integer\n\n* hpack: rate-limit and specialize over-long integer log message\n\nSigned-off-by: ubeddulla khan \u003cubed@bugqore.com\u003e\n\n---------\n\nSigned-off-by: ubeddulla khan \u003cubed@bugqore.com\u003e"
    },
    {
      "commit": "7c27076255b9fe15bd88a250f73eede95904eb35",
      "tree": "ec236ebf148a8a6fe9e2556892fd5dcdc2f27579",
      "parents": [
        "359e8f57ecbe8cc6804a0bec342fdf11960ff415"
      ],
      "author": {
        "name": "UB",
        "email": "ubed@bugqore.com",
        "time": "Thu Jul 16 14:42:34 2026 +0530"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Jul 16 17:12:34 2026 +0800"
      },
      "message": "Check field length against remaining buffer in mysql Field::Parse (#3381)\n\n* check field length against remaining buffer in mysql Field::Parse\n\nSigned-off-by: ubeddulla khan \u003cubed@bugqore.com\u003e\n\n* test: reject oversized text field length in MysqlReply parse\n\nSigned-off-by: ubeddulla khan \u003cubed@bugqore.com\u003e\n\n---------\n\nSigned-off-by: ubeddulla khan \u003cubed@bugqore.com\u003e"
    },
    {
      "commit": "359e8f57ecbe8cc6804a0bec342fdf11960ff415",
      "tree": "5684d0993ce23939f6bd0b7f64a411809b29cc69",
      "parents": [
        "2e20ccb705a948b61c24f813a1fd5a610e3636b9"
      ],
      "author": {
        "name": "darion-yaphet",
        "email": "darion.yaphets@gmail.com",
        "time": "Thu Jul 16 17:10:43 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Jul 16 17:10:43 2026 +0800"
      },
      "message": "fix(build): clean up redundant warning sources (#3385)\n\n* fix(build): clean up redundant warning sources\n\nRemove redundant pthread linkage from protoc-gen-mcpack targets and quiet compiler warnings from unused rpcz/couchbase code paths and non-x86 iobuf builds.\n\n* fix(couchbase): preserve C++11 warning suppression\n\nUse brpc\u0027s existing ALLOW_UNUSED macro on Couchbase vbucket constants so the declarations keep silencing platform-specific unused-constant warnings without requiring C++17 attributes."
    },
    {
      "commit": "2e20ccb705a948b61c24f813a1fd5a610e3636b9",
      "tree": "a24b9813c04cb29f0dc439b07956296ce1fd9489",
      "parents": [
        "2f1a7e18145593b00e7983591b8870b6991cfb15"
      ],
      "author": {
        "name": "lo-tk",
        "email": "1351734494@qq.com",
        "time": "Thu Jul 16 17:09:22 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Jul 16 17:09:22 2026 +0800"
      },
      "message": "Fix SetHostSocket when add stream failed (#3386)\n\nCo-authored-by: luocongkai \u003cluocongkai@bytedance.com\u003e"
    },
    {
      "commit": "2f1a7e18145593b00e7983591b8870b6991cfb15",
      "tree": "158de17b65c0829da5d10c34d3173fc7d91afdfd",
      "parents": [
        "c9b34f23b463f84d5fc193d6222fe6652523d854"
      ],
      "author": {
        "name": "Felix-Gong",
        "email": "gongxiaofei24@iscas.ac.cn",
        "time": "Thu Jul 16 17:00:23 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Jul 16 17:00:23 2026 +0800"
      },
      "message": "optimize base64 for riscv64 with RVV vrgather and vectorized decode (#3388)\n\n* optimize base64 for riscv64 with RVV vrgather and vectorized decode\n\n- Add RVV-accelerated base64 encode using vrgather vector indexed\n  load for parallel table lookup (16 bytes per iteration, LMUL\u003d4)\n- Add RVV-accelerated base64 decode using vectorized range comparisons\n  and vmerge chain for classification (16 input bytes per iteration)\n- Integrate RVV dispatch into modp_b64.cc with compile-time selection\n  when __riscv_vector is defined\n- Add modp_b64_rvv.cc to CMakeLists.txt build sources\n- Performance (SG2044 rv64gcv): decode 3-5x faster, up to 764 MB/s\n- Tested with RFC 4648 vectors and 100-round random data roundtrip\n\nSigned-off-by: Xiaofei Gong \u003cgongxiaofei24@iscas.ac.cn\u003e\nSigned-off-by: YuanSheng \u003cyuansheng@isrc.iscas.ac.cn\u003e\n\n* Fix 5 review issues in RVV base64 implementation\n\n- Replace placeholder license in modp_b64_rvv.h with Apache-2.0 header\n- Add NUL terminator in rvv_modp_b64_encode scalar tail\n- Strip trailing \u0027\u003d\u0027 padding at entry of rvv_modp_b64_decode\n- Handle leftover 2/3 chars in decode scalar fallback\n- Add modp_b64_rvv.cc to BUILD.bazel BUTIL_SRCS\n\nAll 5 fixes verified on real rv64gcv hardware (8/8 gtest pass).\n\nSigned-off-by: Xiaofei Gong \u003cgongxiaofei24@iscas.ac.cn\u003e\nSigned-off-by: YuanSheng \u003cyuansheng@isrc.iscas.ac.cn\u003e\n\n---------\n\nSigned-off-by: Xiaofei Gong \u003cgongxiaofei24@iscas.ac.cn\u003e\nSigned-off-by: YuanSheng \u003cyuansheng@isrc.iscas.ac.cn\u003e"
    },
    {
      "commit": "c9b34f23b463f84d5fc193d6222fe6652523d854",
      "tree": "d9dc7b035f71af329f2a10fa6a5c289fd968a0d9",
      "parents": [
        "97c87717142c3d5c7ed1e630da3cf3b00fcbd7b0"
      ],
      "author": {
        "name": "altman08",
        "email": "936396749@qq.com",
        "time": "Thu Jul 16 10:24:11 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Jul 16 10:24:11 2026 +0800"
      },
      "message": "bthread: use macros for safer thread-local access on ARM (#3380)\n\nRoute accesses to tls_task_group, tls_task_group_nosignal, tls_bls and\nseveral mutex-profiling thread-locals (tls_inside_lock, tls_warn_up,\ntls_pthread_lock_count, tls_csites, tls_ever_created_keytable) through\nthe BAIDU_(GET|SET|GET_PTR)_VOLATILE_THREAD_LOCAL macros instead of\ntouching the raw __thread variables directly.\n\nOn aarch64/clang the compiler can incorrectly cache the address of a\nthread_local variable across a suspend point (e.g. when a bthread is\nrescheduled onto another worker), so raw accesses can silently read a\nstale TaskGroup*/LocalStorage. Going through the accessor macros\neverywhere forces a fresh, non-cached load/store on those platforms\nwhile staying a plain variable access elsewhere.\n\nAdd bthread::tls_bls_ptr() as the single helper for obtaining the\ncurrent LocalStorage*, and update all call sites (bthread.cpp,\nbutex.cpp, fd.cpp, key.cpp, mutex.cpp, task_control.cpp,\nbrpc/controller.cpp, test/bthread_unittest.cpp) to use it instead of\ndeclaring their own stale/mistyped extern references to tls_task_group\nor tls_bls.\n\nAlso hardens borrow_keytable()/return_keytable() in key.cpp: the\nKeyTableList pointer obtained under the read lock is no longer reused\nafter re-acquiring the write lock, since pool-\u003elist/pool-\u003edestroyed\nmay change concurrently via bthread_keytable_pool_destroy(); the\nthread-local list is drained first before falling back to the pool\u0027s\nglobal free list."
    },
    {
      "commit": "97c87717142c3d5c7ed1e630da3cf3b00fcbd7b0",
      "tree": "705cbd6d890882a1d11e3eb4f69533d547034171",
      "parents": [
        "cbb4ccdc0b2915a8f518c0be133ffdd60be0cc99"
      ],
      "author": {
        "name": "Bright Chen",
        "email": "chenguangmingfe@foxmail.com",
        "time": "Wed Jul 15 15:48:08 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Jul 15 15:48:08 2026 +0800"
      },
      "message": "Fix host_socket not set for extra streams on client side (#3373)\n\nController::HandleStreamConnection called s-\u003eSetHostSocket() on the first\nstream inside the extra-stream loop. When an extra stream  carried no\ndownstream data (nothing triggered Stream::OnReceived to set host_socket\nfor it), Stream::SetConnected() hit CHECK(_host_socket !\u003d NULL).\n\nSet host_socket on the extra stream itself, matching the server-side logic\nin baidu_rpc_protocol.\n\nCo-authored-by: jiangyt-git \u003c64257436+jiangyt-git@users.noreply.github.com\u003e\nCo-authored-by: jiangyuting \u003cjiangyutingwangyi@163.com\u003e"
    },
    {
      "commit": "cbb4ccdc0b2915a8f518c0be133ffdd60be0cc99",
      "tree": "aafb3e9addcfc1e73b595de128deaa993567a87f",
      "parents": [
        "72f7f297eb4c90d0472c627845973cf787eb3fe2"
      ],
      "author": {
        "name": "sahvx655-wq",
        "email": "sahvx655@gmail.com",
        "time": "Sun Jul 12 20:23:01 2026 +0530"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sun Jul 12 22:53:01 2026 +0800"
      },
      "message": "Reject zero-datasize flv tag in FlvReader::Read (#3366)"
    },
    {
      "commit": "72f7f297eb4c90d0472c627845973cf787eb3fe2",
      "tree": "7f9cfcc391dcd06e5d42e256ee15572f1718b75a",
      "parents": [
        "32c95225e83b88d8037560ba33c43977b4641508"
      ],
      "author": {
        "name": "Felix-Gong",
        "email": "gongxiaofei24@iscas.ac.cn",
        "time": "Sun Jul 12 22:43:41 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sun Jul 12 22:43:41 2026 +0800"
      },
      "message": "iobuf: add RISC-V Vector (RVV) optimized memcpy for cp() (#3375)\n\nAdd a RVV-accelerated cp() path for RISC-V 64-bit systems with\nthe Vector (RVV) extension. Uses VL-agnostic intrinsics with\nLMUL\u003d8 (e8m8) for maximum vector width.\n\nKey design:\n- Falls back to memcpy for \u003c 64 bytes (RVV overhead threshold)\n- VL-agnostic: works with any VLEN (128/256/512/1024+)\n- Uses __has_include for compiler compatibility\n- Guarded by __riscv \u0026\u0026 __riscv_vector \u0026\u0026 header availability\n\nOn SG2044 (rv64gcv, VLEN\u003d128): vectorized copy processes 128\nbytes per iteration with e8m8 LMUL.\n\nOther platforms and compilers without riscv_vector.h fall back\nto the existing memcpy path.\n\nSigned-off-by: Xiaofei Gong \u003cgongxiaofei24@iscas.ac.cn\u003e\nSigned-off-by: YuanSheng \u003cyuansheng@isrc.iscas.ac.cn\u003e"
    },
    {
      "commit": "32c95225e83b88d8037560ba33c43977b4641508",
      "tree": "d6972b3fcfabdca7e3f86af44aa6ce6078e176f3",
      "parents": [
        "f03649d4b87a6743c9cdd6c5586fd69487d7c4d2"
      ],
      "author": {
        "name": "rajvarun77",
        "email": "varun.cse.iitg@gmail.com",
        "time": "Sun Jul 12 10:41:54 2026 -0400"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sun Jul 12 22:41:54 2026 +0800"
      },
      "message": "Add Power-of-Two-Choices Peak-EWMA load balancer (p2c) (#3367)\n\n* Add Power-of-Two-Choices Peak-EWMA load balancer (p2c)\n\nImplements the p2c load balancing policy proposed in #3340: each\nselection samples two random servers (configurable via choices\u003dN) and\nroutes to the lower peak-EWMA latency * (inflight+1) / weight score.\nUpward latency spikes take effect immediately while recovery decays\nover tau_ms (default 10s), so a degraded server is shed within one\nobservation at O(1) selection cost.\n\nUses only existing LoadBalancer hooks (SelectServer/Feedback,\nneed_feedback) with DoublyBufferedData membership like rr/la; per-node\nstats are shared_ptr-owned by both buffers. Registered as \"p2c\" in\nglobal.cpp. Includes unit tests (functional, weighted, exclusion,\nerror punishment, concurrency churn) and docs in cn/en client.md.\n\nCo-Authored-By: Claude Fable 5 \u003cnoreply@anthropic.com\u003e\n\n* Reuse SelectIn.begin_time_us to avoid extra clock read per selection\n\nCo-Authored-By: Claude Fable 5 \u003cnoreply@anthropic.com\u003e\n\n* Address review: gflags for tunables, cap error punishment, drop FlatMap init\n\n- p2c_default_choices/p2c_default_tau_ms gflags as channel-overridable defaults\n- p2c_max_punish_ms(default 30s) caps the doubled-EWMA error punishment so a\n  persistently failing server recovers in bounded time after turning healthy\n- Servers::server_map relies on FlatMap small-map auto-init\n- tests: error_punish_is_capped + feedback_lock_overhead benchmark\n\nCo-Authored-By: Claude Fable 5 \u003cnoreply@anthropic.com\u003e\n\n---------\n\nCo-authored-by: rajvarun77 \u003c287367605+rajvarun77@users.noreply.github.com\u003e\nCo-authored-by: Claude Fable 5 \u003cnoreply@anthropic.com\u003e"
    },
    {
      "commit": "f03649d4b87a6743c9cdd6c5586fd69487d7c4d2",
      "tree": "a4cccae6066fcdf50312efceb75be8d8a8092f39",
      "parents": [
        "82a681929738fabc036980d0432017b20b2ae06b"
      ],
      "author": {
        "name": "Weibing Wang",
        "email": "wwbmmm@gmail.com",
        "time": "Sun Jul 12 22:38:25 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sun Jul 12 22:38:25 2026 +0800"
      },
      "message": "Enforce body size limits in protocol parsers (#3382)\n\n* Enforce body size limits in protocol parsers\n\n* Use scoped FlagSaver"
    },
    {
      "commit": "82a681929738fabc036980d0432017b20b2ae06b",
      "tree": "a9b8316191b6dde91e8386d34e01170638cac102",
      "parents": [
        "b3ab44b072b5ec7e462e2b9aa0deeb2bd771604e"
      ],
      "author": {
        "name": "darion-yaphet",
        "email": "darion.yaphets@gmail.com",
        "time": "Sun Jul 12 00:02:52 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sun Jul 12 00:02:52 2026 +0800"
      },
      "message": "build(cmake): Modernize target-scoped CMake configuration (#3377)\n\n* build(cmake): keep modern CMake policy compatibility\n\nRaise the minimum CMake version range to 3.16...3.28 so CMake 4.x no longer treats the project as relying on removed pre-3.5 policy compatibility. The range preserves a conservative 3.16 runtime floor while documenting policy validation through 3.28.\n\n* build(cmake): modernize target-scoped CMake configuration\n\nMove shared compile definitions, include paths, options, and link dependencies onto interface targets so top-level, src, tools, tests, and standalone examples consume consistent build settings without relying on global directory state.\n\nExamples now share a small CMake helper, and the gtest download path is updated to configure with modern CMake while keeping downloaded gtest headers ahead of Homebrew\u0027s C++17-only installation."
    },
    {
      "commit": "b3ab44b072b5ec7e462e2b9aa0deeb2bd771604e",
      "tree": "84cc65b30b658d99189b9ea17c9e772dee3032dd",
      "parents": [
        "4ac1d32605061f851853f2bfec40c1341f0ff7cc"
      ],
      "author": {
        "name": "ljcjclljc",
        "email": "169005916+ljcjclljc@users.noreply.github.com",
        "time": "Sat Jul 11 07:54:08 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sat Jul 11 07:54:08 2026 +0800"
      },
      "message": "Fix StreamCreate failure handling (#3357)\n\n* Fix StreamCreate failure handling\n\n* Add ScopedStream guard to stream test\n\n* Move stream regression test into streaming UT\n\n* Fix StreamCreate failure handling\n\n* Add ScopedStream guard to stream test\n\n* Move stream regression test into streaming UT"
    },
    {
      "commit": "4ac1d32605061f851853f2bfec40c1341f0ff7cc",
      "tree": "4d018748e0434185cc074f9885eb5ca0871de6da",
      "parents": [
        "76843569828c233bd7e4d18aeccb848b24d7c5d9"
      ],
      "author": {
        "name": "Felix-Gong",
        "email": "gongxiaofei24@iscas.ac.cn",
        "time": "Thu Jul 09 20:51:46 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Jul 09 20:51:46 2026 +0800"
      },
      "message": "Fix RISC-V cpu_relax: use pause hint instead of fence.i (#3374)\n\nfence.i is an instruction-synchronization barrier that flushes the icache,\ntoo heavy for a spin-wait hint. Use the pause hint (Zihintpause extension,\nencoding 0x0100000F) instead, matching the RISC-V Linux kernel\u0027s\nALT_RISCV_PAUSE() behavior.\n\n.word is used to emit the raw encoding for maximum assembler compatibility,\navoiding dependency on either the \u0027pause\u0027 mnemonic (requires Zihintpause in\n-march) or the .insn directive (requires recent binutils/Clang).\n\nSigned-off-by: Xiaofei Gong \u003cgongxiaofei24@iscas.ac.cn\u003e\nSigned-off-by: YuanSheng \u003cyuansheng@isrc.iscas.ac.cn\u003e"
    },
    {
      "commit": "76843569828c233bd7e4d18aeccb848b24d7c5d9",
      "tree": "2bda3c10ffb1ee4402c6ebf1a3781a3efa44d875",
      "parents": [
        "0f820848e0f9fa5d9185d836443684f980755f58"
      ],
      "author": {
        "name": "rajvarun77",
        "email": "varun.cse.iitg@gmail.com",
        "time": "Thu Jul 09 04:31:14 2026 -0400"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Jul 09 16:31:14 2026 +0800"
      },
      "message": "Add MySQL client protocol (text protocol, transactions, prepared statements) on clean-room auth (#3330)\n\n* feat(mysql): clean-room MySQL authentication codec\n\nClean-room implementation of the MySQL connection-phase authentication handshake,\nderived from the public MySQL protocol documentation with no GPL lineage:\nmysql_native_password and caching_sha2_password scrambles, HandshakeV10/\nHandshakeResponse41 codec, and length-encoded integer/string plus packet-header\nwire helpers. Handles the lenenc NULL (0xFB) marker and rejects an oversize\nauth_response.\n\n* feat(mysql): full MySQL text protocol with transactions and prepared statements\n\nPort the MySQL protocol client (issue #2093) onto the clean-room auth codec and\nprotobuf 3.21 (NonreflectableMessage): COM_QUERY text protocol, interactive\ntransactions via connection affinity, and prepared statements. Wire\ncaching_sha2_password (fast-auth, full-auth RSA, and secure-transport cleartext)\ninto the live client. Fix the lenenc 9-byte length marker in pack_encode_length\n(0xFD -\u003e 0xFE) per the MySQL protocol spec.\n\n* test(mysql): clean-room integration tests + prepared-stmt error fix + Controller cleanup\n\n- Add clean-room integration tests (transactions, prepared statements, pooled\n  connection concurrency, connection-type) run against a self-spawned mysqld.\n- Fix: a failed COM_STMT_PREPARE now returns the ERR packet to the caller and keeps\n  the connection alive, instead of closing the socket.\n- Warn when a prepared statement runs on a \u0027short\u0027 connection (re-prepares on every\n  execute; prefer \u0027pooled\u0027).\n- Replace Controller\u0027s mysql-specific _mysql_stmt with a generic opaque per-RPC slot\n  so no protocol type leaks onto the shared Controller.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) \u003cnoreply@anthropic.com\u003e\n\n* refactor(mysql): consolidate sources under policy/mysql/; drop inherited images\n\nMove all MySQL sources (mysql.*, mysql_command/reply/common/transaction/\nstatement*, mysql_protocol.*, mysql_authenticator.*) into src/brpc/policy/mysql/\nalongside the clean-room auth codec; update all includes, build globs, and\ninstall rules. Remove three benchmark images inherited from the #2093 port and\nthe doc section referencing them.\n\nNo behavior change: full build green; all 19 mysql unit/integration tests pass;\na 30-case standalone end-to-end run was independently verified against mysqld.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) \u003cnoreply@anthropic.com\u003e\n\n* fix(mysql): address code-review findings (binary protocol, auth, edge cases) + ASF headers\n\n- Binary DATETIME/TIME: gate the microsecond bytes on the packet length, not the\n  column\u0027s declared decimals (over-read / result-set desync).\n- COM_STMT_SEND_LONG_DATA: frame stmt_id/param_id inside the packet; fix chunk offset.\n- COM_STMT_EXECUTE: emit the trailing 0-length packet for 16MiB-aligned payloads.\n- OK/EOF status \u0026 warnings: decode via mysql_uint2korr (big-endian safe).\n- Row NULL-bitmap: arena-allocate instead of a stack VLA; cap column_count.\n- Auth: bounds-check the parsed auth string; size-bound StringPiece uses.\n- Prepared stmt: prune stale per-socket stmt_id map entries; count only real \u0027?\u0027\n  placeholders (skip quotes/comments).\n- MysqlResponse::Clear and MysqlRequest copy/Swap: reset/copy all members.\n- Controller::ResetPods: release _bind_sock on controller reuse.\n- Standardize mysql file license headers to the ASF form; clarify auth comment.\n\nAll 19 unit/integration tests still pass.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) \u003cnoreply@anthropic.com\u003e\n\n* fix(mysql): address review findings — license header, flag typo, header-global, doc/comment drift\n\n- example/mysql_c++/mysql_go_press.go: add ASF Apache-2.0 license header\n  (the last file failing the License Check; other 6 already had headers).\n- mysql_common.{h,cpp}: move the MysqlCollations map definition out of the\n  header into the .cpp behind an `extern` declaration, so each translation\n  unit no longer gets its own copy (C++11-safe; avoids the header-defined\n  global flagged in review).\n- mysql_statement.{cpp,inl.h}: rename the misspelled gflag\n  mysql_statment_map_size -\u003e mysql_statement_map_size (user-facing name).\n- docs/cn/mysql_client.md: prepared statements ARE supported now — drop the\n  stale \"不支持Prepared statement\".\n- brpc_mysql_connection_type_unittest.cpp: rewrite the stale header comment\n  that described a removed \"MustError\" test; the prepared-statement path now\n  transparently re-prepares under CONNECTION_TYPE_SHORT and succeeds, matching\n  the actual PreparedStatementUnderShortRePreparesAndSucceeds test.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) \u003cnoreply@anthropic.com\u003e\n\n* fix(mysql): use the standard ASF license header on new example/test files\n\nThe new MySQL example sources and brpc_mysql_unittest.cpp carried the old\n\"Copyright (c) Baidu, Inc.\" Apache-2.0 header, which skywalking-eyes (the\nrepo\u0027s License Check, configured copyright-owner \u003d Apache Software Foundation)\ndoes not accept — so all 7 files failed the gate. Replace with the canonical\nASF header used by the other 549 sources in the tree, and drop the stale\nBaidu copyright/date attribution lines. Verified locally with\n`license-eye -c .licenserc.yaml header check`.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) \u003cnoreply@anthropic.com\u003e\n\n* chore(mysql): add diagnostic error logs on silent failure paths\n\nExtend the failure-path logging from the auth codec to the full client\nprotocol. Parsers and request/response handlers returned false/0/nullptr\nsilently on malformed wire data, truncated packets, bad state, or missing\nprepared statements, giving no clue why a query/connection failed. Add a\nLOG(ERROR) at each silent failure path naming the function and the concrete\ncause.\n\n- mysql_auth_handshake/packet.cpp: handshake + lenenc codec failure paths\n  (truncated \u003cfield\u003e, pre-4.1 server, reserved 0xFF marker, length mismatch).\n- mysql.cpp: request command/param guards.\n- mysql_reply.cpp: result-set parse (column/row/error packet truncation,\n  arena alloc failure, bad binary-row header).\n- mysql_protocol.cpp: serialize/process type + serialization failures.\n- mysql_statement.cpp: statement-id lookup misses (not-prepared / stale conn).\n\nLogic unchanged — logs inserted only. Normal control-flow returns\n(need-more-data, lenenc NULL 0xFB, short-connection no-cache) are not logged.\nmysql_authenticator.cpp and mysql_transaction.cpp already logged every\nfailure path and were left unchanged.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) \u003cnoreply@anthropic.com\u003e\n\n* chore(mysql): demote non-fatal diagnostic logs to LOG(WARNING)\n\nTune the severity of the failure-path logs. LOG(ERROR) is reserved for\ntotal failures — handshake/connection corruption, authentication failure,\nout-of-memory, and fundamental request/response type or serialization\nmisuse. Operational and statement-data failures are demoted to\nLOG(WARNING):\n\n- mysql_auth_packet.cpp: lenenc int/string/header decode failures (these\n  fire during normal resultset parsing).\n- mysql.cpp: request command/param API guards.\n- mysql_reply.cpp: column/row/field/ERR-packet truncation (statement data).\n  The arena out-of-memory and Auth::Parse auth-plugin failures stay ERROR.\n- mysql_statement.cpp: prepared-statement-id lookup misses (recoverable,\n  trigger a re-prepare).\n\nhandshake parsing and the protocol serialize/process type checks remain\nLOG(ERROR). Severity-only change; messages and logic unchanged.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) \u003cnoreply@anthropic.com\u003e\n\n* fix(test): make AuthCase a C++11 aggregate so push_back{...} compiles\n\nCI compiles unittests with -std\u003dc++0x (C++11), where a class with a default\nmember initializer is not an aggregate, so g_auth_cases.push_back({...})\nfails to compile. Drop the default member initializer on AuthCase::use_ssl;\nall init sites pass it explicitly. Mirrors the same fix on the #3310 codec\nbranch.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) \u003cnoreply@anthropic.com\u003e\n\n* fix(mysql,ci): run integration tests against a real CI-provisioned mysqld\n\nThe MySQL integration tests were not exercising a live server in CI:\n\n- Merge master to pick up #3323, which installs mysql-server in the\n  install-essential-dependencies action used by the unittest lanes, so the\n  mysqld binary is present for the self-spawning test/mysql/* suites.\n- Delete the legacy test/brpc_mysql_unittest.cpp: it hardcoded an external\n  host (db4free.net) with embedded credentials and asserted on connect\n  failure (no skip), so it timed out and hard-failed in CI. The\n  test/mysql/*_integration suites supersede it, spawning a throwaway local\n  mysqld and GTEST_SKIP-ing when none is available (the redis precedent).\n- Build the test/mysql/* suites in the make lane: extend test/Makefile\u0027s\n  source glob and add a mysql/-prefixed link rule; add the subdir to\n  run_tests.sh with nullglob so it runs them.\n- Bazel: build one cc_test per mysql test file via generate_unittests\n  instead of globbing them all into a single brpc_mysql_test target, which\n  duplicated main() and the FLAGS_mysql_* definitions (ld: duplicate\n  symbol). Drop the per-file main()s so every suite relies on gtest_main,\n  matching brpc_redis_unittest; tag the server-spawning suites\n  external+local so bazel runs them unsandboxed with the real mysqld.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) \u003cnoreply@anthropic.com\u003e\n\n* address review comments: bind-sock flag, non-copyable response, naming\n\n- Controller: store the mysql-transaction BindSockAction in two bits of\n  _flags (FLAGS_BIND_SOCK_RESERVE / FLAGS_BIND_SOCK_USE) via\n  set_bind_sock_action()/bind_sock_action(), instead of a dedicated member,\n  per review. No behavior change.\n- MysqlResponse: make it explicitly non-copyable (\u003d delete copy ctor and\n  assignment) and turn the previously no-op MergeFrom into a hard\n  CHECK-failure, so an accidental copy/CopyFrom is caught instead of\n  silently dropping parsed replies.\n- MysqlRequest: rename the trivial getters get_tx()/get_stmt() to\n  tx()/stmt() per review.\n- ControllerPrivateAccessor: add set_mysql_statement_type() as a clearly\n  named alias over the pipelined_count slot the mysql protocol reuses, and\n  call it from the mysql protocol instead of set_pipelined_count() directly.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) \u003cnoreply@anthropic.com\u003e\n\n* test(mysql): move unittests from mysql/ subdir into test/\n\nMove all seven mysql unittests (auth handshake/packet/scramble,\nconnection_type, pool_concurrency, prepared/txn integration) and the\ntest-plan doc out of test/mysql/ into test/, per review on\napache/brpc#3310.\n\nThe existing brpc_*_unittest glob in the Makefile and CMakeLists.txt now\npicks them up, so both revert to master with no mysql-specific lines. In\nBUILD.bazel they likewise join the brpc_unittests glob; the five tests\nthat fork a real mysqld keep their [\"external\", \"local\"] tags by folding\nthose entries into that target\u0027s per_test_tags instead of a separate\nmysql target.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) \u003cnoreply@anthropic.com\u003e\n\n* test(mysql): drop run_tests.sh mysql/ subdir entry after move\n\nThe mysql unittests now live in test/ and match the existing\nbrpc*unittest glob in run_tests.sh, so revert the script to master. The\nremoved mysql/brpc*unittest entry needed `shopt -s nullglob` to skip a\nmissing subdir, but CI runs the script under `sh` (dash), where shopt is\nabsent; nullglob stayed off and the now-empty glob was executed as a\nliteral path, exiting 127.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) \u003cnoreply@anthropic.com\u003e\n\n* Fix backup/retry call hang: default-initialize bind_sock_action\n\nThe new bind_sock_action member of Controller::Call had no in-class default,\nand the Call(Call*) copy constructor used for backup requests and retries did\nnot initialize it in its member-init list. The backup call therefore read an\nindeterminate value in Controller::Call::OnComplete, which branches on it\nbefore the normal pool-return / SetFailed path; when the garbage matched\nBIND_SOCK_RESERVE/BIND_SOCK_USE the backup call\u0027s socket was diverted to\n_bind_sock or held instead of returned, leaving the in-flight RPC unconcluded\nand hanging ChannelTest.backup_request until the test timeout (nondeterministic,\nhence flaky-looking).\n\nGive the member an in-class default initializer (BIND_SOCK_NONE) so every Call\nconstruction path inherits it; a backup/retry never inherits transaction\nconnection-affinity. This closes the whole class of \"new init path forgets the\nmember\" rather than the single copy-ctor instance.\n\n* Initialize Call::bind_sock_action explicitly in every constructor\n\nPer review: drop the in-class default initializer for Call::bind_sock_action\nand set it explicitly in each Call constructor (the copy ctor used for\nbackup/retry) and Call::Reset(). Leaving it uninitialized was the cause of the\nbackup/retry-request hang; explicit per-constructor init keeps every path safe.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) \u003cnoreply@anthropic.com\u003e\n\n* Address review: remove redundant comments and dead code, move _bind_sock.reset() to ResetNonPods()\n\n* Remove commented-out code in mysql_stmt example\n\n---------\n\nCo-authored-by: rajvarun77 \u003c287367605+rajvarun77@users.noreply.github.com\u003e\nCo-authored-by: Claude Opus 4.8 (1M context) \u003cnoreply@anthropic.com\u003e"
    },
    {
      "commit": "0f820848e0f9fa5d9185d836443684f980755f58",
      "tree": "d9161b578ffd372ba2cef4f75f82a02dacdeb266",
      "parents": [
        "f16ab1c581746919fb394c3cfd3735ed83a4e3bc"
      ],
      "author": {
        "name": "Felix-Gong",
        "email": "gongxiaofei24@iscas.ac.cn",
        "time": "Wed Jul 08 11:43:55 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Jul 08 11:43:55 2026 +0800"
      },
      "message": "Add RISC-V Zvbc vector CRC32C acceleration (#3332)\n\n* Add RISC-V Zvbc vector CRC32C acceleration\n\nImplement CRC32C using Zvbc vector carry-less multiplication\n(vclmul/vclmulh RVV intrinsics). Processes 4 lanes of 128-bit\nfolding per iteration (64 bytes), with 4-to-1 lane reduction\nand Barrett reduction for finalization.\n\n- Add rv_crc32c_vclmul() using vclmul/vclmulh intrinsics\n- Add isZvbc() runtime detection via /proc/cpuinfo\n- Add WITH_RISCV_ZVBC cmake option\n- Fix macro guards: support __riscv_zvbc without __riscv_zbc\n- Zvbc preferred over Zbc in Choose_Extend()\n\nSigned-off-by: Xiaofei Gong \u003cgongxiaofei24@iscas.ac.cn\u003e\nSigned-off-by: YuanSheng \u003cyuansheng@isrc.iscas.ac.cn\u003e\n\n* Address review comments: fix vl check, aliasing, isa matching, march flag\n\n- Add vl\u003c2 fallback for VLEN\u003c128 (prevents UB from uninitialized elements)\n- Use memcpy instead of uint8_t*-to-uint64_t* casts (strict-aliasing safe)\n- Tighten /proc/cpuinfo ISA matching to _zbc/_zvbc only (prevents _zvbc\n  falsely matching zbc)\n- Add missing \u0027v\u0027 base extension in -march flag (rv64gcv_zbc_zvbc)\n\nSigned-off-by: Xiaofei Gong \u003cgongxiaofei24@iscas.ac.cn\u003e\nSigned-off-by: YuanSheng \u003cyuansheng@isrc.iscas.ac.cn\u003e\n\n* Add ZVBC/ZBC support to config_brpc.sh\n\nAdd --with-riscv-zvbc and --with-riscv-zbc options to config_brpc.sh\nfor RISC-V CRC32C acceleration. This allows building with:\n- --with-riscv-zvbc: -march\u003drv64gcv_zbc_zvbc\n- --with-riscv-zbc: -march\u003drv64gc_zbc\n\nUsage:\n  ./config_brpc.sh --with-riscv-zvbc --headers\u003d/usr/include --libs\u003d/usr/lib64\n\nSigned-off-by: Xiaofei Gong \u003cgongxiaofei24@iscas.ac.cn\u003e\nSigned-off-by: YuanSheng \u003cyuansheng@isrc.iscas.ac.cn\u003e\n\n* Rename isZvbc/isZbc to snake_case for consistency\n\nAddress review comment: rename camelCase functions to snake_case\nfollowing Google C++ Style Guide.\n\nSigned-off-by: Xiaofei Gong \u003cgongxiaofei24@iscas.ac.cn\u003e\nSigned-off-by: YuanSheng \u003cyuansheng@isrc.iscas.ac.cn\u003e\n\n---------\n\nSigned-off-by: Xiaofei Gong \u003cgongxiaofei24@iscas.ac.cn\u003e\nSigned-off-by: YuanSheng \u003cyuansheng@isrc.iscas.ac.cn\u003e"
    },
    {
      "commit": "f16ab1c581746919fb394c3cfd3735ed83a4e3bc",
      "tree": "ac437babbdea7ed48dc54afc2fed9ca70b6d02e7",
      "parents": [
        "1d3ada378b76178ba5108255d3b555ff0c2dfaf3"
      ],
      "author": {
        "name": "Felix-Gong",
        "email": "gongxiaofei24@iscas.ac.cn",
        "time": "Tue Jul 07 15:26:10 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Jul 07 15:26:10 2026 +0800"
      },
      "message": "snappy: optimize UnalignedCopy64 and IncrementalCopy for RISC-V (#3360)\n\n* snappy: optimize UnalignedCopy64 and IncrementalCopy for RISC-V\n\nUse RISC-V inline assembly (ld/sd) for 8-byte copy operations instead\nof generic macro-based implementation.\n\nChanges:\n- UnalignedCopy64: direct ld/sd pair for 8-byte copy\n- IncrementalCopy: 8-byte bulk copies when source/dest don\u0027t overlap\n\nPerformance improvement (direct function benchmark):\n- Decompress compressible-256K: 728 MB/s -\u003e 2205 MB/s (+203%)\n- Decompress zeros-256K: 543 MB/s -\u003e 1462 MB/s (+169%)\n\nTests: brpc_snappy_compress_unittest passed (7/7)\n\nSigned-off-by: Xiaofei Gong \u003cgongxiaofei24@iscas.ac.cn\u003e\nSigned-off-by: YuanSheng \u003cyuansheng@isrc.iscas.ac.cn\u003e\n\n* snappy: add alignment check for RISC-V ld/sd optimization\n\nAddress Copilot review: ld/sd require 8-byte alignment. Add runtime\nalignment check and fall back to memcpy/byte-copy for unaligned\naddresses to avoid traps on implementations that don\u0027t support\nmisaligned access.\n\nSigned-off-by: Xiaofei Gong \u003cgongxiaofei24@iscas.ac.cn\u003e\nSigned-off-by: YuanSheng \u003cyuansheng@isrc.iscas.ac.cn\u003e\n\n---------\n\nSigned-off-by: Xiaofei Gong \u003cgongxiaofei24@iscas.ac.cn\u003e\nSigned-off-by: YuanSheng \u003cyuansheng@isrc.iscas.ac.cn\u003e"
    },
    {
      "commit": "1d3ada378b76178ba5108255d3b555ff0c2dfaf3",
      "tree": "af7c1f9cc4ff41ffad39bf83b10a3daa3b116ac7",
      "parents": [
        "5cdf821838242bc9fa5c7400465546904a475f01"
      ],
      "author": {
        "name": "Felix-Gong",
        "email": "gongxiaofei24@iscas.ac.cn",
        "time": "Tue Jul 07 14:13:24 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Jul 07 14:13:24 2026 +0800"
      },
      "message": "bthread: implement lock-free AtomicInteger128 for RISC-V (#3355)\n\n* bthread: implement lock-free AtomicInteger128 for RISC-V\n\nReplace mutex-based fallback with seqlock implementation for RISC-V\nplatform. This brings RISC-V in line with x86 (SSE) and ARM (NEON)\nlock-free implementations.\n\nSeqlock algorithm:\n- Reader: read sequence, read data, verify sequence, retry if stale\n- Writer: increment sequence, write data, increment sequence\n- All memory accesses use fence instructions for ordering\n\nPerformance improvement:\n- bthread_start_urgent latency: 1.5-2% reduction\n- adding_func throughput: 25% improvement (541ns vs 722ns)\n\nSigned-off-by: Xiaofei Gong \u003cgongxiaofei24@iscas.ac.cn\u003e\nSigned-off-by: YuanSheng \u003cyuansheng@isrc.iscas.ac.cn\u003e\n\n* fix: correct RISC-V inline assembly constraints for AtomicInteger128\n\n- Use \"m\" (input) for ld instructions reading memory\n- Use \"\u003dm\" (output) for sd instructions writing memory\n- Swap operand order in sd templates to match RISC-V syntax (register, memory)\n\nThe previous \"+m\" constraints in input operand positions caused compilation\nerrors on RISC-V. This fix ensures proper constraint usage:\n- ld: memory is input \"m\", register is output \"\u003dr\"\n- sd: register is input \"r\", memory is output \"\u003dm\"\n\nSigned-off-by: Xiaofei Gong \u003cgongxiaofei24@iscas.ac.cn\u003e\nSigned-off-by: YuanSheng \u003cyuansheng@isrc.iscas.ac.cn\u003e\n\n---------\n\nSigned-off-by: Xiaofei Gong \u003cgongxiaofei24@iscas.ac.cn\u003e\nSigned-off-by: YuanSheng \u003cyuansheng@isrc.iscas.ac.cn\u003e"
    },
    {
      "commit": "5cdf821838242bc9fa5c7400465546904a475f01",
      "tree": "b5bc866bac5e57ceff36b1f6c5c6558ae27da931",
      "parents": [
        "3e030aae352a0366626a9ceaa5a56cca578044f3"
      ],
      "author": {
        "name": "darion-yaphet",
        "email": "darion.yaphets@gmail.com",
        "time": "Sun Jul 05 10:09:39 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sun Jul 05 10:09:39 2026 +0800"
      },
      "message": "docs(agents): guide contributors through repository workflows (#3370)\n\nReplace the minimal agent note with a concise contributor guide tailored to the brpc repository. The guide captures structure, build and test commands, coding style, testing expectations, PR guidance, and security reminders."
    },
    {
      "commit": "3e030aae352a0366626a9ceaa5a56cca578044f3",
      "tree": "ead5def0116b8f4acb6d1ec813ba766c809619b5",
      "parents": [
        "8d3ebb2add8775c86d458fd41ef61d1bf6f7e040"
      ],
      "author": {
        "name": "darion-yaphet",
        "email": "darion.yaphets@gmail.com",
        "time": "Sun Jul 05 10:08:55 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sun Jul 05 10:08:55 2026 +0800"
      },
      "message": "docs(claude): add Claude Code project guidance file (#3369)\n\n- Document bRPC build commands (Make/CMake/Bazel) and how to run a single test\n- Outline core library architecture (brpc/bthread/butil/bvar)\n- Record key design patterns: protocol plugins, naming services, builtin services\n- Note Google C++ style with 4-space indentation convention"
    },
    {
      "commit": "8d3ebb2add8775c86d458fd41ef61d1bf6f7e040",
      "tree": "865df12c1a678ef4742869adbfe7764e0053a99a",
      "parents": [
        "f1d04c87cfb883c839afc3ddd0d3ab07cda54940"
      ],
      "author": {
        "name": "UB",
        "email": "ubed@bugqore.com",
        "time": "Sat Jul 04 17:40:42 2026 +0530"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sat Jul 04 20:10:42 2026 +0800"
      },
      "message": "Fix out-of-bounds read parsing AVC SPS in ParseSPS (#3371)"
    },
    {
      "commit": "f1d04c87cfb883c839afc3ddd0d3ab07cda54940",
      "tree": "9cfa10443515893e3fcee7f02901cd624654c600",
      "parents": [
        "b9145686dd8055ea06a08bcb338916e08b7a0f1f",
        "2587a7f38fb09135d23ff4120383203a8ad9b1a7"
      ],
      "author": {
        "name": "Yang,Liming",
        "email": "liming.yang@139.com",
        "time": "Wed Jul 01 15:29:01 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Jul 01 15:29:01 2026 +0800"
      },
      "message": "Merge pull request #3359 from hjwsm1989/codex/selective-channel-late-subdone-fix\n\nFix late selective_channel retry after EndRPC"
    },
    {
      "commit": "2587a7f38fb09135d23ff4120383203a8ad9b1a7",
      "tree": "e33b53ba8a4e272dc4a494ed032a4db9b38e7c4f",
      "parents": [
        "35682ff8d8e567a941035b3c09838dd932465f1f"
      ],
      "author": {
        "name": "huangjun",
        "email": "huangjun@xsky.com",
        "time": "Thu Jun 25 14:01:34 2026 +0800"
      },
      "committer": {
        "name": "huangjun",
        "email": "huangjun@xsky.com",
        "time": "Tue Jun 30 10:58:29 2026 +0800"
      },
      "message": "Fix selective_channel late SubDone retry after EndRPC (#3358)\n\nIgnore late selective_channel SubDone callbacks once the main RPC enters EndRPC, and let Sender hold the selective balancer while issuing sub-RPCs.\n\nReturn early when SelectiveChannel is called before Init, preserving the intended EINVAL result.\n\nAdd regression tests covering timeout plus delayed sub-call completion and uninitialized SelectiveChannel calls.\n"
    },
    {
      "commit": "b9145686dd8055ea06a08bcb338916e08b7a0f1f",
      "tree": "bc0ca4d2a53811c7cc45cab22182b110610a751f",
      "parents": [
        "16409aa9762a2464b5c56bc8a572a283afaf380b"
      ],
      "author": {
        "name": "Bright Chen",
        "email": "chenguangmingfe@foxmail.com",
        "time": "Mon Jun 29 10:48:56 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Jun 29 10:48:56 2026 +0800"
      },
      "message": "Fix bazel compile error on macOS (#3364)"
    },
    {
      "commit": "16409aa9762a2464b5c56bc8a572a283afaf380b",
      "tree": "06fdfe3927c37e663a80fe0a25765d96cf87e7cd",
      "parents": [
        "56445c507626b13c63e7331c8e917e8ab5aa3488"
      ],
      "author": {
        "name": "Weibing Wang",
        "email": "wwbmmm@gmail.com",
        "time": "Mon Jun 29 10:27:35 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Jun 29 10:27:35 2026 +0800"
      },
      "message": "Limit Redis inline command allocation (#3363)\n\n* Limit Redis inline command allocation\n\n* Fix failure when inline command length is exactly redis_max_allocation_size and ends with \u0027\\r\u0027"
    },
    {
      "commit": "56445c507626b13c63e7331c8e917e8ab5aa3488",
      "tree": "e1da61c73d6a31efefca94440b13aad4d581996b",
      "parents": [
        "894bd78f152340e9231064516d4ae74960da7b7b"
      ],
      "author": {
        "name": "Bright Chen",
        "email": "chenguangmingfe@foxmail.com",
        "time": "Sun Jun 28 14:04:39 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sun Jun 28 14:04:39 2026 +0800"
      },
      "message": "Support LeakSanitizer (#3361)"
    },
    {
      "commit": "894bd78f152340e9231064516d4ae74960da7b7b",
      "tree": "a7fab7b5ac0b6ba918710caaf9f7dde5314af9cb",
      "parents": [
        "12e214ff1e74f35a715803570797e02d8f1fbd89"
      ],
      "author": {
        "name": "Bright Chen",
        "email": "chenguangmingfe@foxmail.com",
        "time": "Sun Jun 28 13:31:21 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sun Jun 28 13:31:21 2026 +0800"
      },
      "message": "Use thread local process id and thread id for logging (#3362)"
    },
    {
      "commit": "12e214ff1e74f35a715803570797e02d8f1fbd89",
      "tree": "c4b1e7dd89e16d78e58d0a5733508c6c234f8cff",
      "parents": [
        "eb31fa5260c4bf43dd615fb575e50ad45a0fbbfc"
      ],
      "author": {
        "name": "Bright Chen",
        "email": "chenguangmingfe@foxmail.com",
        "time": "Sun Jun 28 12:15:12 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sun Jun 28 12:15:12 2026 +0800"
      },
      "message": "Use stream json api in protobuf v31+ (#3342)"
    },
    {
      "commit": "eb31fa5260c4bf43dd615fb575e50ad45a0fbbfc",
      "tree": "2738cb0db062c42653af26a1b8999950e4d2fbc4",
      "parents": [
        "4dc6ac8be12eb65b2ff960d148f9fe405d0fcb1b"
      ],
      "author": {
        "name": "Bright Chen",
        "email": "chenguangmingfe@foxmail.com",
        "time": "Thu Jun 25 10:51:43 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Jun 25 10:51:43 2026 +0800"
      },
      "message": "Make _state atomic to prevent concurrent _read_buf mutation on TCP fallback (#3347)\n\nRdmaEndpoint::_state was a plain enum, written by the handshake bthread\nand read concurrently by the event-dispatching thread (OnNewDataFromTcp).\nThis is a data race, and on a weak memory model it can let the two threads\nconcurrently mutate _socket-\u003e_read_buf.\n\nMake _state a butil::atomic\u003cState\u003e:\n- Terminal-state stores use release and the matching loads use acquire,\n  so data published before a terminal state (the magic bytes put back\n  into _read_buf, and the RDMA window/resource setup before ESTABLISHED)\n  is visible to the reader.\n\n- Non-terminal handshake transitions use relaxed."
    },
    {
      "commit": "4dc6ac8be12eb65b2ff960d148f9fe405d0fcb1b",
      "tree": "13866d745a1103ab0bf38d3795eaa71c40167f2e",
      "parents": [
        "1ba4286aa51330d79f2583ea13f989680a68b09b"
      ],
      "author": {
        "name": "Bright Chen",
        "email": "chenguangmingfe@foxmail.com",
        "time": "Mon Jun 22 09:56:10 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Jun 22 09:56:10 2026 +0800"
      },
      "message": "Bugfix: bthread_interrupt was scheduled to the wrong tag group (#3351)"
    },
    {
      "commit": "1ba4286aa51330d79f2583ea13f989680a68b09b",
      "tree": "357e4717014dfc6b07396840959ec6e8f22898aa",
      "parents": [
        "07215f22f25fb16f878ff6f9ea9e49f7e4c9238a"
      ],
      "author": {
        "name": "Weibing Wang",
        "email": "wwbmmm@gmail.com",
        "time": "Sun Jun 21 19:56:26 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sun Jun 21 19:56:26 2026 +0800"
      },
      "message": "Fix empty Redis command array parsing (#3354)"
    },
    {
      "commit": "07215f22f25fb16f878ff6f9ea9e49f7e4c9238a",
      "tree": "21807a9f01a04bb8f19972755be55b6ef5fc7c1e",
      "parents": [
        "1c9c0533ea655ec9dac9317da9345711f2b8c759"
      ],
      "author": {
        "name": "Yang,Liming",
        "email": "liming.yang@139.com",
        "time": "Sun Jun 21 16:07:34 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sun Jun 21 16:07:34 2026 +0800"
      },
      "message": "bthread: support per-tag CPU affinity in --cpu_set (#3331)\n\nPreviously --cpu_set accepted a single CPU list (e.g. \"0-3,5,7\") that\nwas applied uniformly to all bthread worker threads regardless of their\nbthread_tag.\n\nThis change extends the flag to accept a per-tag format:\n\n  --cpu_set\u003d\"0:0-3,5,7;1:6-9,4\"\n\nwhere each semicolon-separated segment is \"\u003ctag\u003e:\u003ccpu-list\u003e\".  Tags not\nmentioned in the string get no CPU binding.  The legacy single-list\nformat continues to work unchanged and binds all tags to the same set.\n\nImplementation:\n- Replace _cpus (vector\u003cunsigned\u003e) with _tag_cpus (vector\u003cvector\u003cunsigned\u003e\u003e),\n  sized to FLAGS_task_group_ntags in the constructor.\n- Add parse_one_cpuset() (static helper) for the existing range-list\n  parsing logic; parse_cpuset() now dispatches between legacy and per-tag\n  formats based on the presence of \u0027:\u0027 or \u0027;\u0027.\n- worker_thread() looks up _tag_cpus[tag] and round-robins over the\n  per-tag CPU list using the global _next_worker_id counter."
    },
    {
      "commit": "1c9c0533ea655ec9dac9317da9345711f2b8c759",
      "tree": "b51e3c8cc306b0551966591693add8ab4cd8e23c",
      "parents": [
        "11c8ea95b292a2e3ce3db9df4a4b755def165b23"
      ],
      "author": {
        "name": "Weibing Wang",
        "email": "wwbmmm@gmail.com",
        "time": "Sun Jun 21 16:05:29 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sun Jun 21 16:05:29 2026 +0800"
      },
      "message": "Limit AMF string and array parsing (#3353)"
    },
    {
      "commit": "11c8ea95b292a2e3ce3db9df4a4b755def165b23",
      "tree": "d5af3a22be23e73cd43aa0ac23fd98d0db844cda",
      "parents": [
        "f04e0e06051c21e3b83ca883c8b68a1a60f35784"
      ],
      "author": {
        "name": "Felix-Gong",
        "email": "gongxiaofei24@iscas.ac.cn",
        "time": "Tue Jun 16 13:09:34 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Jun 16 13:09:34 2026 +0800"
      },
      "message": "Use -fno-access-control instead of -Dprivate\u003dpublic for tests (#3346)\n\nReplace the -Dprivate\u003dpublic/-Dprotected\u003dpublic macro hack with\n-fno-access-control compiler flag in test builds. This avoids\nredeclaration issues with standard library headers (e.g. \u003cany\u003e\nunder C++17) while still allowing tests to access private members.\n\nChanges:\n- test/CMakeLists.txt: replace -Dprivate\u003dpublic with -fno-access-control\n- test/Makefile: replace -Dprivate\u003dpublic with -fno-access-control\n- test/BUILD.bazel: remove sstream_workaround cc_library and all deps\n- test/sstream_workaround.h: remove workaround (no longer needed)"
    },
    {
      "commit": "f04e0e06051c21e3b83ca883c8b68a1a60f35784",
      "tree": "ed2941d5a34184a3b1f2f316db1be0d87cdba24e",
      "parents": [
        "9188d92a61ec27f9f63a8d0a47524128001a54e2"
      ],
      "author": {
        "name": "sahvx655-wq",
        "email": "sahvx655@gmail.com",
        "time": "Tue Jun 16 07:47:58 2026 +0530"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Jun 16 10:17:58 2026 +0800"
      },
      "message": "bounds-check OnUserControlMessage like sibling control handlers (#3329)\n\n* bounds-check OnUserControlMessage like sibling control handlers\n\n* Use unsigned literals for user control message length bounds"
    },
    {
      "commit": "9188d92a61ec27f9f63a8d0a47524128001a54e2",
      "tree": "10d72785142022c00bedb12ee7d3d38f80eb9016",
      "parents": [
        "172589604ffbb5c970b9bcd3c1df0441a9614dd6"
      ],
      "author": {
        "name": "Weibing Wang",
        "email": "wwbmmm@gmail.com",
        "time": "Mon Jun 15 10:17:58 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Jun 15 10:17:58 2026 +0800"
      },
      "message": "Limit nested container depth in Redis reply and AMF parsers (#3344)\n\n* Limit nested container depth in Redis reply and AMF parsers\n\n* Add regression cases for deeply-nested AMF objects"
    },
    {
      "commit": "172589604ffbb5c970b9bcd3c1df0441a9614dd6",
      "tree": "7ffa45b4faf628da0ac8713e253517f88d77f79f",
      "parents": [
        "2ceefba8d5afaf19ab003071523965affe5d5c40"
      ],
      "author": {
        "name": "Weibing Wang",
        "email": "wwbmmm@gmail.com",
        "time": "Sun Jun 14 18:56:24 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sun Jun 14 18:56:24 2026 +0800"
      },
      "message": "Fix HPACK dynamic table size update recursive decoding (#3343)"
    },
    {
      "commit": "2ceefba8d5afaf19ab003071523965affe5d5c40",
      "tree": "855d1ad57cedd4b39fe5aa71959534020ed2d5ac",
      "parents": [
        "4cd0a727e272fa285e1ff5f82f661a5bada83d3c"
      ],
      "author": {
        "name": "Enrico",
        "email": "129476350+yannan-wyn@users.noreply.github.com",
        "time": "Sun Jun 14 13:46:38 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sun Jun 14 13:46:38 2026 +0800"
      },
      "message": "fix(bthread): refactor sharded priority queue with per-ED shard (#3270)\n\n* fix(bthread): refactor sharded priority queue with per-ED shard\n\nEach EventDispatcher gets its own WorkStealingQueue, making concurrent\npush from multiple EDs naturally SPMC-safe without spinlocks.\n\nfix: comments of redundant namespace\n\nfix: ut failure and -1 issue\n\n* fix: comments about priority pq renaming\n\n---------\n\nCo-authored-by: yannan.wyn \u003cyannan.wyn@antgroup.com\u003e"
    },
    {
      "commit": "4cd0a727e272fa285e1ff5f82f661a5bada83d3c",
      "tree": "7e959943b442951f84dcd6a59bb842aff160d7f4",
      "parents": [
        "7b8b85bb53caeb337adf263b980a520893c65221"
      ],
      "author": {
        "name": "Bright Chen",
        "email": "chenguangmingfe@foxmail.com",
        "time": "Sun Jun 14 12:51:18 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sun Jun 14 12:51:18 2026 +0800"
      },
      "message": "Add IOBuf\u003c-\u003estd::iostream adapters for zero-copy I/O (#3341)\n\nIntroduce four classes that bridge IOBuf and the standard iostream\nhierarchy, enabling parsers and serializers that take std::istream\u0026 /\nstd::ostream\u0026 (e.g. nlohmann::json) to read from and write to IOBuf\ndirectly without an intermediate string copy:\n\n  - IOBufAsInputStreamBuf  : read-only streambuf over IOBuf blocks\n  - IOBufInputStream       : std::istream view over IOBuf\n  - IOBufAsOutputStreamBuf : append-only streambuf, reusing\n                             IOBufAsZeroCopyOutputStream\u0027s TLS block pool\n  - IOBufOutputStream      : std::ostream view over IOBuf"
    },
    {
      "commit": "7b8b85bb53caeb337adf263b980a520893c65221",
      "tree": "44cab361e30063f6d8c8bec504aa319dd99a14dd",
      "parents": [
        "291b6aafdcb59831ca88eaa4e6e3c3557fbf5d40"
      ],
      "author": {
        "name": "sahvx655-wq",
        "email": "sahvx655@gmail.com",
        "time": "Sun Jun 14 10:05:49 2026 +0530"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sun Jun 14 12:35:49 2026 +0800"
      },
      "message": "Bound exp-golomb suffix read to bitstream in avc_nalu_read_uev (#3334)"
    },
    {
      "commit": "291b6aafdcb59831ca88eaa4e6e3c3557fbf5d40",
      "tree": "f6e013c10e1559f12e63e35cbcca4aee1b2d6461",
      "parents": [
        "b69fabd5de62c07bdbea45b263d3fbd72b5b675a"
      ],
      "author": {
        "name": "sahvx655-wq",
        "email": "sahvx655@gmail.com",
        "time": "Sun Jun 14 10:05:11 2026 +0530"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sun Jun 14 12:35:11 2026 +0800"
      },
      "message": "Cast to unsigned char in ctype calls on untrusted request bytes (#3335)\n\nSigned-off-by: sahvx655-wq \u003csahvx655@gmail.com\u003e"
    },
    {
      "commit": "b69fabd5de62c07bdbea45b263d3fbd72b5b675a",
      "tree": "b55f1fa3993f4e255138ae18a84ace8e4f61662e",
      "parents": [
        "68d18eecf7878018a171ef660ffdba25b683c01a"
      ],
      "author": {
        "name": "sahvx655-wq",
        "email": "sahvx655@gmail.com",
        "time": "Sun Jun 14 10:03:57 2026 +0530"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sun Jun 14 12:33:57 2026 +0800"
      },
      "message": "Reject zero-length padded DATA frame in H2Context::OnData (#3325)"
    },
    {
      "commit": "68d18eecf7878018a171ef660ffdba25b683c01a",
      "tree": "bb04e43283800c13c3703e948a02da5013bbcc8c",
      "parents": [
        "b393fa2c9ed7318abf0792e333aab3a725514e1c"
      ],
      "author": {
        "name": "rajvarun77",
        "email": "varun.cse.iitg@gmail.com",
        "time": "Sun Jun 14 00:32:43 2026 -0400"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sun Jun 14 12:32:43 2026 +0800"
      },
      "message": "Fix inline redis protocol consuming HTTP/2 connection preface (#3338)\n\nInline redis protocol support (#3024) accepts any alpha-leading line as\nan inline command. The HTTP/2 client connection preface\n(\"PRI * HTTP/2.0\\r\\n\\r\\nSM\\r\\n\\r\\n\") is alpha-leading, so it was parsed\nas an inline command instead of returning PARSE_ERROR_TRY_OTHERS. This\nprevented protocol auto-detection from falling through to HTTP/2, and\ngRPC clients calling a server with redis_service enabled failed with\n\"connection closed before server preface received\".\n\nDetect the HTTP/2 preface (fully, or as a not-yet-complete prefix) in\nthe inline branch of RedisCommandParser::ConsumeImpl and defer to other\nprotocols. A command-name blacklist is not viable because some HTTP\nmethods are also valid redis commands (e.g. GET), whereas the preface\nis a fixed magic string that no redis command begins with, making the\ncheck unambiguous.\n\nAdd RedisTest.inline_does_not_eat_h2_preface covering the full preface,\na partial prefix, and a genuine inline command sharing the leading byte.\n\nCo-authored-by: rajvarun77 \u003c287367605+rajvarun77@users.noreply.github.com\u003e\nCo-authored-by: Claude Opus 4.8 (1M context) \u003cnoreply@anthropic.com\u003e"
    },
    {
      "commit": "b393fa2c9ed7318abf0792e333aab3a725514e1c",
      "tree": "65746a49399d9320f79425d01b9f8fcd850184d0",
      "parents": [
        "ce585811885b12a2d905d2a90640689de2efe71f"
      ],
      "author": {
        "name": "Aurélien Pupier",
        "email": "apupier@ibm.com",
        "time": "Sun Jun 14 05:54:24 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sun Jun 14 11:54:24 2026 +0800"
      },
      "message": "Configure GitHub workflows to use concurrency cancel-in-progress for (#3333)\n\npull requests\n\nsee recommended best practices at Apache\nhttps://cwiki.apache.org/confluence/pages/viewpage.action?spaceKey\u003dINFRA\u0026title\u003dGitHub+Actions+Recommended+Practices\n\nSigned-off-by: Aurélien Pupier \u003capupier@ibm.com\u003e"
    },
    {
      "commit": "ce585811885b12a2d905d2a90640689de2efe71f",
      "tree": "d77b1859957ec1d7010d511605b8593e2602d2c6",
      "parents": [
        "a4ddf9716da6af292dc100a2e6e061e07f77becd"
      ],
      "author": {
        "name": "neilxxxxx",
        "email": "130038611+neilxxxxx@users.noreply.github.com",
        "time": "Sun Jun 14 11:45:55 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sun Jun 14 11:45:55 2026 +0800"
      },
      "message": "feat:Support for TLSv1.3 (#3319)\n\n* feat:Support for TLSv1.3\n\n* Align other UTs in this file\n\n---------\n\nCo-authored-by: lairongzeng \u003clairongzeng@bigo.sg\u003e"
    },
    {
      "commit": "a4ddf9716da6af292dc100a2e6e061e07f77becd",
      "tree": "0ad9249ca8183aa0ae042a1660566f98fe58e309",
      "parents": [
        "77e2907314bed74c4dc41e7f943048eacb334e7f"
      ],
      "author": {
        "name": "rajvarun77",
        "email": "varun.cse.iitg@gmail.com",
        "time": "Sat Jun 13 06:18:20 2026 -0400"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sat Jun 13 18:18:20 2026 +0800"
      },
      "message": "test: bump brpc_channel_unittest to size\u003dlarge (900s) (#3339)\n\nbrpc_channel_unittest packs dozens of timing-sensitive TEST_F (backup\nrequest, retry/backoff, timeouts) into a single binary. On contended CI\nrunners its cumulative real-time waits exceed Bazel\u0027s default per-test\n300s (size\u003dmedium) limit, producing flaky TIMEOUT failures (observed\nTIMEOUT in 4/5 no-cache runs on a GitHub ubuntu-22.04 runner).\n\nAdd an optional per_test_size override to the generate_unittests macro\nand set brpc_channel_unittest to size\u003dlarge (900s). No test source changes.\n\nSharding was rejected: the binary\u0027s TEST_F share fixed loopback endpoints\nand global state, so parallel shards make a \u0027connection refused\u0027 test\nobserve another shard\u0027s live server and fail deterministically.\n\nCo-authored-by: rajvarun77 \u003c287367605+rajvarun77@users.noreply.github.com\u003e\nCo-authored-by: Claude Opus 4.8 (1M context) \u003cnoreply@anthropic.com\u003e"
    },
    {
      "commit": "77e2907314bed74c4dc41e7f943048eacb334e7f",
      "tree": "e78057a84fe5dda81ec13b752fbe66424c8ed5b4",
      "parents": [
        "72adb6ec24a98247b0f6d8c2ce40a6fc3ae0c41b"
      ],
      "author": {
        "name": "rajvarun77",
        "email": "varun.cse.iitg@gmail.com",
        "time": "Wed Jun 10 22:17:28 2026 -0400"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Jun 11 10:17:28 2026 +0800"
      },
      "message": "[mysql] Clean-room auth handshake codec (scramble + handshake + packet, Stage 1a of #2093) (#3310)\n\n* feat(mysql): clean-room auth-handshake codec (scramble + handshake + packet)\n\nPicks up the connection-phase authentication layer of MySQL protocol\nsupport per the staged plan announced on dev@brpc.apache.org and\nPR #2093. Three modules under src/brpc/policy/mysql_auth/:\n\n  - mysql_auth_scramble:  mysql_native_password (SHA1 XOR), plus\n    caching_sha2_password fast path (SHA256 XOR) and slow path with\n    both branches:\n      - RSA-OAEP via OpenSSL EVP_PKEY_encrypt + PKCS1_OAEP_PADDING\n      - TLS-cleartext (NUL-terminated password) selected at runtime\n        via CachingSha2PasswordSlowPath(..., bool is_ssl \u003d false).\n        Default is_ssl\u003dfalse preserves RSA behavior for callers not\n        yet threaded with the connection\u0027s TLS state.\n  - mysql_auth_packet:    length-encoded int/string, 4-byte packet\n    header, NUL-terminated string.\n  - mysql_auth_handshake: HandshakeV10 parse, HandshakeResponse41\n    build, AuthSwitchRequest parse, AuthMoreData parse.\n\nAll written clean-room from MySQL\u0027s public protocol documentation;\nno GPL-licensed source was consulted. SHA-256 and RSA paths use\nOpenSSL EVP -- works under both OpenSSL and BoringSSL.\n\n75 unit tests across three files under test/mysql_auth/:\n  36 in brpc_mysql_auth_scramble_unittest.cpp\n  19 in brpc_mysql_auth_handshake_unittest.cpp\n  20 in brpc_mysql_auth_packet_unittest.cpp\n\nMirrors every client-relevant case from mysql/mysql-server\u0027s\nGPLv2 unittest/gunit/sha2_password-t.cc + sha256_scramble_t.cc with\nindependently re-derived hex vectors. Server-side cases (cache,\nstorage format, *_verification_*) are out of scope for a client\nlibrary; full mapping table linked from the PR description.\n\nScope limits in this CL: auth codec only. No PROTOCOL_MYSQL\nregistration, no Socket integration, no compressed packets, no\nprepared statements, no transactions. All land in the follow-up CL.\nTLS state plumbing in Stage 1c flows the dispatcher\u0027s\nSocket::is_ssl() into the trailing argument here -- no further API\nchange.\n\nReplaces the earlier src/brpc/policy/mysql_auth_hash.{h,cpp} +\ntest/brpc_mysql_auth_hash_unittest.cpp; those files are moved into\nthe new mysql_auth/ subdirectory and renamed.\n\n* fix(mysql): handle lenenc NULL (0xFB) and reject oversize auth_response\n\nAddress review findings on the Stage-1a auth codec (#3310):\n\n- DecodeLengthEncodedInt/String: 0xFB is the protocol NULL marker, not an\n  error. Decode it as NULL (1 byte consumed) via a new optional bool*\n  is_null out-param instead of folding it into the failure path, so the\n  shared codec can faithfully parse resultsets containing NULL. Define\n  *out/*is_null on every path and use an overflow-safe bounds check.\n\n- BuildHandshakeResponse41: the CLIENT_SECURE_CONNECTION 1-byte length\n  prefix cannot represent an auth_response \u003e255 bytes. Fail hard (return\n  bool false, write nothing, LOG(ERROR)) instead of silently truncating,\n  which produced an invalid response and desynchronized the packet stream.\n  Callers with larger payloads must negotiate\n  CLIENT_PLUGIN_AUTH_LENENC_CLIENT_DATA.\n\nAdds unit tests for the NULL marker (int + string) and for the oversize\nreject / 255-byte boundary cases.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) \u003cnoreply@anthropic.com\u003e\n\n* chore(mysql): add diagnostic error logs on auth-codec failure paths\n\nPer review (chenBright on #3310): the handshake/packet parsers returned\nfalse/0 silently on malformed, truncated, or unsupported input, giving no\nclue why a connection failed. Add a LOG(ERROR) at each failure path naming\nthe function and the concrete cause (truncated \u003cfield\u003e, pre-4.1 server,\nreserved 0xFF marker, length mismatch, etc.). Logic unchanged — only logs\ninserted; the lenenc NULL (0xFB) success path is intentionally not logged.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) \u003cnoreply@anthropic.com\u003e\n\n* chore(mysql): demote lenenc-codec diagnostic logs to LOG(WARNING)\n\nThe length-encoded int/string/header decode failures fire during normal\nresultset parsing and are not catastrophic, so log them at WARNING rather\nthan ERROR. Handshake-parse failures stay at LOG(ERROR) (a malformed\nhandshake is a fatal connection-setup failure). Severity-only change.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) \u003cnoreply@anthropic.com\u003e\n\n* fix(mysql): build and run mysql/ unittests in Makefile CI path\n\ntest/Makefile and test/run_tests.sh drive the make-based CI lane\n(clang-unittest: `cd test \u0026\u0026 make` then `sh ./run_tests.sh`). Both used\nnon-recursive globs anchored at test/, so the new tests under test/mysql/\nwere neither compiled nor executed there — only the CMake and Bazel lanes\npicked them up. The make lane was silently green without running them.\n\n- Makefile: add `$(wildcard mysql/brpc_*unittest.cpp)` to TEST_BRPC_SOURCES,\n  plus a `mysql/brpc_%_unittest:` link rule (the existing `brpc_%_unittest:`\n  pattern anchors on a literal `brpc_` prefix and won\u0027t match a `mysql/`\n  target).\n- run_tests.sh: add `mysql/brpc*unittest` to the executed set and enable\n  `nullglob` so a missing subdir expands to nothing instead of a bogus name.\n\nAddresses @chenBright\u0027s review note that test/Makefile is used by CI and\nmust be updated for the new MySQL tests.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) \u003cnoreply@anthropic.com\u003e\n\n* fix(test): make AuthCase a C++11 aggregate so push_back{...} compiles\n\nCI compiles the unittests with -std\u003dc++0x (C++11). The test helper struct\nAuthCase had a default member initializer (bool use_ssl \u003d false), which\nmakes a class a non-aggregate under C++11 (the rule was only relaxed in\nC++14). That broke every g_auth_cases.push_back({label,user,password,ssl})\nwith \"no matching member function for call to \u0027push_back\u0027\", failing the\nclang-unittest and clang-unittest-asan compile-tests step.\n\nDrop the default member initializer; all five init sites already pass\nuse_ssl explicitly, so behavior is unchanged and the struct is again an\naggregate that accepts braced-init under C++11.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) \u003cnoreply@anthropic.com\u003e\n\n* fix(build): compile src/brpc/policy/mysql into libbrpc in the Makefile\n\nThe Makefile builds libbrpc by globbing $(d)/* over BRPC_DIRS, and the\nglob is non-recursive, so src/brpc/policy/mysql/*.cpp was never compiled\ninto the library. The make-based CI lanes (clang-unittest,\nclang-unittest-asan) therefore failed to link the mysql unittests with\n\"undefined reference to brpc::policy::mysql::*\" for every codec symbol.\nCMake (file(GLOB_RECURSE src/brpc/*.cpp)) and Bazel already pick the\ndirectory up, which is why only the make lanes broke once the mysql tests\nwere wired into that lane.\n\nAdd src/brpc/policy/mysql to BRPC_DIRS so the codec sources land in\nlibbrpc.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) \u003cnoreply@anthropic.com\u003e\n\n* test(mysql): move auth unittests from mysql/ subdir into test/\n\nMove the three clean-room auth unittests (handshake, packet, scramble)\nand their test-plan doc out of test/mysql/ into test/, per review on\napache/brpc#3310. The existing brpc_*_unittest glob in the Makefile,\nCMakeLists.txt and BUILD.bazel now picks them up, so all three build\nscripts revert to master with no mysql-specific additions.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) \u003cnoreply@anthropic.com\u003e\n\n* test(mysql): drop run_tests.sh mysql/ subdir entry after move\n\nThe auth unittests now live in test/ and match the existing\nbrpc*unittest glob in run_tests.sh, so revert the script to master. The\nremoved mysql/brpc*unittest entry needed `shopt -s nullglob` to skip a\nmissing subdir, but CI runs the script under `sh` (dash), where shopt is\nabsent; nullglob stayed off and the now-empty glob was executed as a\nliteral path, exiting 127.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) \u003cnoreply@anthropic.com\u003e"
    },
    {
      "commit": "72adb6ec24a98247b0f6d8c2ce40a6fc3ae0c41b",
      "tree": "6adaf38641bdb3b0b35e4a850139ab3fdce1aef9",
      "parents": [
        "af515cc17301e4fa84f94b36b438df4858e10be5"
      ],
      "author": {
        "name": "Bright Chen",
        "email": "chenguangmingfe@foxmail.com",
        "time": "Fri Jun 05 17:15:54 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Jun 05 17:15:54 2026 +0800"
      },
      "message": "Support RDMA handshake V3 (#3326)\n\nBackground\n\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\nThe legacy v2 handshake (\"RDMA\" magic + 36B fixed binary HelloMessage)\nhad correctness bugs that made the wire format effectively\nunevolvable.\n\nv2 bugs\n\u003d\u003d\u003d\u003d\u003d\u003d\u003d\nA. Client never drained the \"unknown tail\" bytes when a peer sent\n   msg_len \u003e HELLO_MSG_LEN_MIN(40). Leftover bytes stayed in the\n   socket recv buffer and silently corrupted the next ReadFromFd\n   (the ACK).\nB. Server had the symmetric version of A.\nC. Server computed the body read length from its LOCAL\n   g_rdma_hello_msg_len, implicitly assuming the peer\u0027s hello is the\n   same length as its own. A longer peer left bytes behind; a shorter\n   peer made the read block. Client used the correct compile-time\n   constant; the two sides were not symmetric.\n\nCombined, A/B/C meant v2 could not safely append a single byte to the\nhello -- even an \"optional hint\" appended by a newer sender would\nmis-align an older receiver\u0027s next read.\n\nv3 design\n\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\nWire format, magic-namespace-isolated from v2:\n\n  [ \"RDM3\" 4B ][ pb_size 4B big-endian ][ RdmaHello protobuf bytes ]\n\nwith pb_size in (0, 4096]. RdmaHello carries the same 6 base fields\nas v2 plus room to append future capabilities.\n\nWhy protobuf (and not \"v2 plus length prefix\")\n----------------------------------------------\n- Variable-length fields are coming. Future capability fields will\n  include strings (rdma_device_name, netdev_name, ...) and other\n  variable-length data. Supporting them on a fixed-binary protocol\n  forces us to invent and maintain a TLV layer (per-field type +\n  length + value framing, plus version-aware deserialization). That\n  is reimplementing protobuf badly. Using protobuf from day one\n  costs nothing and is the canonical answer.\n- Fixes v2 bug A/B/C generically: pb_size makes the wire\n  self-describing, so the receiver never needs to guess the length\n  or know the peer\u0027s schema version to read the body cleanly.\n- Append-only field evolution out of the box: new optional fields\n  cost old receivers nothing -- they\u0027re skipped as unknown protobuf\n  fields. v2 with a hand-rolled length prefix would still need\n  per-field opt-in code on every side.\n- Built-in validation: ParseFromArray fails fast on malformed input;\n  required-field presence is enforced at the parse layer, not by\n  ad-hoc has_xxx() checks scattered through wire code.\n- bRPC already depends on protobuf -- no new build dependency.\n\nWhy a NEW MAGIC rather than a version field inside protobuf\n-----------------------------------------------------------\n- Forces \"breaking change\" to be a deployment decision visible at\n  the wire level. You cannot accidentally ship a backwards-\n  incompatible patch via a field-semantics tweak.\n- Server-side dispatch routes by magic to fully independent state\n  machines that can\u0027t entangle (no `if (version \u003d\u003d X)` branches\n  anywhere -- this is the abstraction\u0027s red line).\n- Any future breaking change bumps the magic (\"RDM4\", \"RDM5\", ...).\n  v3 fields, once shipped, never change semantics.\n\nRollout\n\u003d\u003d\u003d\u003d\u003d\u003d\u003d\nServer-side ALWAYS accepts both v2 and v3 (no gflag, no kill-switch);\nmagic routes to fully independent code paths. A single rolling upgrade\nenables v3 fleet-wide.\n\nClient-side picks the wire protocol via gflag with a safe default:\n\n    FLAGS_rdma_client_handshake_version  (default 2)\n      2 \u003d \"RDMA\" legacy (zero-regression default)\n      3 \u003d \"RDM3\" protobuf (opt-in once target servers support v3)\n\nSub-second rollback is one flag flip away. v3 client to v2-only legacy\nserver is NOT guaranteed to transparently fall back on the same\nconnection -- the supported migration is \"upgrade servers first, then\nopt-in clients\"."
    },
    {
      "commit": "af515cc17301e4fa84f94b36b438df4858e10be5",
      "tree": "92de764dea6082952c4a0704e7bb0b7a5334c4b0",
      "parents": [
        "9d5e5a7f263569fedc3257ffc679e8786a84b7ce"
      ],
      "author": {
        "name": "Daeho Ro",
        "email": "40587651+daeho-ro@users.noreply.github.com",
        "time": "Fri Jun 05 12:41:49 2026 +0900"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Jun 05 11:41:49 2026 +0800"
      },
      "message": "Fix guard SO_BINDTODEVICE (#3320)"
    },
    {
      "commit": "9d5e5a7f263569fedc3257ffc679e8786a84b7ce",
      "tree": "e81779b89e18f4a9392a6a4555afe28feed78c71",
      "parents": [
        "f98d5d0628483a7a730d2ec4db5e3bea89cf8f00"
      ],
      "author": {
        "name": "Jarek Potiuk",
        "email": "jarek@potiuk.com",
        "time": "Fri Jun 05 04:49:21 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Jun 05 10:49:21 2026 +0800"
      },
      "message": "Add threat model + security-model discoverability (AGENTS.md → SECURITY.md → THREAT_MODEL.md) (#3324)\n\n* Add threat model + security-model discoverability (AGENTS.md → SECURITY.md → THREAT_MODEL.md)\n\nGenerated-by: Claude Code\n\n* THREAT_MODEL.md: renumber out-of-scope threats list to start at 1\n\nPer review (chenBright) — the \"Threats explicitly out of scope\" list was\ncontinuing the previous list\u0027s numbering (8-15); restart at 1-8.\n\nGenerated-by: Claude Code"
    },
    {
      "commit": "f98d5d0628483a7a730d2ec4db5e3bea89cf8f00",
      "tree": "4f8e93a2b2bfce8c8f11e56463be1354640ad4b9",
      "parents": [
        "1d21b050b8780c82bccc387def957a7e48dcf114"
      ],
      "author": {
        "name": "Felix-Gong",
        "email": "gongxiaofei24@iscas.ac.cn",
        "time": "Fri Jun 05 10:30:31 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Jun 05 10:30:31 2026 +0800"
      },
      "message": "Fix HTTPS pooled client crash on unexpected SSL EOF (#3316)\n\n* Fix HTTPS pooled client crash on unexpected SSL EOF\n\nWhen OpenSSL 3.x detects unexpected EOF (peer closed without\nclose_notify), SSL_read returns 0 with SSL_ERROR_SSL. The code\ndidn\u0027t return -1, causing error_code\u003d0 to propagate to\nController::SetFailed() which triggers CHECK(false).\n\nFix by returning -1 with errno\u003dESSL when SSL errors are detected\nin DoRead(), instead of falling through and returning nr.\n\nDiscovered during RISC-V porting and integration testing.\n\nFixes #3307\nSigned-off-by: Felix Gong \u003cgongxiaofei24@iscas.ac.cn\u003e\n\n* Add unit test for unexpected SSL EOF handling\n\nTest that Socket::DoRead() returns -1 with errno\u003dESSL when the remote\nside closes the TCP connection without sending close_notify, verifying\nthe fix in commit 7a1dfe7c.\n\n---------\n\nSigned-off-by: Felix Gong \u003cgongxiaofei24@iscas.ac.cn\u003e"
    },
    {
      "commit": "1d21b050b8780c82bccc387def957a7e48dcf114",
      "tree": "da6a15ece984e74e65f10545cd67844c7d2dc1fa",
      "parents": [
        "49a15c25e76a8f7640e46f9e09828a67151f4a0e"
      ],
      "author": {
        "name": "rajvarun77",
        "email": "varun.cse.iitg@gmail.com",
        "time": "Thu Jun 04 22:13:07 2026 -0400"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Jun 05 10:13:07 2026 +0800"
      },
      "message": "ci(linux): bring up redis-server and mysql-server for unittests (#3323)\n\n* ci(linux): bring up redis-server and mysql-server for unittests\n\nThe clang-unittest and clang-unittest-asan jobs run the full unit test\nsuite via test/run_tests.sh, which includes backend integration tests\n(e.g. brpc_redis_unittest) that fork a real server when its binary is\npresent and otherwise silently short-circuit to a passing result. Since\nCI never installed those servers, the redis backend tests reported\nPASSED while doing nothing (7 of 14 RedisTest cases skip-as-pass).\n\nInstall redis-server and mysql-server before running the tests in both\nunittest jobs so these backend tests execute against a live server. The\nbinaries are added only in the unittest jobs, not in the shared\ninstall-essential-dependencies action used by compile-only jobs.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) \u003cnoreply@anthropic.com\u003e\n\n* ci(linux): skip flaky redis client tests under ASan\n\nbrpc_redis_unittest forks a real redis-server and waits a fixed 50ms before\nconnecting; under ASan redis starts too slowly, causing flaky connection-refused.\nSkip RedisTest.* in the ASan job only (still covered by clang-unittest).\n\nCo-Authored-By: Claude Opus 4.8 (1M context) \u003cnoreply@anthropic.com\u003e\n\n* ci(linux): install redis-server and mysql-server in install-essential-dependencies\n\nMove the redis-server/mysql-server install out of the individual\nclang-unittest and clang-unittest-asan jobs and into the shared\ninstall-essential-dependencies composite action, so every job that\ninstalls dependencies has the servers available (and the unittest jobs\nno longer carry a bespoke install step).\n\nUnder ASan the redis integration tests (sanity, keys_with_spaces,\nincr_and_decr, by_components, auth) fork a real redis-server and connect\nafter a fixed 50ms wait; redis starts too slowly there and they flake\nwith connection refused. Filter just those out under ASan -- the redis\ncodec/server tests still run, and the full suite runs in clang-unittest.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) \u003cnoreply@anthropic.com\u003e\n\n* ci(linux): run forked-server integration tests under bazel\n\nThe bazel unittest jobs ran //test/... without redis-server/mysql-server\ninstalled, so brpc_redis_unittest forked nothing and its integration cases\n(sanity/keys_with_spaces/incr_and_decr/by_components/auth) early-returned as\npasses -- green but vacuous.\n\n- Install redis-server/mysql-server in the (non-ASan) bazel test jobs via the\n  shared install-essential-dependencies action (the same one the make jobs\n  use), so the servers are on PATH for the forked tests.\n- Tag brpc_redis_unittest \"external\" + \"local\" so bazel always re-runs it\n  (never serves a cached skip) and runs it outside the sandbox where the\n  PATH-located redis-server is visible and loopback works. Threaded through\n  generate_unittests via a new per_test_tags arg.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) \u003cnoreply@anthropic.com\u003e\n\n---------\n\nCo-authored-by: rajvarun77 \u003c287367605+rajvarun77@users.noreply.github.com\u003e\nCo-authored-by: Claude Opus 4.8 (1M context) \u003cnoreply@anthropic.com\u003e"
    },
    {
      "commit": "49a15c25e76a8f7640e46f9e09828a67151f4a0e",
      "tree": "4d33295dcbae2b831293ddda2c0e7838fd0abcc4",
      "parents": [
        "bf4d647f35daecdbe6af7de2fc3886ef50522234"
      ],
      "author": {
        "name": "Felix-Gong",
        "email": "gongxiaofei24@iscas.ac.cn",
        "time": "Mon Jun 01 01:45:54 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sun May 31 19:45:54 2026 +0200"
      },
      "message": "optimize crc32c for riscv64 with Zbc carry-less multiplication (#3312)\n\n* optimize crc32c for riscv64 with Zbc carry-less multiplication\n\nImplement hardware-accelerated CRC32C for RISC-V using the Zbc\n(carry-less multiplication) extension. The implementation uses\n128-bit folding with 4-way parallelism and Barrett reduction,\nfollowing the approach from Hadoop PR #8371.\n\nKey changes:\n- Add rv_clmul/rv_clmulh inline assembly wrappers\n- Implement 128-bit fold with 4-way parallel processing (64 bytes/iter)\n- Add Barrett reduction for final 128-bit to 32-bit conversion\n- Runtime CPU feature detection via /proc/cpuinfo\n- Compile-time guard: #ifdef __riscv_zbc\n- CMake option: WITH_RISCV_ZBC (default OFF)\n\nPerformance: 3-4x speedup over table-based 8-byte unrolled baseline,\n~1.1 GB/s throughput on 1MB data.\nCorrectness: Verified against RFC 3720 B.4 and bitwise reference.\n\nSigned-off-by: Felix-Gong \u003cgongxiaofei24@iscas.ac.cn\u003e\n\n* fix: wrap isSSE42() in #ifdef __SSE4_2__ to fix -Wunused-function\n\nisSSE42() is only called from within #ifdef __SSE4_2__ blocks,\nbut the function definition was unconditional, causing\n-Wunused-function errors on non-x86 builds with -Werror.\n\nSigned-off-by: Felix-Gong \u003cgongxiaofei24@iscas.ac.cn\u003e\n\n* Potential fix for pull request finding\n\nCo-authored-by: Copilot Autofix powered by AI \u003c175728472+Copilot@users.noreply.github.com\u003e\n\n* Fix CRC32C Zbc: add missing ^ 0xFFFFFFFF pre/post processing\n\nrv_crc32c_clmul was missing the standard CRC32C pre/post XOR\nconversion. ExtendImpl does crc ^ 0xFFFFFFFF at entry and\nresult ^ 0xFFFFFFFF at exit, but rv_crc32c_clmul did neither,\ncausing wrong CRC values on RISC-V with Zbc extension.\n\nSigned-off-by: Felix-Gong \u003cgongxiaofei24@iscas.ac.cn\u003e\n\n---------\n\nSigned-off-by: Felix-Gong \u003cgongxiaofei24@iscas.ac.cn\u003e\nCo-authored-by: Copilot Autofix powered by AI \u003c175728472+Copilot@users.noreply.github.com\u003e"
    },
    {
      "commit": "bf4d647f35daecdbe6af7de2fc3886ef50522234",
      "tree": "1a3567f0d4beaa277c4f1dc6aeadcac7291cb2ec",
      "parents": [
        "cd3948ceac996e1cee49263e12b0f6746207f24c",
        "e63a54dcaacadb04bde5e2fa3839417e8484cf43"
      ],
      "author": {
        "name": "HU",
        "email": "uestc.hugo@gmail.com",
        "time": "Sun May 31 19:18:24 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sun May 31 19:18:24 2026 +0800"
      },
      "message": "Merge pull request #3317 from apache/release-1.17\n\nmerge from release-1.17"
    },
    {
      "commit": "cd3948ceac996e1cee49263e12b0f6746207f24c",
      "tree": "699b041e0d80f7a5fad9643a9b30cb22c5e84302",
      "parents": [
        "e9d4b190fb7198fad0f9a296905fe33b761fb818"
      ],
      "author": {
        "name": "Bright Chen",
        "email": "chenguangmingfe@foxmail.com",
        "time": "Sun May 31 10:48:30 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sun May 31 10:48:30 2026 +0800"
      },
      "message": "Refactor Bazel build with custom proto rules and build all test targets (#3313)"
    },
    {
      "commit": "e9d4b190fb7198fad0f9a296905fe33b761fb818",
      "tree": "6877c113217f56b8779887133dad9b216f99d394",
      "parents": [
        "0835315bd65de9ce4ea21bc17e95e936785ee1d9"
      ],
      "author": {
        "name": "Felix-Gong",
        "email": "gongxiaofei24@iscas.ac.cn",
        "time": "Fri May 29 15:29:04 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri May 29 15:29:04 2026 +0800"
      },
      "message": "Fix static initialization order fiasco in AdaptiveMaxConcurrency (#3315)\n\nAdaptiveMaxConcurrency has two class-static std::string members (UNLIMITED\nand CONSTANT) defined in adaptive_max_concurrency.cpp. Global\nAdaptiveMaxConcurrency objects in other translation units may be constructed\nbefore these static strings are initialized, causing undefined behavior.\n\nThis issue was discovered during RISC-V porting and testing of BRPC.\nDifferent toolchains and linkers (GCC, Clang, cross-compilation toolchains\nfor RISC-V, etc.) may produce different static initialization orders, making\nthis bug manifest on some platforms but not others.\n\nFix by replacing class-static std::string members with Meyers\u0027 Singleton\npattern (function-local statics), which C++11 guarantees are initialized\non first use in a thread-safe manner.\n\nThis fix benefits all architectures including x86_64, ARM64, and RISC-V.\n\nSigned-off-by: Felix-Gong \u003cgongxiaofei24@iscas.ac.cn\u003e"
    },
    {
      "commit": "0835315bd65de9ce4ea21bc17e95e936785ee1d9",
      "tree": "916c3f34001f469cd407c6a768b07ae94e295e3f",
      "parents": [
        "3c9ff52501215c6ed105be8d31665074d84f0cee",
        "781b8222091a64af40e56cd718c9de6ffdb9c8d9"
      ],
      "author": {
        "name": "Yang,Liming",
        "email": "liming.yang@139.com",
        "time": "Fri May 29 11:06:07 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri May 29 11:06:07 2026 +0800"
      },
      "message": "Merge pull request #3303 from randomkang/opt_default_block_size\n\nupdate butil::default_block_size when rdma_recv_block_type is set"
    },
    {
      "commit": "781b8222091a64af40e56cd718c9de6ffdb9c8d9",
      "tree": "c121af71e72a887c4fd57580e37a7e33fc6e8779",
      "parents": [
        "08d95ac3b1c7c1577bb21f61655fa136b16b9c31"
      ],
      "author": {
        "name": "randomkang",
        "email": "550941794@qq.com",
        "time": "Tue May 26 00:51:33 2026 +0800"
      },
      "committer": {
        "name": "randomkang",
        "email": "550941794@qq.com",
        "time": "Fri May 29 00:34:41 2026 +0800"
      },
      "message": "update butil::default_block_size when rdma_recv_block_type is set\n"
    },
    {
      "commit": "3c9ff52501215c6ed105be8d31665074d84f0cee",
      "tree": "caf2bbc2050f8f01eb2f59998509b1c187bb6b66",
      "parents": [
        "ca98f8524302e5e1553067e2ceb9aa42870da7ce"
      ],
      "author": {
        "name": "Felix-Gong",
        "email": "gongxiaofei24@iscas.ac.cn",
        "time": "Thu May 28 23:15:24 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu May 28 23:15:24 2026 +0800"
      },
      "message": "fix: prevent null dereference in fuzz test socket initialization (#3314)\n\n- Fix get_fuzz_socket() to only set initialized\u003dtrue when both\n  Socket::Create and Socket::Address succeed, allowing retry on failure\n- Add NULL socket checks in all 9 fuzz tests that use get_fuzz_socket()\n  to prevent null pointer dereference when socket creation fails\n\nFixes #3114"
    },
    {
      "commit": "ca98f8524302e5e1553067e2ceb9aa42870da7ce",
      "tree": "1392654b3ec5b8501f13b6a711df057a8b6d5da9",
      "parents": [
        "477fa492d6de82720c7c85abc6835188f9040c2c",
        "5dfb0b5431739a1365f7ab423c869ff2597a69d1"
      ],
      "author": {
        "name": "Yang,Liming",
        "email": "liming.yang@139.com",
        "time": "Thu May 28 15:00:35 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu May 28 15:00:35 2026 +0800"
      },
      "message": "Merge pull request #3300 from randomkang/opt_rdma_flags\n\nOpt rdma flags"
    },
    {
      "commit": "477fa492d6de82720c7c85abc6835188f9040c2c",
      "tree": "349c4dbd8a30a7d639f363ec2f8f838226df65af",
      "parents": [
        "f97f23edbaf3f47e25dc925a947b15b45810276a"
      ],
      "author": {
        "name": "Bright Chen",
        "email": "chenguangmingfe@foxmail.com",
        "time": "Wed May 27 15:52:56 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed May 27 15:52:56 2026 +0800"
      },
      "message": "Fix UAF in SSLTest.connect_on_create (#3311)"
    },
    {
      "commit": "f97f23edbaf3f47e25dc925a947b15b45810276a",
      "tree": "2006ce99c14a4bc1551d440bd6fbc4473ba3c4e1",
      "parents": [
        "a47e34903fdbb202c8786167bddd5ea519772d84"
      ],
      "author": {
        "name": "Bright Chen",
        "email": "chenguangmingfe@foxmail.com",
        "time": "Wed May 27 10:56:43 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed May 27 10:56:43 2026 +0800"
      },
      "message": "Hide libunwind\u0027s _Unwind_* symbols under Bazel to fix bthread_tracer crash (#3297)\n\nlibunwind ships its `src/unwind/*.c` (the GCC `_Unwind_*`\nABI compatibility layer) as exported symbols of `libexternal_S~libunwind.so`.\nAt runtime the dynamic loader resolves `_Unwind_*` lookups (from\n`pthread_exit`, libstdc++\u0027s `__gxx_personality_v0`, etc.) to libunwind\u0027s\nDWARF-based implementation instead of `libgcc_s.so.1`, hitting an\nuninitialized internal context and crashing on the no-return cleanup chain\ntriggered by pthread_exit / C++ exception unwinding -- e.g. it makes\nBthreadTest.bthread_exit segfault deterministically when\n`--define\u003dwith_bthread_tracer\u003dtrue` is on.\n\nThis is purely an ELF runtime symbol-resolution-order issue and reproduces\nidentically on GCC and Clang, since both default to `libstdc++ + libgcc_s`\non Linux."
    },
    {
      "commit": "5dfb0b5431739a1365f7ab423c869ff2597a69d1",
      "tree": "e9d5f5c062ca721a78bc54ae91fea93da0a4f18b",
      "parents": [
        "9c2fc2f2f029ef395d19c60de6cdf5847d4271e5"
      ],
      "author": {
        "name": "randomkang",
        "email": "550941794@qq.com",
        "time": "Tue May 26 00:49:23 2026 +0800"
      },
      "committer": {
        "name": "randomkang",
        "email": "550941794@qq.com",
        "time": "Tue May 26 00:49:23 2026 +0800"
      },
      "message": "Fix code style\n"
    },
    {
      "commit": "a47e34903fdbb202c8786167bddd5ea519772d84",
      "tree": "2e56da8107ab9fe12a6530fd64d4eb16b4cd4767",
      "parents": [
        "3aa5dab6a2fd77825783884c98f5292912502635"
      ],
      "author": {
        "name": "Weibing Wang",
        "email": "wwbmmm@gmail.com",
        "time": "Mon May 25 11:57:25 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon May 25 11:57:25 2026 +0800"
      },
      "message": "fix(http): apply auth check to builtin requests on public port (#3308)\n\n* fix(http): apply auth check to builtin requests on public port\n\nOnly skip auth for builtin HTTP requests received from internal_port.\nBuiltin requests coming from the server listening port now follow the\nsame auth flow as other public HTTP requests.\n\nAlso add regression coverage for builtin HTTP auth behavior on both the\npublic listener and internal_port.\n\n* Fix http_rpc_protocol unittest failed\n\n* Fix builtin_auth_policy_on_public_and_internal_port test case not stable\n\n* Fix builtin_auth_policy_on_public_and_internal_port asan run fail"
    },
    {
      "commit": "3aa5dab6a2fd77825783884c98f5292912502635",
      "tree": "41c79cccc028fa126cb793076fde1792e4893fe9",
      "parents": [
        "4503a474312d83dc9040f4b76d17d3c339f4ab5a"
      ],
      "author": {
        "name": "Bright Chen",
        "email": "chenguangmingfe@foxmail.com",
        "time": "Wed May 20 12:05:41 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed May 20 12:05:41 2026 +0800"
      },
      "message": "Fix UAF in batch_create_stream_feedback_race unittest (#3305)"
    },
    {
      "commit": "4503a474312d83dc9040f4b76d17d3c339f4ab5a",
      "tree": "79ab37c5a05c9100ddf9da392692c86dc00b26e3",
      "parents": [
        "f85f1c57041f20256ec7dcd5241ad5568391ac99"
      ],
      "author": {
        "name": "yerixu",
        "email": "52901851+yerixu@users.noreply.github.com",
        "time": "Wed May 20 11:03:00 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed May 20 11:03:00 2026 +0800"
      },
      "message": "Fix bound SSL handshake to prevent leaked ESTABLISHED sockets (#3296)\n\nSocket::SSLHandshake polled the fd via unbounded bthread_fd_wait, so a\npeer that completed the TCP handshake but never sent a TLS Hello (e.g.\nserver not actually configured for SSL) parked the handshake bthread\nforever. That bthread holds a Socket reference through the in-flight\nWriteRequest, so the underlying fd was never closed and the connection\nstayed ESTABLISHED until OS keepalive eventually broke it.\n\nChannel destruction does not help: ~Channel only removes the SocketMap\nref; SetFailed/OnFailed wake _epollout_butex but not the per-fd butex\nused by bthread_fd_wait, and the fd close path runs only after the\nSocket\u0027s ref count drops to zero, which the stuck bthread prevents.\nWith a periodic retry, ESTABLISHED sockets accumulate without bound.\n\nSwitch the two bthread_fd_wait calls in SSLHandshake to\nbthread_fd_timedwait, with the deadline derived from a new gflag\nssl_handshake_timeout_ms (default 5000ms; \u003c\u003d0 keeps the old behavior).\nOn timeout the existing failure path runs: CheckConnected returns -1 -\u003e\nAfterAppConnected calls SetFailed + ReleaseAllFailedWriteRequests, and\nthe fd_guard in CheckConnectedAndKeepWrite closes the fd at scope exit.\nThe server-side handshake invoked from DoRead benefits from the same\nbound.\n\nCo-authored-by: Ye Rixu \u003cyerixu@expontech.com\u003e"
    },
    {
      "commit": "f85f1c57041f20256ec7dcd5241ad5568391ac99",
      "tree": "f78f87a853ae11172013e243b0168c3c49f0c38d",
      "parents": [
        "58fec6feeb34fd67cdc3653ec2126f35152cbd0c"
      ],
      "author": {
        "name": "Bright Chen",
        "email": "chenguangmingfe@foxmail.com",
        "time": "Tue May 19 16:45:22 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue May 19 16:45:22 2026 +0800"
      },
      "message": "Reimplement writer-priority RWLock (#3286)\n\nThe previous go-like RWLock bumps the reader count first and rolls it\nback only on the full success path. The state is not reversible on a\npartial failure, so a read timeout while a writer holds the lock leaves a\ndangling reader credit and permanently blocks future writers (issue #3051).\nFor the same reason the old implementation could not offer correct try_/timed_ APIs\nat all.\n\nCo-authored-by: hairet"
    },
    {
      "commit": "9c2fc2f2f029ef395d19c60de6cdf5847d4271e5",
      "tree": "d58c85bcb6917444286f26159b9cfe5a11b23e73",
      "parents": [
        "a72f8801522e79f601a7b0c796b02272fcf3c157"
      ],
      "author": {
        "name": "randomkang",
        "email": "550941794@qq.com",
        "time": "Mon May 18 23:49:36 2026 +0800"
      },
      "committer": {
        "name": "randomkang",
        "email": "550941794@qq.com",
        "time": "Mon May 18 23:49:36 2026 +0800"
      },
      "message": "reorg code\n"
    },
    {
      "commit": "58fec6feeb34fd67cdc3653ec2126f35152cbd0c",
      "tree": "9c1c7849b6b6e02d209661e446e571ac3135b4a3",
      "parents": [
        "08d95ac3b1c7c1577bb21f61655fa136b16b9c31"
      ],
      "author": {
        "name": "David Lee",
        "email": "live4thee@gmail.com",
        "time": "Mon May 18 10:18:00 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon May 18 10:18:00 2026 +0800"
      },
      "message": "[rdma] drain CQ after moving into RESET state (#3261)\n\nOtherwise there might segfault due to the race below:\n\n```txt\nSocket::OnInputEvent()          |\n  `-- ProcessEvent (bthread)    |\n                                |\n  [ bthread queueed ]           |  QP error -\u003e SetFailed -\u003e HC -\u003e WaitAndReset()\n                                |  Reset() -\u003e _sbuf.clear()\n                                |  CheckHealth() -\u003e Revive()\n                                |\n                                |  Socket is now Addressable!\n  RdmaEndpoint:PollCq()         |\n  Socket::Address() OK!         |\n  RdmaEndpoint:HandleCompletion()\n  _sbuf[_sq_sent++].clear()    \u003c\u003d BOOM!  CQ is not drained but _sbuf is cleared.\n```\n\nAnother possible fix is to add a _generation_ field in RdmaEndpoint, such that:\n - each RdmaEndpoint::Reset() will advance the _generation_ by 1;\n - the RdmaEndpoint::PollCq(m, orig_gen) will need to compare the _generation_.\n\nBut it will contaminate existing interface, and we need to drain CQ anyway.\n\nSigned-off-by: David Lee \u003clive4thee@gmail.com\u003e"
    },
    {
      "commit": "a72f8801522e79f601a7b0c796b02272fcf3c157",
      "tree": "ec3fa3e52e3930bc85791bce9034312ad461bb97",
      "parents": [
        "c2f5f0fbc802467b7579ac484227f629a55c4b09",
        "08d95ac3b1c7c1577bb21f61655fa136b16b9c31"
      ],
      "author": {
        "name": "randomkang",
        "email": "550941794@qq.com",
        "time": "Mon May 18 00:05:57 2026 +0800"
      },
      "committer": {
        "name": "randomkang",
        "email": "550941794@qq.com",
        "time": "Mon May 18 00:05:57 2026 +0800"
      },
      "message": "Merge branch \u0027master\u0027 into opt_rdma_flags\n"
    },
    {
      "commit": "c2f5f0fbc802467b7579ac484227f629a55c4b09",
      "tree": "579796540fa2aac5754fbe6170c748bf89f515d7",
      "parents": [
        "9934c39be00806669741eebba38f6ca32ba11956"
      ],
      "author": {
        "name": "randomkang",
        "email": "550941794@qq.com",
        "time": "Mon May 18 00:01:42 2026 +0800"
      },
      "committer": {
        "name": "randomkang",
        "email": "550941794@qq.com",
        "time": "Mon May 18 00:01:42 2026 +0800"
      },
      "message": "Add IBV_ACCESS_RELAXED_ORDERING for rdma reg mr\n"
    },
    {
      "commit": "e63a54dcaacadb04bde5e2fa3839417e8484cf43",
      "tree": "449b53102a6aae3ac3f18e3dda424535883c9e39",
      "parents": [
        "08d95ac3b1c7c1577bb21f61655fa136b16b9c31"
      ],
      "author": {
        "name": "david_hu",
        "email": "uestc.hugo@gmail.com",
        "time": "Sun May 17 23:07:59 2026 +0800"
      },
      "committer": {
        "name": "david_hu",
        "email": "uestc.hugo@gmail.com",
        "time": "Sun May 17 23:07:59 2026 +0800"
      },
      "message": "release 1.17\n"
    },
    {
      "commit": "08d95ac3b1c7c1577bb21f61655fa136b16b9c31",
      "tree": "cffeccd9e03043ac9f4fcdb3bb984e6d2ed71143",
      "parents": [
        "f48628d1de91a77ecb07c2ea0e397b98ed0910ef"
      ],
      "author": {
        "name": "Bright Chen",
        "email": "chenguangmingfe@foxmail.com",
        "time": "Sun May 17 17:07:37 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sun May 17 17:07:37 2026 +0800"
      },
      "message": "Fix ASan stack range registration for main task (#3298)\n\nOn Linux, `pthread_attr_getstack(3)` returns the lowest address of the\nstack, but brpc treats `StackStorage::bottom` as the highest address\n(see `bthread/stack.h`). `TaskGroup::init` was registering the main\ntask\u0027s stack with the lowest address as `bottom`, so every per-jump\n`BTHREAD_SCOPED_ASAN_FIBER_SWITCHER` told ASan a stack range\n`stacksize` bytes below the real one. The first\n`__asan_handle_no_return` (e.g. the C++ unwinder fired by\n`throw bthread::ExitException` inside `bthread_exit`) then prints\n\n  WARNING: ASan is ignoring requested __asan_handle_no_return:\n    stack type: default top: ...; bottom ...; size: 0x62bdb000 (~1.5 GiB)\n  False positive error reports may follow\n\nFix `PthreadAttrGetStack` to translate the lowest address to the\nhighest address before returning, matching `StackStorage::bottom`.\nASan-only path; non-ASan builds are unaffected."
    },
    {
      "commit": "f48628d1de91a77ecb07c2ea0e397b98ed0910ef",
      "tree": "53feb2230e434d10874df22fc8824a4220591f9a",
      "parents": [
        "321c7893e3e74ac25da41bfd458ce28c6586e754"
      ],
      "author": {
        "name": "The Apache Software Foundation",
        "email": "root-asf-gitbox-commits@apache.org",
        "time": "Sat May 16 07:48:38 2026 -0500"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sat May 16 20:48:38 2026 +0800"
      },
      "message": "Set up default protection ruleset for default and release branches (#3299)"
    },
    {
      "commit": "321c7893e3e74ac25da41bfd458ce28c6586e754",
      "tree": "56d41b783c7c2166d2c8ff071c145c10f90fde08",
      "parents": [
        "873cf62000e719aca90507706f0545176bcab5ca"
      ],
      "author": {
        "name": "altman08",
        "email": "936396749@qq.com",
        "time": "Wed May 13 16:15:58 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed May 13 16:15:58 2026 +0800"
      },
      "message": "Fix(selective_channel): isolate backup responses and add race regression test (#3294)"
    },
    {
      "commit": "873cf62000e719aca90507706f0545176bcab5ca",
      "tree": "3594f0838a68c9c72e97e69b70c830a322a8006f",
      "parents": [
        "654ae770ebe1e5a148b76e6bf7d9b79783810d95"
      ],
      "author": {
        "name": "Bright Chen",
        "email": "chenguangmingfe@foxmail.com",
        "time": "Tue May 12 11:36:29 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue May 12 11:36:29 2026 +0800"
      },
      "message": "Fix protobuf compilation errors (#3293)"
    },
    {
      "commit": "654ae770ebe1e5a148b76e6bf7d9b79783810d95",
      "tree": "c22101191ec8f5a130972f50af702b6ef6391a61",
      "parents": [
        "5cd340e79b5fde264ce2e47e96e7f9cdf708d12f"
      ],
      "author": {
        "name": "Bright Chen",
        "email": "chenguangmingfe@foxmail.com",
        "time": "Mon May 11 19:55:38 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon May 11 19:55:38 2026 +0800"
      },
      "message": "Fix protobuf version compatibility for ByteSizeLong() and SpaceUsedLong() (#3292)"
    },
    {
      "commit": "5cd340e79b5fde264ce2e47e96e7f9cdf708d12f",
      "tree": "0f09030bbc3e1894ac1107fd71a5e213368b412c",
      "parents": [
        "d8ddff8f7b7b4f250fc1b2ea0816043747134ef9"
      ],
      "author": {
        "name": "guoliushui",
        "email": "976246393@qq.com",
        "time": "Mon May 11 19:54:18 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon May 11 19:54:18 2026 +0800"
      },
      "message": "fix: add acquire fence in bthread_join for ARM memory visibility (#3276)\n\n* fix: add acquire fence in bthread_join for ARM memory visibility\n\nEnsure memory visibility on ARM architecture after thread join.\n\n* use the fence unconditionally\n\nCo-authored-by: Copilot Autofix powered by AI \u003c175728472+Copilot@users.noreply.github.com\u003e\n\n---------\n\nCo-authored-by: Copilot Autofix powered by AI \u003c175728472+Copilot@users.noreply.github.com\u003e"
    },
    {
      "commit": "d8ddff8f7b7b4f250fc1b2ea0816043747134ef9",
      "tree": "a7152e061dba3a1e1f24d4c335ab043af2475772",
      "parents": [
        "2a02d9e3fb4e03df1da1ff4eb7665e4773188930"
      ],
      "author": {
        "name": "Bright Chen",
        "email": "chenguangmingfe@foxmail.com",
        "time": "Sun May 10 22:34:47 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sun May 10 22:34:47 2026 +0800"
      },
      "message": "Fix heap-use-after-free in ~AgentCombiner (#3291)\n\nAfter PR #2949 changed Agent::combiner from a raw pointer to a\nweak_ptr, MultiDimensionTest.shared started to fail under ASAN with a\nheap-use-after-free in clear_all_agents() called from ~AgentCombiner.\n\nRoot cause\n----------\nstd::shared_ptr makes its weak_ptr expire the instant use_count drops\nto 0, while ~AgentCombiner only starts running after that. The two\nevents therefore form a race window between two threads:\n\n    * thread A: last shared_ptr\u003cAgentCombiner\u003e released\n                use_count -\u003e 0   -\u003e weak_ptr expired\n                ~AgentCombiner -\u003e clear_all_agents() takes _lock and\n                                  starts walking _agents\n    * thread B: thread exits, _destroy_tls_blocks() deletes ThreadBlock,\n                each ~Agent calls combiner.lock() which now returns null\n                (weak_ptr already expired), so commit_and_erase() is\n                skipped and the Agent is freed while still linked into\n                A\u0027s _agents list\n    * thread A: dereferences a freed LinkNode in clear_all_agents() -\u003e\n                heap-use-after-free\n\nFix\n---\nDon\u0027t traverse _agents from ~AgentCombiner. Letting _agents go out of\nscope is safe because:\n\n  * butil::LinkedList and butil::LinkNode have trivial destructors and\n    never traverse on destruction, so tearing down _agents does not\n    dereference any agent node.\n  * Surviving Agents simply observe combiner.expired() \u003d\u003d true in\n    ~Agent and skip commit_and_erase, leaving prev_/next_ dangling but\n    never read.\n  * If the freed agent_id is later reused by a new combiner and the\n    same TLS slot is taken, get_or_create_tls_agent calls Agent::reset\n    and Append\u0027s it into the new combiner\u0027s _agents.\n    LinkNode::InsertBefore only writes prev_/next_ (it never reads\n    their stale values), so the dangling pointers are safely\n    overwritten.\n  * Agent::element is destroyed together with its ThreadBlock, so any\n    non-POD resource it holds is still released; if the agent slot is\n    reused, Agent::reset rewrites the element value before it is\n    observed again.\n\nThe body of clear_all_agents() is kept (commented out) for reference,\ntogether with a NOTE explaining why it must not be re-enabled from\n~AgentCombiner."
    }
  ],
  "next": "2a02d9e3fb4e03df1da1ff4eb7665e4773188930"
}
