)]}'
{
  "log": [
    {
      "commit": "750154675eaf2825423825f16b08da1855e6a18b",
      "tree": "58e51fe47b1736c64ea659623fd36be51545bc9d",
      "parents": [
        "cbe0b9fc7fa9d5984f589659eeea6d74edb7c204"
      ],
      "author": {
        "name": "Dan Wang",
        "email": "wangdan@apache.org",
        "time": "Wed Apr 15 10:59:34 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Apr 15 10:59:34 2026 +0800"
      },
      "message": "ci(github): pin all actions to exact commit SHAs instead of tags or branch references (#2398)\n\nhttps://github.com/apache/incubator-pegasus/issues/2397\n\nAccording to the the reply from INFRA team[1] and the doc of infrastructure\nactions[2], the actions in allow list must be pinned to a SHA rather than a tag\nas of August 1st, 2025.\n\n1. https://issues.apache.org/jira/browse/INFRA-27084\n2. https://github.com/apache/infrastructure-actions/?tab\u003dreadme-ov-file#adding-a-new-action-to-the-allow-list"
    },
    {
      "commit": "cbe0b9fc7fa9d5984f589659eeea6d74edb7c204",
      "tree": "e7f40cd98371532f8139c951a1148e2d35237cff",
      "parents": [
        "89f17c7722af064d326c0dbbdb147f4d1b207ee7"
      ],
      "author": {
        "name": "Dan Wang",
        "email": "wangdan@apache.org",
        "time": "Tue Apr 14 20:29:22 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Apr 14 20:29:22 2026 +0800"
      },
      "message": "feat(new_metrics): support `server_stat` command showing some important server-level metrics (part 4) (#2393)\n\nhttps://github.com/apache/incubator-pegasus/issues/2382\n\nAdd metrics related to profiler RPC tasks as the 4th part to be shown by\n`server_stat` command."
    },
    {
      "commit": "89f17c7722af064d326c0dbbdb147f4d1b207ee7",
      "tree": "c65e3ddc07a6b28ea6c607c1fa991344527cc03e",
      "parents": [
        "3ab03aa196baf344470391fa149675cb9b2b73f0"
      ],
      "author": {
        "name": "Dan Wang",
        "email": "wangdan@apache.org",
        "time": "Sat Mar 21 00:09:19 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sat Mar 21 00:09:19 2026 +0800"
      },
      "message": "feat(collector): support reading config file path from CLI and loading log configuration from config file in Go Collector (#2375)\n\nhttps://github.com/apache/incubator-pegasus/issues/2358\n\nThis PR adds support for the Go collector to obtain the configuration file path\nvia command-line arguments.\n\nIt also makes log initialization configurable by loading log-related settings from\nthe configuration file, including the log file path, log level, log retention time, and\nthe number of retained log files."
    },
    {
      "commit": "3ab03aa196baf344470391fa149675cb9b2b73f0",
      "tree": "4547d00c76adc2f6c069aa5d97d7124a4c081328",
      "parents": [
        "d14bfae8b9758a1c9f39b5f09d65c2bd449aa69d"
      ],
      "author": {
        "name": "Dan Wang",
        "email": "wangdan@apache.org",
        "time": "Sat Mar 21 00:08:20 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sat Mar 21 00:08:20 2026 +0800"
      },
      "message": "feat(collector): clean up expired tables during hotspot detection (#2369)\n\nhttps://github.com/apache/incubator-pegasus/issues/2358\n\nCurrently, when collecting hotspot-related metrics, the Go collector only adds\nnew tables. If a large number of tables are deleted, the collector may still retain\nthose deleted tables in memory, leading to excessive memory usage.\n\nThis PR introduces a table cleanup mechanism: if no metric data has been collected\nfor a table over a prolonged period, the table will be removed to release the memory\nit occupies."
    },
    {
      "commit": "d14bfae8b9758a1c9f39b5f09d65c2bd449aa69d",
      "tree": "8cc410026d9448932764389e9d3e452f727d6ada",
      "parents": [
        "6e04cdfe34be939f2c97b95ebcaa48565d8f889d"
      ],
      "author": {
        "name": "Dan Wang",
        "email": "wangdan@apache.org",
        "time": "Wed Mar 18 19:55:09 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Mar 18 19:55:09 2026 +0800"
      },
      "message": "feat(new_metrics): support `server_stat` command showing some important server-level metrics (part 3) (#2385)\n\nhttps://github.com/apache/incubator-pegasus/issues/2382\n\nAdd metrics related to the number of RocksDB as the 3rd part to be shown by\n`server_stat` command."
    },
    {
      "commit": "6e04cdfe34be939f2c97b95ebcaa48565d8f889d",
      "tree": "df2340426ad284ef983991d142e8447f8b8473d5",
      "parents": [
        "db756dcdf24e2af6169659a67548501ed61f106c"
      ],
      "author": {
        "name": "Dan Wang",
        "email": "wangdan@apache.org",
        "time": "Wed Mar 18 19:54:15 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Mar 18 19:54:15 2026 +0800"
      },
      "message": "feat(replica): support querying replica status via RESTful API (#2377)\n\nSometimes we need to know the current status of a replica. For example,\nduring **offline partition split**, after new partitions are generated locally,\nwe need to start the replica server to load the new partitions. Only after\nconfirming that all partition data has been successfully loaded can we\nrebuild the metadata and recover the Pegasus cluster. However, there is\ncurrently no reliable way to verify that *all partition data has finished loading*.\n\nThere are two possible approaches:\n\n1. **Check the replica server logs.**\n   For example, if we find `\"load replica successfully\"`, we assume the partition\nhas been loaded successfully; if we find `\"load replica failed\"`, we assume the\nloading failed.\n   However, the problem is that log files are automatically cleaned up once their\nsize or count exceeds certain thresholds. When there are a large number of\npartitions, the relevant logs might already be removed before we even start\nchecking whether the partitions were loaded successfully.\n\n2. **Wait for a fixed period of time.**\n   This approach is also impractical because we do not know when a partition\nstarts loading or how long it will take to load. At the same time, we cannot wait\nindefinitely.\n\nIf we could directly know the current status of a replica — such as whether it is\nstill loading or already serving — this problem would be much easier to solve.\nTherefore, this PR introduces a **RESTful API** to query the current status of a\nreplica.\n\nSince the HTTP service is started **before partition data loading begins**, it is\npossible to query the replica status from the replica server while partitions are\nbeing loaded.\n\nAn example usage of the RESTful API:\n\n```\nGET http://1.2.3.4:34801/replica/status?app_id\u003d1\u0026partition_index\u003d2\n```\n\nIf the partition is currently loading, the replica server will return the following\nresponse in JSON format:\n\n```\n{\"status\": \"LOADING\"}\n```\n\nThe currently supported statuses include:\n\n* `LOADING`: the replica is being loaded;\n* `NOT_FOUND`: the replica does not exist;\n* `CREATING`:  the replica is being created;\n* `SERVING`: the replica is serving;\n* `CLOSING`: the replica is being closed;\n* `CLOSED`: the replica has been closed;\n* `UNKNOWN`: the replica is in an unknown status."
    },
    {
      "commit": "db756dcdf24e2af6169659a67548501ed61f106c",
      "tree": "440beda99d6057828108864b70e8ab4523b5e0bc",
      "parents": [
        "b273abce70d5c9c96d3e6f1884913dd491a4075b"
      ],
      "author": {
        "name": "Pengfan Lu",
        "email": "lu_peng_fan@163.com",
        "time": "Fri Mar 13 20:33:17 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Mar 13 20:33:17 2026 +0800"
      },
      "message": "fix: avoid reopening GC-deleted plog during duplication (#2373)\n\nFix https://github.com/apache/incubator-pegasus/issues/2372.\n\nDuplication replay may access private log files deleted by\nconcurrent GC. Track cleanable decree and stop scanning\nplog files beyond GC boundary to prevent crash."
    },
    {
      "commit": "b273abce70d5c9c96d3e6f1884913dd491a4075b",
      "tree": "24b8a4added186ced39b37dd7847eeea3ee146da",
      "parents": [
        "02e3fa22c5446fc0e28f0d52a7b6e307f7d46cc3"
      ],
      "author": {
        "name": "Jun 11",
        "email": "50448108+WJSGDBZ@users.noreply.github.com",
        "time": "Mon Mar 09 17:29:03 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Mar 09 17:29:03 2026 +0800"
      },
      "message": "feat(python-client): add scan filter support (#2305)\n\nAdd support for hashkey and sortkey scan filters.\n\nIn original logic `generate_next_bytes` function has two problem:\na. The input buff (i.e. hashkey) can be either ‘str’ or ‘bytearray’. If it\u0027s a\nstr, in-place modification like `buff[pos] +\u003d 1` won\u0027t work since strings\nare immutable.\nb. The pos variable was initialized to a fixed index (len(buff) - 1), which\nis counterintuitive and could lead to an infinite loop.\nhttps://github.com/apache/incubator-pegasus/blob/44400f6e3ca1fb1ce48d04d1c9145aad7ac4e991/python-client/pypegasus/pgclient.py#L613-L624"
    },
    {
      "commit": "02e3fa22c5446fc0e28f0d52a7b6e307f7d46cc3",
      "tree": "b768d222099190b36dd160b2db378f655886264d",
      "parents": [
        "cb40b233bc5c4a9b2193bc7320f857f7c57ac278"
      ],
      "author": {
        "name": "Jun 11",
        "email": "50448108+WJSGDBZ@users.noreply.github.com",
        "time": "Mon Mar 09 17:07:53 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Mar 09 17:07:53 2026 +0800"
      },
      "message": "fix(shell): change default value of checkpoint flag to false in duplication add command (#2365)\n\nWhen the -p flag is not explicitly specified, checkpoint synchronization should be disabled by default."
    },
    {
      "commit": "cb40b233bc5c4a9b2193bc7320f857f7c57ac278",
      "tree": "0d8ad6dea208a08a0bda81b8248bbaeda3fa8f49",
      "parents": [
        "cc5e9c767014778617f8910e46080eff47f5312f"
      ],
      "author": {
        "name": "Dan Wang",
        "email": "wangdan@apache.org",
        "time": "Thu Mar 05 19:01:10 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Mar 05 19:01:10 2026 +0800"
      },
      "message": "ci(github): bump hadolint/hadolint-action from 3.1.0 to 3.3.0 and fix Dockerfile and license issues reported by lint checks (#2331)\n\nResolve https://github.com/apache/incubator-pegasus/issues/2330.\n\nSince `hadolint/hadolint-action@v3.1.0` is no longer in the allow list, Dockerfile\nlinting could not run. Therefore, `hadolint-action` needs to be pinned to the\ncommit SHA of version 3.3.0.\n\nAfter `hadolint-action` has been successfully re-enabled, this PR fixes the\nissues reported by lint in the Ubuntu 20.04 image Dockerfile as well as in the\nlicense file."
    },
    {
      "commit": "cc5e9c767014778617f8910e46080eff47f5312f",
      "tree": "8a4d4321df0fcc49412bc3f117e50d37d712f296",
      "parents": [
        "022854b0259ffefdfe91f8c3af268878b2f979b6"
      ],
      "author": {
        "name": "Dan Wang",
        "email": "wangdan@apache.org",
        "time": "Thu Mar 05 18:59:59 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Mar 05 18:59:59 2026 +0800"
      },
      "message": "chore: update NOTICE year to 2026 (#2376)\n\n"
    },
    {
      "commit": "022854b0259ffefdfe91f8c3af268878b2f979b6",
      "tree": "5fe38b213b1ac11ab18468c0bfbee091b7538e7f",
      "parents": [
        "fcab87d96b7f5451dbb70c8f12ac33cfd3eca8b3"
      ],
      "author": {
        "name": "Dan Wang",
        "email": "wangdan@apache.org",
        "time": "Wed Feb 11 17:50:29 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Feb 11 17:50:29 2026 +0800"
      },
      "message": "feat(collector): analyze statistics  to determine whether partitions are hotspots (#2367)\n\nhttps://github.com/apache/incubator-pegasus/issues/2358\n\nBased on the [Z-score](https://en.wikipedia.org/wiki/Standard_score) method,\nhotspot scores are calculated for each partition using historical samples of total\nread/write QPS. A partition is considered a hotspot once both its score and QPS\nexceed the configured thresholds."
    },
    {
      "commit": "fcab87d96b7f5451dbb70c8f12ac33cfd3eca8b3",
      "tree": "f7b5ed48497dd81743a4ceab881b2849887c0d6b",
      "parents": [
        "848ed89af3c1ea1ab95c1884e3c6c481832f3fcd"
      ],
      "author": {
        "name": "Dan Wang",
        "email": "wangdan@apache.org",
        "time": "Wed Feb 11 17:42:28 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Feb 11 17:42:28 2026 +0800"
      },
      "message": "feat(go-client): introduce Equal APIs for HostPort and RPCAddress (#2360)\n\nhttps://github.com/apache/incubator-pegasus/issues/2358\n\nAdd `Equal` interfaces for the `HostPort` and `RPCAddress` structures to enable\nequality comparisons based on attributes such as host and port."
    },
    {
      "commit": "848ed89af3c1ea1ab95c1884e3c6c481832f3fcd",
      "tree": "47d2d278524b0e896c44be5ccdd2a01613134f37",
      "parents": [
        "817a18d2a80e290d4e2fa4f4ada538a9d232258c"
      ],
      "author": {
        "name": "Dan Wang",
        "email": "wangdan@apache.org",
        "time": "Wed Feb 11 11:15:54 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Feb 11 11:15:54 2026 +0800"
      },
      "message": "fix(network): fix heartbeat failure caused by inability to obtain peer address when receiving UDP data (#2364)\n\nFix https://github.com/apache/incubator-pegasus/issues/2363.\n\nThe root cause is that when starting onebox with `--use_product_config`, both replica\nservers and meta servers use [src/server/config.ini](https://github.com/apache/incubator-pegasus/blob/a9a11da886bd32d170fc166c08b69210d89d6a52/src/server/config.ini)\ninstead of [src/server/config.min.ini](https://github.com/apache/incubator-pegasus/blob/a9a11da886bd32d170fc166c08b69210d89d6a52/src/server/config.min.ini).\nAs a result, beacons are sent and received over **UDP** instead of **TCP**.\n\nThe UDP implementation uses Boost.Asio APIs. If the sender socket does not call `connect()`,\nthen calling `remote_endpoint()` on the receiver socket will always fail.\n\nThe fix is to remove the logic that calls `remote_endpoint()` on the receiving side. This logic\nwas introduced in https://github.com/apache/incubator-pegasus/pull/1658 to handle cross-network\nscenarios (when the address in the message header differs from the actual socket connection\naddress, the non-forwarding path corrects it to a recognizable address). Since UDP is primarily used\nfor the heartbeat scenario, and `beacon_msg` already contains `from_node` and `hp_from_node`,\nthis logic can be removed."
    },
    {
      "commit": "817a18d2a80e290d4e2fa4f4ada538a9d232258c",
      "tree": "de24d9eca813e2843f4f346d876014a0bed62439",
      "parents": [
        "a9a11da886bd32d170fc166c08b69210d89d6a52"
      ],
      "author": {
        "name": "Dan Wang",
        "email": "wangdan@apache.org",
        "time": "Wed Feb 11 11:14:09 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Feb 11 11:14:09 2026 +0800"
      },
      "message": "feat(rocksdb): support building RocksDB with the HDFS plugin in the Pegasus server (#2362)\n\nhttps://github.com/apache/incubator-pegasus/issues/2361\n\nEnable building RocksDB with HDFS plugin through the following steps:\n1. Introduce [rocksdb-hdfs-env](https://github.com/riversand963/rocksdb-hdfs-env)\nplugin when building RocksDB as a third-party dependency.\n2. Configure Java and Hadoop environment variables, as well as the dynamic library\nsearch paths, to support compiling and linking the plugin.\n3. Apply patches to fix issues encountered during compilation."
    },
    {
      "commit": "a9a11da886bd32d170fc166c08b69210d89d6a52",
      "tree": "982df9cd4cc081ee0f80c8dae36784d11d863350",
      "parents": [
        "9b4c8cfb3ecac5fd272b277c591116d23dfcb251"
      ],
      "author": {
        "name": "Dan Wang",
        "email": "wangdan@apache.org",
        "time": "Thu Feb 05 15:16:44 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Feb 05 15:16:44 2026 +0800"
      },
      "message": "feat(collector): calculate the total statistics for both reads and writes and record them as history for analysis of hotspot partitions (#2359)\n\nhttps://github.com/apache/incubator-pegasus/issues/2358\n\nBased on the aggregation results, calculate the total statistics for both reads and\nwrites, and record them as history for analysis of hotspot partitions."
    },
    {
      "commit": "9b4c8cfb3ecac5fd272b277c591116d23dfcb251",
      "tree": "33115850721f57dd6c472c03d409fe715fe39018",
      "parents": [
        "23f58920b23cfbc8df1b1160db4971aff28e46c6"
      ],
      "author": {
        "name": "Dan Wang",
        "email": "wangdan@apache.org",
        "time": "Thu Jan 29 21:37:38 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Jan 29 21:37:38 2026 +0800"
      },
      "message": "feat(collector): Go Collector fetches and aggregates hotspot-related metrics (#2357)\n\nhttps://github.com/apache/incubator-pegasus/issues/2358.\n\nPeriodically pull read/write related metrics from each replica server node\nto calculate traffic, in order to detect whether hotspots exist on each partition\nof each table."
    },
    {
      "commit": "23f58920b23cfbc8df1b1160db4971aff28e46c6",
      "tree": "d61c5469335404ae11829641fec1ea00955ab188",
      "parents": [
        "96868ed93b2a1acb26f1241f2f36d6a976c22c43"
      ],
      "author": {
        "name": "Dan Wang",
        "email": "wangdan@apache.org",
        "time": "Tue Jan 27 16:07:19 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Jan 27 16:07:19 2026 +0800"
      },
      "message": "fix: fix binary_writer::write not supporting C-style strings (#2349)\n\nFix https://github.com/apache/incubator-pegasus/issues/2355.\n\nThe `mutation_log_test.replay_single_file_1000` test was crashing because, in the `mutation_log_test::create_test_mutation` function (see the code below), the default\ntemplate function `template \u003ctypename T\u003e void binary_writer::write(const T \u0026val)` was\ninvoked instead of one of the non-template `binary_writer::write` overloads.\n\nhttps://github.com/apache/incubator-pegasus/blob/58b83260ec31530c4316e1cedceeb84731b66e95/src/replica/test/mutation_log_test.cpp#L294-L315\n\nThe default template implementation contains only a single line: `assert(false);` (also shown below).\n\nhttps://github.com/apache/incubator-pegasus/blob/58b83260ec31530c4316e1cedceeb84731b66e95/src/utils/binary_writer.h#L53-L58\n\nThis explains why the issue occurs only in tests built in **debug** mode and not in **release** mode, as described\nin the issue: in release builds, `assert` is disabled and therefore does nothing.\n\nThe fix is to remove the default template function and introduce a `void binary_writer::write(std::string_view val)` overload instead. In addition to fixing the issue, this PR also improves some code style and removes several unused\nmember functions from the `binary_writer` class."
    },
    {
      "commit": "96868ed93b2a1acb26f1241f2f36d6a976c22c43",
      "tree": "8d95833cad6f72b2d5153cf5cb951ab37c789240",
      "parents": [
        "58b83260ec31530c4316e1cedceeb84731b66e95"
      ],
      "author": {
        "name": "Dan Wang",
        "email": "wangdan@apache.org",
        "time": "Wed Jan 21 20:11:55 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Jan 21 20:11:55 2026 +0800"
      },
      "message": "refactor: remove the unnecessary `zookeeper_session_mgr` class (#2356)\n\nThe `zookeeper_session_mgr::get_session(...)` can be made static, so it can be extracted\nand implemented as a separate global function. Setting the ZooKeeper C client’s log file\nhandle can be done together with the log level, ensuring it is executed only once globally\nand before any `zhandle_t` object is created. Thus entire `zookeeper_session_mgr` class\ncould be removed.\n\nIn addition, error info would be printed if the the ZooKeeper C client\u0027s log file failed to be\nopened. Also introduce mutex to support concurrent operations to obtain ZooKeeper sessions\nby multiple threads."
    },
    {
      "commit": "58b83260ec31530c4316e1cedceeb84731b66e95",
      "tree": "4eac9a64330aa499211e354ab3ca2ba9dd2b8fa9",
      "parents": [
        "255189f3b0878f58fc75cf2bf75233ba018f6617"
      ],
      "author": {
        "name": "Dan Wang",
        "email": "wangdan@apache.org",
        "time": "Mon Jan 12 21:04:11 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Jan 12 21:04:11 2026 +0800"
      },
      "message": "ci(github): run workflows for CPP ASan tests based on third-party images dedicated to ASan tests (#2350)\n\nhttps://github.com/apache/incubator-pegasus/issues/2344.\n\nRun ASan tests based on the third-party ASan images built by\nhttps://github.com/apache/incubator-pegasus/pull/2347."
    },
    {
      "commit": "255189f3b0878f58fc75cf2bf75233ba018f6617",
      "tree": "e771d26b5a1060b8245fbc0cf7670bdf57f5042e",
      "parents": [
        "b507fd36e5b96827fce6c9e5332a02d297bd425b"
      ],
      "author": {
        "name": "Dan Wang",
        "email": "wangdan@apache.org",
        "time": "Mon Jan 12 16:43:30 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Jan 12 16:43:30 2026 +0800"
      },
      "message": "build(images): build third-party images for ASan tests (#2347)\n\nhttps://github.com/apache/incubator-pegasus/issues/2344.\n\nAs is described in https://github.com/apache/incubator-pegasus/pull/2341,\nthis PR is to build third-party images with ASan enabled, which are dedicated\nto ASan tests."
    },
    {
      "commit": "b507fd36e5b96827fce6c9e5332a02d297bd425b",
      "tree": "0777b929d76c2959649088f7f9648fce37fd3c0a",
      "parents": [
        "68a76223e54fcbd0e8f67c38f3fae94b14a5f1d8"
      ],
      "author": {
        "name": "Dan Wang",
        "email": "wangdan@apache.org",
        "time": "Fri Jan 09 17:18:50 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Jan 09 17:18:50 2026 +0800"
      },
      "message": "fix(test): fix the failed ASan test for gutil due to absl::node_hash_map (#2341)\n\nhttps://github.com/apache/incubator-pegasus/issues/2344.\n\nThe internal types used by `absl::node_hash_map` have different layouts when\ncompiled with ASan versus non-ASan builds. As a third-party dependency, Abseil\nis always built in non-ASan mode. However, when Pegasus is built with ASan enabled,\nAbseil headers are also compiled under ASan, which leads to a mismatch between the\nheader-compiled structures and the Abseil library itself, causing ASAN tests to fail.\n\nPossible solutions include:\n1. When third-party dependencies change, also build those third-party libraries with\nASan enabled for ASan builds.\n2. When building third-party images, additionally produce a separate ASan-based\nimage, which can be used by ASan CI workflows when third-party dependencies\nthemselves have not changed."
    },
    {
      "commit": "68a76223e54fcbd0e8f67c38f3fae94b14a5f1d8",
      "tree": "427a98fd417e563801f1264be11aba6e921b5d82",
      "parents": [
        "abddf21a6293d8580a592bab75621868de0fbc23"
      ],
      "author": {
        "name": "Dan Wang",
        "email": "wangdan@apache.org",
        "time": "Tue Jan 06 20:16:01 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Jan 06 20:16:01 2026 +0800"
      },
      "message": "ci(github): build third-party images independently per OS version to prevent a single OS build failure from breaking the entire build (#2346)\n\nCurrently, the third-party images used for CI are built in roughly two stages: the first stage\nbuilds the *src* images, and the second stage builds the *bin* images. In each stage,\nimages are built for multiple OS versions. If the src image build fails for **any** OS version,\nall bin image builds are canceled.\n\nIn practice, this is not ideal. The likelihood of build failures differs across OS versions —\nfor example, older OS versions are more prone to issues. A failure in a single older OS\nversion can block the entire third-party image build process.\n\nThis PR improves the process by fully decoupling image builds across different OS versions\nso they do not affect each other. If a third-party image build fails for one OS version, it can\nbe fixed independently without impacting the builds for other OS versions."
    },
    {
      "commit": "abddf21a6293d8580a592bab75621868de0fbc23",
      "tree": "1c416047f1cd8b57133b74b46dbe85080cad8444",
      "parents": [
        "095a49cab8475ab3eac03485a431adac88d1e9fe"
      ],
      "author": {
        "name": "Jun 11",
        "email": "50448108+WJSGDBZ@users.noreply.github.com",
        "time": "Mon Jan 05 20:59:15 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Jan 05 20:59:15 2026 +0800"
      },
      "message": "fix(Python-client):add thrift client timeout support (#2304)\n\nThis PR fixes a critical issue where Python client Thrift requests were being dropped by the server\nwhen the `rpc_request_dropped_before_execution_when_timeout` parameter is enabled, due to\nthe `client_timeout` field not being properly set in the Thrift header."
    },
    {
      "commit": "095a49cab8475ab3eac03485a431adac88d1e9fe",
      "tree": "a5d2e0996d50e72c9486078ccb8778e5590838ea",
      "parents": [
        "9a2b93ed49083c39f6f0d0907e466813285708c4"
      ],
      "author": {
        "name": "Dan Wang",
        "email": "wangdan@apache.org",
        "time": "Mon Jan 05 11:04:44 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Jan 05 11:04:44 2026 +0800"
      },
      "message": "refactor: reorder string_view header includes alphabetically (#2339)\n\nWhen replacing `absl::string_view` with the C++ standard library version, the inclusion\norder of the `string_view` header was inconsistent: in some files it was placed within\nthe group of header files enclosed in double quotation marks (`\"\"`), while in others it\nwas placed within the group of the ones enclosed in angle brackets (`\u003c\u003e`) but not in\nalphabetical order. This PR standardizes the approach by always including `string_view`\nwithin the group of `\u003c\u003e` and sorting header files alphabetically in the group.\n\nIn addition, based on clang-tidy suggestions, some unnecessary `using namespace`\ndirectives (such as `pegasus`, `dsn::replication`, and `apache::thrift::transport`) have\nbeen removed. Several code style issues were also cleaned up, for example replacing\n`fprintf(stderr, ...)` with `fmt::println(stderr, ...)`."
    },
    {
      "commit": "9a2b93ed49083c39f6f0d0907e466813285708c4",
      "tree": "80ce03d70ddb674d22272f281c15c5e6a9570ddd",
      "parents": [
        "b67c1537a1b240703d10a703d0543de2d042208b"
      ],
      "author": {
        "name": "Dan Wang",
        "email": "wangdan@apache.org",
        "time": "Tue Dec 23 19:25:35 2025 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Dec 23 19:25:35 2025 +0800"
      },
      "message": "test: support gutil_test in scripts and run it on CI (#2338)\n\n"
    },
    {
      "commit": "b67c1537a1b240703d10a703d0543de2d042208b",
      "tree": "f4b40faf9181bcc8749ae3f9687ee89c899c7610",
      "parents": [
        "d06a330553217aea7ad54781bea49fd19c81a112"
      ],
      "author": {
        "name": "Dan Wang",
        "email": "wangdan@apache.org",
        "time": "Tue Dec 23 19:24:16 2025 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Dec 23 19:24:16 2025 +0800"
      },
      "message": "feat(go-client): introduce QueryConfig as admin API for meta (#2324)\n\n"
    },
    {
      "commit": "d06a330553217aea7ad54781bea49fd19c81a112",
      "tree": "22113f889e2290495e8f14f5467365230664a999",
      "parents": [
        "bec725eeca66bb3fc2260a3498e679f5f1c40522"
      ],
      "author": {
        "name": "Dan Wang",
        "email": "wangdan@apache.org",
        "time": "Tue Dec 23 14:18:55 2025 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Dec 23 14:18:55 2025 +0800"
      },
      "message": "refactor(test): use ASSERT_* instead of CHECK_* for `partition_count` test and optimize the style of some code (#2334)\n\n"
    },
    {
      "commit": "bec725eeca66bb3fc2260a3498e679f5f1c40522",
      "tree": "3dea1281761637c5f52f86b3eb7e0f5df8509774",
      "parents": [
        "54bfd039d72e7d447959e27db2a06c7a68ad4840"
      ],
      "author": {
        "name": "Dan Wang",
        "email": "wangdan@apache.org",
        "time": "Tue Dec 23 14:17:48 2025 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Dec 23 14:17:48 2025 +0800"
      },
      "message": "refactor: introduce `host_port::resolve()` and use it instead of `dns_resolver::instance()::resolve_address()` (#2326)\n\n"
    },
    {
      "commit": "54bfd039d72e7d447959e27db2a06c7a68ad4840",
      "tree": "84c0219eafab3c9cff3d4a79241a8b99277ce824",
      "parents": [
        "900934020d8cffa241dfc07d72c4a851c104b10e"
      ],
      "author": {
        "name": "Kevin Liu",
        "email": "kevinjqliu@users.noreply.github.com",
        "time": "Thu Dec 11 23:54:17 2025 -0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Dec 12 15:54:17 2025 +0800"
      },
      "message": "ci(github): update markdown lint check (#2329)\n\nUse tcort/github-action-markdown-link-check instead of gaurav-nelson/github-action-markdown-link-check\nsince the latter is deprecated.\n\nSee https://github.com/apache/infrastructure-actions/issues/371."
    },
    {
      "commit": "900934020d8cffa241dfc07d72c4a851c104b10e",
      "tree": "b72659cd1b59d08c71b1225916518c073e32d882",
      "parents": [
        "e4555f07c62e0202896e8769500f86c05d604fcf"
      ],
      "author": {
        "name": "Samunroyu",
        "email": "yujingweiop@gmail.com",
        "time": "Wed Nov 26 00:58:56 2025 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Nov 26 00:58:56 2025 +0800"
      },
      "message": "fix: fix ubuntu openssl (#2327)\n\nFix https://github.com/apache/incubator-pegasus/issues/2325.\n\nThe reason is that in https://github.com/apache/incubator-pegasus/pull/2293\nopenssl/types.h was included, while the default version of OpenSSL on Ubuntu\n20.04 is 1.1.1 which does not have this header file. To solve this problem, we\ninstall OpenSSL 3.0.12 instead on Ubuntu 20.04."
    },
    {
      "commit": "e4555f07c62e0202896e8769500f86c05d604fcf",
      "tree": "5bc2687df67f88d1f8fba7695247367ed5e2a1a2",
      "parents": [
        "68310cbccdd19df74a36d33f1cc3d8697d6d28f6"
      ],
      "author": {
        "name": "Dan Wang",
        "email": "wangdan@apache.org",
        "time": "Fri Nov 21 18:10:08 2025 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Nov 21 18:10:08 2025 +0800"
      },
      "message": "build(go-collector): bump go-client dependency in collector to latest version including `ListNodes` interface (#2322)\n\nUpgrade to go-client version to [5eb1665e0630](https://github.com/apache/incubator-pegasus/commit/5eb1665e06302ebbdb8b15f41ed1c85b407d10d9)\nto introduce [ListNodes](https://github.com/apache/incubator-pegasus/pull/1939)\nfor hotsport detection."
    },
    {
      "commit": "68310cbccdd19df74a36d33f1cc3d8697d6d28f6",
      "tree": "8f9c55bb37dadf2f009497c6a177586966792870",
      "parents": [
        "e56cccb460c3b706a18084cded9ab1034e913bee"
      ],
      "author": {
        "name": "Dan Wang",
        "email": "wangdan@apache.org",
        "time": "Fri Nov 21 18:08:59 2025 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Nov 21 18:08:59 2025 +0800"
      },
      "message": "refactor: extract and encapsulate the aggregation process of single-table statistics for reuse (#2318)\n\nBoth shell and HTTP interfaces now support displaying a table\u0027s statistics in\nmultiple sections. Since the logic for this was largely duplicated, a lot of\nredundant code existed. This PR extracts the common logic and introduces\nan `add_app_info` interface to encapsulate it, allowing a table’s statistics to\nbe added to a `multi_printer` in multiple sections for later output.\n\nAdditionally, a `resolve` interface is introduced for `host_port` itself, replacing\n`replication_ddl_client::node_name`."
    },
    {
      "commit": "e56cccb460c3b706a18084cded9ab1034e913bee",
      "tree": "07a274272c9063c30628707e8dbf385a55d223c9",
      "parents": [
        "912145ea1f39269f90412e8e3fc09c6653306f47"
      ],
      "author": {
        "name": "Dan Wang",
        "email": "wangdan@apache.org",
        "time": "Wed Nov 19 14:26:28 2025 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Nov 19 14:26:28 2025 +0800"
      },
      "message": "ci(github): fix workflow configuration issues to enable Go collector code style checks (#2321)\n\n"
    },
    {
      "commit": "912145ea1f39269f90412e8e3fc09c6653306f47",
      "tree": "e6dbc1304042a1961be52890d92100e2e54ffa14",
      "parents": [
        "1ccdb85a81e46d10dd3cfef237e4af1ed081216f"
      ],
      "author": {
        "name": "Dan Wang",
        "email": "wangdan@apache.org",
        "time": "Wed Nov 19 00:05:46 2025 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Nov 19 00:05:46 2025 +0800"
      },
      "message": "refactor: optimize the style of `init()` in `test_checker` (#2320)\n\n"
    },
    {
      "commit": "1ccdb85a81e46d10dd3cfef237e4af1ed081216f",
      "tree": "ade6f49a1ff683aef65cf04a8ef9d0d0698dda71",
      "parents": [
        "5eb1665e06302ebbdb8b15f41ed1c85b407d10d9"
      ],
      "author": {
        "name": "Dan Wang",
        "email": "wangdan@apache.org",
        "time": "Wed Nov 19 00:04:49 2025 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Nov 19 00:04:49 2025 +0800"
      },
      "message": "refactor: optimize the style of `partition_ingestion()` in `bulk_load_service` (#2319)\n\n"
    },
    {
      "commit": "5eb1665e06302ebbdb8b15f41ed1c85b407d10d9",
      "tree": "e110f0d963ac740e2779d73a5cee4c2542ab15e0",
      "parents": [
        "bdabe0ace675306d220f1a029679d0fcd69e1372"
      ],
      "author": {
        "name": "Dan Wang",
        "email": "wangdan@apache.org",
        "time": "Wed Nov 12 11:10:12 2025 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Nov 12 11:10:12 2025 +0800"
      },
      "message": "fix(cluster_balance_policy): clear partitions in migration info before outputting result into it (#2317)\n\n"
    },
    {
      "commit": "bdabe0ace675306d220f1a029679d0fcd69e1372",
      "tree": "24661b63cb4ebe0023230f2061f6260067292480",
      "parents": [
        "75212068c3909213edfeb213e6da3497b277f25f"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Tue Nov 11 14:59:00 2025 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Nov 11 14:59:00 2025 +0800"
      },
      "message": "build(deps): bump twisted from 21.2.0 to 24.7.0 in /python-client (#2095)\n\nBumps [twisted](https://github.com/twisted/twisted) from 21.2.0 to 24.7.0.\n- [Release notes](https://github.com/twisted/twisted/releases)\n- [Changelog](https://github.com/twisted/twisted/blob/trunk/NEWS.rst)\n- [Commits](https://github.com/twisted/twisted/compare/twisted-21.2.0...twisted-24.7.0)\n\n---\nupdated-dependencies:\n- dependency-name: twisted\n  dependency-type: direct:production"
    },
    {
      "commit": "75212068c3909213edfeb213e6da3497b277f25f",
      "tree": "c931967cd8bd720890064a56c12095c4ea687fef",
      "parents": [
        "89b7c33b2d387b3cd28af05a9b916869b529d939"
      ],
      "author": {
        "name": "nanorth",
        "email": "69760116+nanorth@users.noreply.github.com",
        "time": "Mon Nov 10 17:51:17 2025 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Nov 10 17:51:17 2025 +0800"
      },
      "message": "fix(go-client): add new error codes to distinguish between timeout and session reset (#2286)\n\n### What problem does this PR solve? \u003c!--add issue link with summary if exists--\u003e\nThe existing Go client code does not distinguish between request timeout and session reset, as both return `context.DeadlineExceeded` and trigger a config update.\nThis PR introduces a new client-defined error, `ERR_SESSION_RESET`, to differentiate between these two cases, and ensures that config updates only occur when `ERR_SESSION_RESET` is returned.\n\n### Checklist \u003c!--REMOVE the items that are not applicable--\u003e\n\n##### Tests \u003c!-- At least one of them must be included. --\u003e\n- Unit test included"
    },
    {
      "commit": "89b7c33b2d387b3cd28af05a9b916869b529d939",
      "tree": "0621baf695a199a135819b173e73bebc9dc3418d",
      "parents": [
        "3290bcae9594c0f4e0bbc9edf49265c2606cf03b"
      ],
      "author": {
        "name": "nanorth",
        "email": "69760116+nanorth@users.noreply.github.com",
        "time": "Mon Nov 10 15:23:36 2025 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Nov 10 15:23:36 2025 +0800"
      },
      "message": "feat(go-client): introduce Prometheus for go-client monitoring and added multiple metric collection sites (#2285)\n\n### What problem does this PR solve? \u003c!--add issue link with summary if exists--\u003e\nThis PR introduces Prometheus for go-client monitoring, and adds multiple metric collection points to enhance observability of the system.\n\n### What is changed and how does it work?\nThis PR integrates the Prometheus client libraries (github.com/prometheus/client_golang and github.com/prometheus/client_model) as tools for metric instrumentation and data reporting.\n\n### Checklist \u003c!--REMOVE the items that are not applicable--\u003e\n\n##### Tests \u003c!-- At least one of them must be included. --\u003e\n\n- Manual test (add detailed scripts or steps below)\nUse go-client to invoke several interfaces, and the metrics were verified to be correctly reported on Prometheus monitoring services.\n\u003cimg width\u003d\"1664\" height\u003d\"562\" alt\u003d\"image\" src\u003d\"https://github.com/user-attachments/assets/5976457b-e8f4-4225-b53f-1d07b0f358da\" /\u003e\n\n\n##### Code changes\n\n- Has exported function/method change\nAdded metric collection for operation counts and latencies in `func (p *pegasusTableConnector) runPartitionOp`.\nAdded RPC request size metric collection in `func (n *nodeSession) writeRequest`.\n- Has exported variable/fields change\nAdded a new field `enablePerfCounter` in `nodeSession` to distinguish between meta and replica nodes. Performance metrics are collected only for replica nodes. The constructor has been updated accordingly.\n- Package structure change\nThe `Config` struct has been moved into a separate package to avoid circular dependencies. \n\n##### Related changes\n- Need to update the documentation\nSince the `Config` struct has been moved to a separate package, the example code has also been updated to reflect this change."
    },
    {
      "commit": "3290bcae9594c0f4e0bbc9edf49265c2606cf03b",
      "tree": "4e562c4ebfced3a661e3e6f2a1d662f1aedcbb96",
      "parents": [
        "46b019830b75bd62147164511852eeacebbf3d5e"
      ],
      "author": {
        "name": "Dan Wang",
        "email": "wangdan@apache.org",
        "time": "Wed Nov 05 20:45:40 2025 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Nov 05 20:45:40 2025 +0800"
      },
      "message": "test: fix heap-use-after-free issue in `test_disable_backup_policy` caused by unfinished task (#2315)\n\nFix https://github.com/apache/incubator-pegasus/issues/2281.\n\nIn `test_disable_backup_policy`, `continue_current_backup_unlocked()`\nis invoked, which in turn calls `issue_new_backup_unlocked()` onto `_mp`\nas the callback function where if `_policy.is_disable` is set to `true`, the\ncallback will recursively reschedule itself through the thread pool. After the\ntest has finished and `_mp` has been destructed, however, the background\nthread may be still executing the callback, where accessing members inside\n`_mp` will lead to a heap-use-after-free error. The solution is to stop all\nrunning tasks on `_mp` before the unit test exits."
    },
    {
      "commit": "46b019830b75bd62147164511852eeacebbf3d5e",
      "tree": "a30af2d718feba304a70a28b794a7065147f507e",
      "parents": [
        "0f32557e851921c034595977825e372fe327c6d6"
      ],
      "author": {
        "name": "Jun 11",
        "email": "50448108+WJSGDBZ@users.noreply.github.com",
        "time": "Tue Nov 04 18:09:39 2025 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Nov 04 18:09:39 2025 +0800"
      },
      "message": "fix(Python-client):prevent logger override and migrate config to YAML (#2303)\n\n* Changed the configuration format from .conf to YAML.\n* Replaced logging.config.fileConfig with logging.config.dictConfig for log initialization."
    },
    {
      "commit": "0f32557e851921c034595977825e372fe327c6d6",
      "tree": "d44cfee202580fbc331e2c911a3f764b80a29a7c",
      "parents": [
        "468bc0538880cb4c69ef4afbe59d1fab8198b9f5"
      ],
      "author": {
        "name": "Guangshuo Wang",
        "email": "202122080904@std.uestc.edu.cn",
        "time": "Tue Nov 04 18:07:43 2025 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Nov 04 18:07:43 2025 +0800"
      },
      "message": "fix(shell): make the returned scanners sorted in ascending order by partition index to support fetching specified partition in shell (#2312)\n\nFix https://github.com/apache/incubator-pegasus/issues/2309.\n\nThis pull request updates the logic for assigning partition indices in the\n`async_get_unordered_scanners` method of `pegasus_client_impl.cpp`.\nThe change ensures that each scanner receives a unique and sequential\npartition index, rather than decrementing from the total count, when the\nvariable max_split_count is greater than the number of partitions in the\ntable.\n\nPartition assignment logic update:\n* Changed the assignment of partition indices in the scanner creation loop\nto use an incrementing `partition_index` variable, ensuring unique and\nsequential indices for each partition instead of using a decrementing `count`\nvalue."
    },
    {
      "commit": "468bc0538880cb4c69ef4afbe59d1fab8198b9f5",
      "tree": "ceeb4e909fae2bc6c621ca22b29337d42efe9f57",
      "parents": [
        "e637541f542470fb45c7f386d66a8b5c0fb9b25a"
      ],
      "author": {
        "name": "Dan Wang",
        "email": "wangdan@apache.org",
        "time": "Fri Oct 31 14:51:39 2025 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Oct 31 14:51:39 2025 +0800"
      },
      "message": "ci: fix the failure in Python client tests caused by \"version `GLIBC_2.38\u0027 not found\" (#2311)\n\nResolve https://github.com/apache/incubator-pegasus/issues/2278.\n\nThe Python client tests run on the Ubuntu 22.04 image, which uses glibc 2.35.\nIn the YAML configuration for the workflow, these tests depend on a precompiled\nPython 3.11 downloaded via `setup-python`, which began to use 3.11.13 after it\nhad been released.\n\nHowever, starting from version 3.11.13, Python was built against glibc 2.38, leading\nto the error \"version `GLIBC_2.38\u0027 not found\" during test execution.\n\nTo fix this issue, the `setup-python` version is pinned to **3.11.12**, which is the\nlatest 3.11.x release still built against glibc 2.35."
    },
    {
      "commit": "e637541f542470fb45c7f386d66a8b5c0fb9b25a",
      "tree": "36aa8535d058be0823e0c5e2c064637738acd011",
      "parents": [
        "0fc00015a217da8a158b3cd1f1bafd9ab6631f7d"
      ],
      "author": {
        "name": "Dan Wang",
        "email": "wangdan@apache.org",
        "time": "Tue Oct 28 11:12:28 2025 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Oct 28 11:12:28 2025 +0800"
      },
      "message": "fix(zookeeper): fix potential dangling path pointer issue when calling ZooKeeper APIs (#2302)\n\nFix https://github.com/apache/incubator-pegasus/issues/2307.\n\nThe heap-use-after-free error found in the ASan test was caused by a dangling\npointer issue: the `path` pointer was freed in the thread for completion callback\nwhile it was still used in the ZooKeeper C client API.\n\nTo fix this problem, `std::shared_ptr` is introduced to manage the `path`, ensuring\nthat the memory is automatically released only when all references to it have been\ndestroyed."
    },
    {
      "commit": "0fc00015a217da8a158b3cd1f1bafd9ab6631f7d",
      "tree": "7ad9446e4afc7e9b602eeb425ae67ec7f29a3d7f",
      "parents": [
        "ea554b23cfa505f6b43877980c8fe90ddd04287e"
      ],
      "author": {
        "name": "nanorth",
        "email": "69760116+nanorth@users.noreply.github.com",
        "time": "Thu Oct 16 23:41:23 2025 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Oct 16 23:41:23 2025 +0800"
      },
      "message": "fix(go-client): Changed the validation logic for new configuration during queryconfig operation (#2287)\n\nThis PR removes the check that requires the new partition count to be equal to, double, or half of\nthe old one. Instead, it only checks whether the new partition count is valid (greater than or equal\nto 4 and is a power of 2)."
    },
    {
      "commit": "ea554b23cfa505f6b43877980c8fe90ddd04287e",
      "tree": "042fbedd97d6f37bea81f0ca7fcf4f55db14b5a4",
      "parents": [
        "7fec1578536988f649a7b9b4759a74608f74427f"
      ],
      "author": {
        "name": "Dan Wang",
        "email": "wangdan@apache.org",
        "time": "Thu Oct 16 16:28:44 2025 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Oct 16 16:28:44 2025 +0800"
      },
      "message": "feat: support encrypted password file during SASL authentication for ZooKeeper C client (#2293)\n\nhttps://github.com/apache/incubator-pegasus/issues/2292\n\nIn addition to supporting plaintext password files, this PR adds support for\n**encrypted password files** during SASL authentication. A new configuration\nitem, `sasl_password_encryption_scheme`, is introduced to specify the\nencryption scheme — currently, only **Base64** is supported.\n\nThis PR also introduces a new configuration option, `zoo_log_level`, which\nallows setting the **log level** for the ZooKeeper C client to help diagnose\nZooKeeper-related issues.\n\nFinally, SASL authentication tests for the ZooKeeper C client — which were\npreviously missing — have been added to ensure proper functionality.\n\nFollowing configurations are newly added:\n```diff\n[zookeeper]\n+ zoo_log_level \u003d \"ZOO_LOG_LEVEL_INFO\"\n+ sasl_password_encryption_scheme \u003d \"base64\"\n```"
    },
    {
      "commit": "7fec1578536988f649a7b9b4759a74608f74427f",
      "tree": "701a607dd736fc619343f51fd5bda2478b29474f",
      "parents": [
        "44400f6e3ca1fb1ce48d04d1c9145aad7ac4e991"
      ],
      "author": {
        "name": "Dan Wang",
        "email": "wangdan@apache.org",
        "time": "Thu Oct 16 15:41:27 2025 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Oct 16 15:41:27 2025 +0800"
      },
      "message": "test(make_idempotent): refactor framework and add idempotent cases for `incr` API in function tests (#2267)\n\nhttps://github.com/apache/incubator-pegasus/issues/2197\n\nFirst, considering that 3 atomic write APIs (`incr`, `check_and_set`, `check_and_mutate`)\nshare common characteristics in their testing framework, a base fixture **AtomicWriteTest**\nhas been introduced in function tests. Based on this, both the testing framework and test\ncases for atomic write APIs will be gradually added into the dedicated `atomic_write_test`\nmodule under functional tests.\n\nThe `incr` API\u0027s testing framework and test cases have been reimplemented, covering write\ntests and validations under both **idempotent** and **non-idempotent** modes of a table."
    },
    {
      "commit": "44400f6e3ca1fb1ce48d04d1c9145aad7ac4e991",
      "tree": "1b660d3334b2ae0e3d1065945a48056cafbaced3",
      "parents": [
        "fdbd6ebb460b97d39c027837217c1a41de1b3671"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Wed Oct 15 22:54:47 2025 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Oct 15 22:54:47 2025 +0800"
      },
      "message": "build(deps): bump org.apache.zookeeper:zookeeper in /java-client (#2301)\n\nBumps org.apache.zookeeper:zookeeper from 3.9.3 to 3.9.4."
    },
    {
      "commit": "fdbd6ebb460b97d39c027837217c1a41de1b3671",
      "tree": "f341b5e5d9aa8908e483afdc8f56f997f906fedd",
      "parents": [
        "b89ef3e2b3b1d23d9c3b837a5394d5ea69bfa6b6"
      ],
      "author": {
        "name": "Dan Wang",
        "email": "wangdan@apache.org",
        "time": "Mon Oct 13 11:39:39 2025 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Oct 13 11:39:39 2025 +0800"
      },
      "message": "feat(utils): update `get_last_component()` to support `std::string_view` (#2299)\n\nUpdate `get_last_component()` to support `std::string_view`, making it adaptable\nto different use cases such as `std::string_view`, `std::string`, and C-style strings.\n\nThis enhancement allows the function to be used in various scenarios, including parsing\nlog file names, replica data directory names, and ZooKeeper node names.\n\nAdditionally, the implementation of `get_last_component()` has been refactored to\nleverage `std::string_view`’s built-in methods for cleaner and more efficient code."
    },
    {
      "commit": "b89ef3e2b3b1d23d9c3b837a5394d5ea69bfa6b6",
      "tree": "d6b44d40503f890a664df7d7595582d842a85737",
      "parents": [
        "4935ea01cc56ae08868faee6c67ce59924ee8493"
      ],
      "author": {
        "name": "Dan Wang",
        "email": "wangdan@apache.org",
        "time": "Fri Sep 19 15:40:57 2025 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Sep 19 15:40:57 2025 +0800"
      },
      "message": "build(images): install pluggable authentication modules for Cyrus SASL on Ubuntu to provide auth mechanisms required for tests (#2296)\n\nhttps://github.com/apache/incubator-pegasus/issues/2292\n\nTo support tests that connect to ZooKeeper via SASL, auth modules should be\nintroduced. Otherwise, those tests would fail due to missing necessary mechanisms."
    },
    {
      "commit": "4935ea01cc56ae08868faee6c67ce59924ee8493",
      "tree": "226d9591ae006cbc68878054f24e16aff06c6aad",
      "parents": [
        "05fe09c5f08d13b00c77fbc5997cfe955211c9c2"
      ],
      "author": {
        "name": "Dan Wang",
        "email": "wangdan@apache.org",
        "time": "Fri Sep 19 15:38:48 2025 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Sep 19 15:38:48 2025 +0800"
      },
      "message": "build(thirdparty): fix thirdparties build failure on macOS caused by removal of compatibility with CMake versions \u003c 3.5 (#2294)\n\nResolve https://github.com/apache/incubator-pegasus/issues/2295.\n\nSince compatibility with CMake versions below 3.5 has been removed on macOS,\nwe need to update the minimum required CMake version for affected third-party\ndependencies to 3.5 in order to fix the build failures."
    },
    {
      "commit": "05fe09c5f08d13b00c77fbc5997cfe955211c9c2",
      "tree": "1cd78f1d4c16f024f4fbcdd022fda39573386dc4",
      "parents": [
        "a5782f1b4e8f695c26bdafd0603cc592cc4c9db1"
      ],
      "author": {
        "name": "Dan Wang",
        "email": "wangdan@apache.org",
        "time": "Fri Sep 19 15:34:38 2025 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Sep 19 15:34:38 2025 +0800"
      },
      "message": "build(deps): bump both Thrift compiler and org.apache.thrift:libthrift from 0.11.0 to 0.13.0 in /java-client (#2279)\n\n"
    },
    {
      "commit": "a5782f1b4e8f695c26bdafd0603cc592cc4c9db1",
      "tree": "095022611989a56f6e3f91aab8adbbdbea91cb5f",
      "parents": [
        "8fbebd8a6a4d3491ccdebd077c62a088ac9be261"
      ],
      "author": {
        "name": "Guangshuo Wang",
        "email": "202122080904@std.uestc.edu.cn",
        "time": "Fri Sep 19 15:20:08 2025 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Sep 19 15:20:08 2025 +0800"
      },
      "message": "fix(scripts): fix the issue where running pegasus_manual_compact.sh on small tables sometimes hangs (#2298)\n\nFix https://github.com/apache/incubator-pegasus/issues/2297.\n\nThis pull request makes a minor adjustment to the timestamp formatting in the \n`wait_manual_compact()` function of `admin_tools/pegasus_manual_compact.sh`.\nThe change removes the milliseconds component from the displayed timestamp\nwhen checking compact progress.\n\n* Timestamp formatting: Changed the date format for `earliest_finish_time_ms` by\nremoving the `.000` milliseconds portion to display only seconds.\n"
    },
    {
      "commit": "8fbebd8a6a4d3491ccdebd077c62a088ac9be261",
      "tree": "6ebc2cd0711fd03814e4bd0c8a1003d243daa39e",
      "parents": [
        "7c0fd2574848aae7acb64f48c7718ea3e89dfb31"
      ],
      "author": {
        "name": "Dan Wang",
        "email": "wangdan@apache.org",
        "time": "Wed Sep 10 14:24:36 2025 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Sep 10 14:24:36 2025 +0800"
      },
      "message": "build(thirdparty): bump zookeeper-client-c from 3.7.0 to 3.9.4 (#2289)\n\nhttps://github.com/apache/incubator-pegasus/issues/2292\n\nTo support encryption of the password file used for SASL authentication with\nZooKeeper, we need to introduce a new feature from the ZooKeeper C client:\nhttps://github.com/apache/zookeeper/pull/2223.\n\nSince this feature is only available starting from [ZooKeeper 3.9.4 which was\njust released](https://zookeeper.apache.org/doc/r3.9.4/releasenotes.html), we\nneed to upgrade the ZooKeeper version from 3.7.0 to 3.9.4."
    },
    {
      "commit": "7c0fd2574848aae7acb64f48c7718ea3e89dfb31",
      "tree": "be71a6febbffedf2db0b3d226f919e9da4ff0d2f",
      "parents": [
        "bf37fc5ef54453c230bca134697a6a759b148f42"
      ],
      "author": {
        "name": "Dan Wang",
        "email": "wangdan@apache.org",
        "time": "Fri Sep 05 11:31:18 2025 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Sep 05 11:31:18 2025 +0800"
      },
      "message": "fix(build): replace variable-length arrays with proper structures to fix compilation errors on macOS (#2290)\n\nFix https://github.com/apache/incubator-pegasus/issues/2291.\n\nVariable-length arrays are used somewhere in our codes.  However, as a Clang\nextension, currently they are considered as errors while building on macOS.\nTherefore, we will replace them with some structures such as `std::vector` or\n`std::unique_ptr` to eliminate the compilation errors."
    },
    {
      "commit": "bf37fc5ef54453c230bca134697a6a759b148f42",
      "tree": "5980015c3ab81f8f5e6bb9064687ab0485b075c7",
      "parents": [
        "e42f1a65f0b7352c531e2bc90a9ac434e52ffe98"
      ],
      "author": {
        "name": "Dan Wang",
        "email": "wangdan@apache.org",
        "time": "Wed Aug 27 15:00:34 2025 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Aug 27 15:00:34 2025 +0800"
      },
      "message": "perf(network): support client RPC connection pool to each server address (#2272)\n\n# 1. Motivation\n\nCurrently, for each remote server (\\\u003cip\\\u003e\\:\\\u003cport\\\u003e), at most one client connection\nis established, and all RPCs share this single connection. This approach is still\nacceptable when network latency is low, but it becomes problematic when the\nlatency is high (e.g., cross-country or intercontinental communication where latency\ncan exceed 100 ms). Since all RPCs share one connection, high network latency can\ncause one RPC to time out and fail, which in turn may lead to subsequent RPC failures.\nThis is especially critical for cases like duplication, where copying a checkpoint may\ninvolve transferring large amounts of data — high latency can make duplication almost\nimpossible.\n\nTo address this, we introduce a client connection pool for each remote server (\\\u003cip\\\u003e\\:\\\u003cport\\\u003e).\nThis allows better utilization of network bandwidth when there are many RPCs (each\npotentially involving large data transfers), reduces the risk of frequent RPC timeouts,\nand provides significant improvements in scenarios with high network latency.\n\n# 2. API\n\n## 2.1 Get Session\n\nThe most important interface of the connection pool is `get_rpc_session()`. External\ncallers only need to use this interface to obtain a session (i.e., a connection) from the\npool, without worrying about how the connection is created, connected, or reused.\n\n## 2.2 Callbacks\n\nWhen a session is successfully established (connection creation is generally asynchronous\nand will notify via a callback upon completion) or disconnected (I/O is generally asynchronous,\nand if an error is detected in a completion callback, the connection should be closed),\nthe pool’s `on_connected()` and `on_disconnected()` interfaces must be called to notify\nthe pool of these events.\n\n## 2.3 Close\n\nThe pool supports closing all sessions by `close()`. If a closed connection is still involved in\nI/O, it will trigger the disconnect callback, which in turn triggers the on_disconnected call.\n\n# 3. Implementation\n\nThe pool size—i.e., the maximum number of sessions it can hold—is configurable via\n`conn_pool_max_size`.\n\nWhen an external caller requests a connection from the pool, if the pool has not yet reached\nits limit, a new connection will be created and returned. Otherwise, an existing connection\nwill be selected and returned.\n\nEach connection may have multiple ongoing RPCs (or none at all). The selection strategy\nfor existing connections is to pick the one with the fewest in-flight RPCs.\n\n# 4. Changes\n\nCompared to before, the main change is moving from a single client connection to a client\nconnection pool. This change is almost seamless—code that previously fetched a single\nconnection now simply fetches one from the pool. Similarly, where the previous single\nconnection had its own callbacks (for connection established and disconnected) and close\nlogic, the corresponding pool interfaces should now be used.\n\nAdditionally, this PR includes optimizations and refactoring for much of the connection-oriented\nnetworking and RPC session (connection) code—without changing their behavior. Two new\nconfigurations, `socket_send_buffer_bytes` and `socket_recv_buffer_bytes`, have been\nadded to control the send/receive buffer size for each socket.\n\nFollowing configurations are newly added:\n```diff\n[network]\n+ conn_pool_max_size \u003d 4\n+ socket_send_buffer_bytes \u003d 16777216\n+ socket_recv_buffer_bytes \u003d 16777216\n```"
    },
    {
      "commit": "e42f1a65f0b7352c531e2bc90a9ac434e52ffe98",
      "tree": "b929478f70f6d57d444325f8b3b7b40bbf92ce5d",
      "parents": [
        "2b7020f17791d9f98e4056824a228e11a4587d67"
      ],
      "author": {
        "name": "Dan Wang",
        "email": "wangdan@apache.org",
        "time": "Mon Aug 11 17:46:53 2025 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Aug 11 17:46:53 2025 +0800"
      },
      "message": "fix(java-client): use `remove_result` instead of `put_result` for `rrdb_remove_operator` (#2280)\n\nAlthough this is not a typical bug, the return value of the `remove` RPC interface for\n`rrdb` should be adapted using `remove_result` rather than `put_result` despite the\nsame type received by both of them as `update_response`."
    },
    {
      "commit": "2b7020f17791d9f98e4056824a228e11a4587d67",
      "tree": "b20a71da821316ad8772e0203513d72a0f949b97",
      "parents": [
        "fd39e6fc43414b1937da3944ea9d2a7f3c985e92"
      ],
      "author": {
        "name": "Dan Wang",
        "email": "wangdan@apache.org",
        "time": "Mon Aug 11 17:45:26 2025 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Aug 11 17:45:26 2025 +0800"
      },
      "message": "build(deps): bump org.apache.zookeeper:zookeeper from 3.7.2 to 3.9.3 in /java-client (#2274)\n\n"
    },
    {
      "commit": "fd39e6fc43414b1937da3944ea9d2a7f3c985e92",
      "tree": "bde0f94a28efda7a94b1f46069346130ac1c13d1",
      "parents": [
        "065063834435deed76822fa19416e14a3b2fdf39"
      ],
      "author": {
        "name": "Dan Wang",
        "email": "wangdan@apache.org",
        "time": "Mon Aug 04 14:41:27 2025 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Aug 04 14:41:27 2025 +0800"
      },
      "message": "ci(github): pin the action `dorny/paths-filter` to the commit SHA pointing to `v3.0.2` (#2275)\n\nResolve https://github.com/apache/incubator-pegasus/issues/2276.\n\nAccording to the the reply from INFRA team[1] and the doc of infrastructure\nactions[2], the actions in allow list must be pinned to a SHA rather than a tag\nas of August 1st.\n\nOnly the action `rebuild_thirdparty_if_needed`[3] uses `dorny/paths-filter`.\nEvents are also added to the workflows depending on it so that they could be\ntriggered once it is changed.\n\n1. https://issues.apache.org/jira/browse/INFRA-27084\n2. https://github.com/apache/infrastructure-actions/?tab\u003dreadme-ov-file#adding-a-new-action-to-the-allow-list\n3. https://github.com/apache/incubator-pegasus/blob/master/.github/actions/rebuild_thirdparty_if_needed/action.yaml#L22"
    },
    {
      "commit": "065063834435deed76822fa19416e14a3b2fdf39",
      "tree": "aec996f734f2694d6a5a0aeabcb8d09a7936ed03",
      "parents": [
        "4f824e2a981177cc33494dd283d4dc71fc35fee6"
      ],
      "author": {
        "name": "Dan Wang",
        "email": "wangdan@apache.org",
        "time": "Fri Aug 01 11:12:16 2025 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Aug 01 11:12:16 2025 +0800"
      },
      "message": "build(deps): bump io.netty:netty-bom from 4.1.85.Final to 4.1.123.Final in /java-client (#2273)\n\n"
    },
    {
      "commit": "4f824e2a981177cc33494dd283d4dc71fc35fee6",
      "tree": "103b5566c681e3bf9a94c9436fe21c3106de21af",
      "parents": [
        "a987da91b694e3949bac89494dacdaa33eeb6ea4"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Thu Jul 31 15:16:53 2025 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Jul 31 15:16:53 2025 +0800"
      },
      "message": "build(deps): bump org.apache.commons:commons-lang3 in /java-client (#2271)\n\nBumps org.apache.commons:commons-lang3 from 3.12.0 to 3.18.0."
    },
    {
      "commit": "a987da91b694e3949bac89494dacdaa33eeb6ea4",
      "tree": "42e0dbc64f72a6d3c344a1c37b841ed4f9a2ef92",
      "parents": [
        "6bcca89f7b0fdf1cd14e59d7c56bc9789bd7fce6"
      ],
      "author": {
        "name": "Dan Wang",
        "email": "wangdan@apache.org",
        "time": "Tue Jul 15 12:47:31 2025 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Jul 15 12:47:31 2025 +0800"
      },
      "message": "fix: fix undefined behavior due to overflow or underflow when handling `incr` requests (#2269)\n\nFix https://github.com/apache/incubator-pegasus/issues/2270.\n\nPerforming direct addition on two integer variables of the same type can lead to\nundefined behavior due to overflow or underflow. Thus introduces a `safe_add()`\nfunction template that supports safe addition for both signed and unsigned integers:\nit checks for potential overflow or underflow before performing the addition. If an\noverflow or underflow would occur, it returns `false`; otherwise, it performs the addition\nand returns `true`.\n\nBoth the non-idempotent and idempotent implementations of `incr` are updated to use\n`safe_add()` to safely compute the result of adding the base value and the increment."
    },
    {
      "commit": "6bcca89f7b0fdf1cd14e59d7c56bc9789bd7fce6",
      "tree": "6075d8e23518b570e6e675b5d45116dad67da2ac",
      "parents": [
        "123427edae85ed7b1321737027085d5aef625b8c"
      ],
      "author": {
        "name": "Dan Wang",
        "email": "wangdan@apache.org",
        "time": "Wed Jul 09 11:43:09 2025 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Jul 09 11:43:09 2025 +0800"
      },
      "message": "chore: update NOTICE year to 2025 (#2268)\n\n"
    },
    {
      "commit": "123427edae85ed7b1321737027085d5aef625b8c",
      "tree": "2a562d1f99d2e72a232c8fcff67930fa0a6d5866",
      "parents": [
        "c6e52b0770f82852636bf4f69567a4ee8be9ecd6"
      ],
      "author": {
        "name": "Dan Wang",
        "email": "wangdan@apache.org",
        "time": "Wed Jul 09 11:42:09 2025 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Jul 09 11:42:09 2025 +0800"
      },
      "message": "test: terminate the test case once `SetUp()` of the base fixture fails (#2265)\n\nFix https://github.com/apache/incubator-pegasus/issues/2266.\n\nIntroduce the `SET_UP_BASE` macro to ensure that if the base test fixture\u0027s\n`SetUp()` fails with an `ASSERT_*` (which may leave its member variables\nuninitialized), the derived test fixture\u0027s `SetUp()` will immediately return. This\nprevents potential segmentation faults caused by accessing uninitialized base\nclass members in the derived class\u0027s `SetUp()`."
    },
    {
      "commit": "c6e52b0770f82852636bf4f69567a4ee8be9ecd6",
      "tree": "6e741a12d9b1cc629484a762a12a0ba07acd9bb3",
      "parents": [
        "18e8aeb744228a01247fe3970e375785ddcda4db"
      ],
      "author": {
        "name": "Dan Wang",
        "email": "wangdan@apache.org",
        "time": "Wed Jul 02 11:43:43 2025 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Jul 02 11:43:43 2025 +0800"
      },
      "message": "build: support building and testing Java and Scala Clients with JDK 17 (#2263)\n\n- Upgrade `actions/setup-java` from v1 to v4.\n- Introduce JDK 17 environment to CI workflows for Java/Scala client.\n- To ensure compatibility with JDK 17:\n  1. Bump Scala version from 2.12.7 to 2.12.20;\n  2. Bump SBT version from 1.2.8 to 1.8.3."
    },
    {
      "commit": "18e8aeb744228a01247fe3970e375785ddcda4db",
      "tree": "a0f43aade3cd9afa7c9cc2a9756f20133bab6cea",
      "parents": [
        "d4693fd2b2a3d7cd3e52aab5c8c4ee44c06c1292"
      ],
      "author": {
        "name": "Dan Wang",
        "email": "wangdan@apache.org",
        "time": "Tue Jul 01 19:01:07 2025 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Jul 01 19:01:07 2025 +0800"
      },
      "message": "test: enable validation logic in debug-only code to run during unit tests (#2262)\n\nIn Pegasus, unit tests are not necessarily executed in debug mode (i.e., with the\n`NDEBUG` macro undefined). For example, the GitHub CI workflow builds and\nruns unit tests in release mode. As a result, certain test-related code paths that\nare only enabled in debug builds are not actually executed during CI testing.\n\nTo address this, we now allow such debug-only validation logic to be compiled\nand executed when building test code (i.e., executing `./run.sh build --test` where\n`--test` defines the `MOCK_TEST` macro). This ensures that debug-mode test\nlogic is included and exercised during unit test runs, improving test coverage in\nCI and other environments."
    },
    {
      "commit": "d4693fd2b2a3d7cd3e52aab5c8c4ee44c06c1292",
      "tree": "2aa62f6f2bda8757f0f01473c32e0e7f87bf48bb",
      "parents": [
        "c6cf82b493962e6ffd60b2b3a83fce5e152c0c82"
      ],
      "author": {
        "name": "Dan Wang",
        "email": "wangdan@apache.org",
        "time": "Tue Jul 01 18:59:59 2025 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Jul 01 18:59:59 2025 +0800"
      },
      "message": "perf(make_idempotent): improve performance of idempotent writes by reducing deserialization and removing the mapping table for atomic write handlers (#2261)\n\nhttps://github.com/apache/incubator-pegasus/issues/2197\n\nIntroduce `idempotent_writer` class to the primary replica to cache the idempotent\nsingle-update requests generated during the `make_idempotent` phase as well as\nthe original atomic write RPC request from the client to improve performance, since：\n1. both deserializations for single-update requests and the original atomic write RPC\nrequest are reduced;\n2. use `std::variant` to hold the applying function and the RPC for each atomic write\ninstead of the mapping table for its handler."
    },
    {
      "commit": "c6cf82b493962e6ffd60b2b3a83fce5e152c0c82",
      "tree": "0a0562a4e734c4a055c858bca0326cca9a1af5e5",
      "parents": [
        "b868170544f612b56b59f70fa9d7ab148d50a277"
      ],
      "author": {
        "name": "Dan Wang",
        "email": "wangdan@apache.org",
        "time": "Mon Jun 16 12:12:02 2025 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Jun 16 12:12:02 2025 +0800"
      },
      "message": "fix: use RTTI to do double-check for `down_cast` only in debug mode (#2260)\n\n"
    },
    {
      "commit": "b868170544f612b56b59f70fa9d7ab148d50a277",
      "tree": "7cb35f4478acd46dcf914f5c0a9619f07e8806c1",
      "parents": [
        "c11158d2c960fd66323806b477aa0b45af644b90"
      ],
      "author": {
        "name": "Dan Wang",
        "email": "wangdan@apache.org",
        "time": "Mon Jun 16 12:09:40 2025 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Jun 16 12:09:40 2025 +0800"
      },
      "message": "fix(security): fix DDD diagnose request failure with `app_id \u003d -1` and improve ACL handling (#2259)\n\nFix https://github.com/apache/incubator-pegasus/issues/2258.\n\nWhen the client (via shell) decides to diagnose all DDD partitions, it sets\n`app_id \u003d -1` and sends the request to the meta server. Upon receiving the\nrequest, the meta server attempts to look up the table name based on `app_id`\nand then performs ACL checks to verify whether the user has permission to\naccess the table. However, since `app_id \u003d -1` represents **all** tables rather\nthan a specific one, there is no corresponding table name to look up. As a result,\nthe lookup fails and the meta server returns an `ERR_INVALID_PARAMETERS`\nerror to the client.\n\nTo fix this issue, the meta server must first check whether `app_id \u003d\u003d -1` when it\nreceives a DDD diagnose request:\n- If `app_id \u003d\u003d -1`, the ACL check is deferred: the server first retrieves all DDD\npartitions and then performs ACL checks on each one individually, returning only\nthose partitions that the client user is authorized to access.\n- If `app_id !\u003d -1`, the `app_id` must correspond to a real table, so the existing logic\nremains unchanged: the server resolves the table name by `app_id` and performs a\nsingle and standard ACL check.\n\nIn addition to this root cause, several related issues were discovered and fixed as part\nof this change:\n- Changed the access type for `RPC_CM_DDD_DIAGNOSE` from `access_type::kControl`\nto `access_type::kList`, since the request only retrieves partition information and does\nnot modify any data or metadata.\n- The meta server previously handled only Ranger ACLs for the `RPC_CM_LIST_APPS`\nrequest, ignoring the legacy ACLs; this has now been fixed, where legacy ACLs are also\nrespected.\n- Refactored some ACL-related code for clarity and maintainability."
    },
    {
      "commit": "c11158d2c960fd66323806b477aa0b45af644b90",
      "tree": "16e066734b60416f49abfcc027f90ef899c85f7a",
      "parents": [
        "06e06d47bfdf7dde5595c2ac407973f2fb3939c4"
      ],
      "author": {
        "name": "Dan Wang",
        "email": "wangdan@apache.org",
        "time": "Thu May 29 11:10:59 2025 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu May 29 11:10:59 2025 +0800"
      },
      "message": "feat(go-client): generate interfaces for the hotkey detection (#2255)\n\nTo enable the Go collector to implement hotspot detection, it is necessary to\ngenerate the hotkey detection interfaces in the Go client for invocation. The files\n`go-client/generator/radmin.csv` and `idl/replica_admin.thrift` were modified to\ngenerate the interfaces. All other newly added or modified Go source files are\ngenerated and formatted."
    },
    {
      "commit": "06e06d47bfdf7dde5595c2ac407973f2fb3939c4",
      "tree": "58ae11a2ea1c99b5b3f593396e5281d99561fdee",
      "parents": [
        "154bb16f1637116673acc803861157ac39e5d4c2"
      ],
      "author": {
        "name": "Dan Wang",
        "email": "wangdan@apache.org",
        "time": "Wed May 28 15:28:20 2025 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed May 28 15:28:20 2025 +0800"
      },
      "message": "fix(go-client): fix the data race issue caused by concurrent read/write access to the session list of `metaCall` (#2257)\n\nFix https://github.com/apache/incubator-pegasus/issues/2256.\n\nThe data race was caused by:\n1. The `issueBackupMetas()` function returns without waiting for all subroutines\nto complete;\n2. Concurrent access (read/write) to the `metas` member (the session list) of the\n`metaCall` struct was not properly synchronized with mutual exclusion."
    },
    {
      "commit": "154bb16f1637116673acc803861157ac39e5d4c2",
      "tree": "109ea1b4af7cf178bf96f0ca0df29768d304ed8e",
      "parents": [
        "656d8490382bb298a527eee875ca274586da73d4"
      ],
      "author": {
        "name": "Dan Wang",
        "email": "wangdan@apache.org",
        "time": "Wed May 28 15:26:43 2025 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed May 28 15:26:43 2025 +0800"
      },
      "message": "feat(make_idempotent): re-adapt `make_idempotent()` and `put()` to support batched single-update requests for atomic writes (#2249)\n\nhttps://github.com/apache/incubator-pegasus/issues/2197\n\nBecause a `check_and_mutate` request may be converted into multiple single-update\nrequests, the `make_idempotent()` and `put()` interfaces for `incr`, `check_and_set`\nand `check_and_mutate` have been re-adapted and better supported through template\nfunctions.\n\nThe number of batched single-operation requests corresponding to the batched requests\nof put/remove, or an atomic write request of incr, check_and_set or check_and_mutate\nhas been changed from being stored in a variable to being recorded in an array.\n\nIn addition, the writers responsible for applying single-update requests to the storage\nengine are now stored in an array instead of a map to improve performance."
    },
    {
      "commit": "656d8490382bb298a527eee875ca274586da73d4",
      "tree": "2ac3487afba3f6c0b505278e1bce0fcbf0cd236e",
      "parents": [
        "e09804161e521ed1f5a133f6bfd5078cd4df435a"
      ],
      "author": {
        "name": "Phuc-Thanh Nguyen",
        "email": "83806633+npt-1707@users.noreply.github.com",
        "time": "Mon May 26 22:58:15 2025 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon May 26 22:58:15 2025 +0800"
      },
      "message": "fix(shell): Fix potential vulnerable cloned function (#2253)\n\nHi Development Team,\n\nI identified a potential vulnerability in a clone function sdsMakeRoomFor()\nin `src/shell/sds/sds.c` sourced from [redis/redis](https://github.com/redis/redis).\nThis issue, originally reported in [CVE-2021-41099](https://nvd.nist.gov/vuln/detail/CVE-2021-41099),\nwas resolved in the repository via this commit https://github.com/redis/redis/commit/c6ad876774f3cc11e32681ea02a2eead00f2c521.\n\nThis PR applies the corresponding patch to fix the vulnerability in this codebase.\n\nPlease review at your convenience. Thank you!"
    },
    {
      "commit": "e09804161e521ed1f5a133f6bfd5078cd4df435a",
      "tree": "0d79e6c1831a4fff979e25df019390606f2fc38e",
      "parents": [
        "ce267cbd2ea480a09345eb358143dcbc79b43760"
      ],
      "author": {
        "name": "Yingchun Lai",
        "email": "laiyingchun@apache.org",
        "time": "Thu May 22 11:04:02 2025 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu May 22 11:04:02 2025 +0800"
      },
      "message": "fix: fix build failure on Apple M chips (#2252)\n\nFix the build failure on MacOS with M chips, the error is:\n```\nc++: error: unsupported option \u0027-msse4.1\u0027 for target \u0027arm64-apple-darwin24.4.0\u0027\n```\n\nAdd the patch from https://github.com/abseil/abseil-cpp/commit/26ee072e14dea17fa8870d47cd7e8b4cc1c95e93"
    },
    {
      "commit": "ce267cbd2ea480a09345eb358143dcbc79b43760",
      "tree": "26f45c580600b7537f06aa77a0ad12a91f720fed",
      "parents": [
        "ae6ace22a445702c429fb56906f9e65493e4fd04"
      ],
      "author": {
        "name": "Samunroyu",
        "email": "yujingweiop@gmail.com",
        "time": "Wed May 21 23:48:20 2025 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed May 21 23:48:20 2025 +0800"
      },
      "message": "refactor(FQDN): further more refator on idl/dsn.layer2.thrift v2 (#2217)\n\nThis is a further refactor on idl/dsn.layer2.thrift based on\nhttps://github.com/apache/incubator-pegasus/pull/2049\nthe main effects are on partition_configuration structure."
    },
    {
      "commit": "ae6ace22a445702c429fb56906f9e65493e4fd04",
      "tree": "7475edb6a3a01a70d080c82afe27eccb5cbbe436",
      "parents": [
        "5b229e53d1e2dccb411dc7e5816ccdff6d4cc19f"
      ],
      "author": {
        "name": "Dan Wang",
        "email": "wangdan@apache.org",
        "time": "Wed May 14 10:50:47 2025 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed May 14 10:50:47 2025 +0800"
      },
      "message": "ci: introduce `revive` as the linter replacement for `golint` (#2247)\n\n[golint](https://github.com/golang/lint) has been deprecated (since v1.41.0) and\narchived by the owner. [Golangci-lint](https://golangci-lint.run) recommends\n[revive](https://github.com/mgechev/revive), a drop-in replacement of golint\nand used by many well-known projects such as `tidb` and `etcd`.\n\nTherefore we introduce `revive` as the linter for all workflows for Go, including\n`go-client`, `collector`, `admin-cli` and `pegic`. The problems found by `revive`\nare also fixed according to the warnings. "
    },
    {
      "commit": "5b229e53d1e2dccb411dc7e5816ccdff6d4cc19f",
      "tree": "b95043954bee2e9e863050e1e194bfbed1520269",
      "parents": [
        "9fed575f82988bb944ac735f569916c324085538"
      ],
      "author": {
        "name": "Dan Wang",
        "email": "wangdan@apache.org",
        "time": "Mon May 12 12:16:33 2025 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon May 12 12:16:33 2025 +0800"
      },
      "message": "feat(make_idempotent): support making `check_and_mutate` request idempotent in `pegasus_write_service::impl` (#2246)\n\nhttps://github.com/apache/incubator-pegasus/issues/2197\n\nImplement two APIs in `pegasus_write_service::impl` to make `check_and_mutate`\nrequests idempotent.\n\nUnlike `incr` and `check_and_set`, a `check_and_mutate` request may be translated\ninto multiple `put` and `remove` requests. To conveniently store both in the same\n`std::vector`, they are all converted into `update_request` objects, with the `type`\nfield used to distinguish between them:\n\n- implement `make_idempotent()` function to translate a `check_and_mutate` request\ninto multiple single-put and single-remove requests which are naturally idempotent,\nand process the possible errors during the translation, e.g. failed to read the check\nvalue or did not pass the check;\n- implement `put()` function to apply multiple single-put and single-remove requests\ninto the RocksDB instance (certainly the atomicity of the batch operations must be\nguaranteed) and make response for `check_and_mutate`.\n"
    },
    {
      "commit": "9fed575f82988bb944ac735f569916c324085538",
      "tree": "2c37eb55277b9bcdcc986c9df05ced21a2beedc1",
      "parents": [
        "9806897071585ce01cf794368c13d366595562c6"
      ],
      "author": {
        "name": "Dan Wang",
        "email": "wangdan@apache.org",
        "time": "Mon May 12 12:12:38 2025 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon May 12 12:12:38 2025 +0800"
      },
      "message": "build: restrict the `CMake` version installed on Ubuntu 20.04 and 22.04 to 3.x.x (#2245)\n\nResolve https://github.com/apache/incubator-pegasus/issues/2244.\n\nThe reason for failing to build `thirdparties-src-*` images is that the `CMake` version\nis too new (currently 4.0.0) in the build environment  for both Ubuntu 20.04 and 22.04,\nwhile some third-party dependencies still rely on older `CMake syntax`, e.g. `thrift-0.9.3`\ndeclares `cmake_minimum_required(VERSION 2.8.12)` in its `CMakeLists.txt`. Such legacy\nsyntax is not fully compatible with the newest versions of `CMake`.\n\nTo solve this problem, we restrict the `CMake` version installed in the Ubuntu 20.04 and\n22.04 environments to [a newer 3.x.x version](https://pypi.org/project/cmake/#history) that\nalso maintains compatibility with legacy `CMakeLists.txt` files."
    },
    {
      "commit": "9806897071585ce01cf794368c13d366595562c6",
      "tree": "139e9f6891de52981dff79db27dcd89024259514",
      "parents": [
        "e64faa7d03f836e5212874bbbfb8f900341897d7"
      ],
      "author": {
        "name": "Dan Wang",
        "email": "wangdan@apache.org",
        "time": "Mon May 12 12:11:22 2025 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon May 12 12:11:22 2025 +0800"
      },
      "message": "feat(duplication): support resumable download for checkpoint files during full duplication on the server side (#2238)\n\nhttps://github.com/apache/incubator-pegasus/issues/2242\n\nWhen a dup follower requests the latest checkpoint information from the dup\nmaster, the server supports returning the size and checksum of each file under\nthe checkpoint directory. This allows the client to decide which files to fetch:\n\n- if it is the first time downloading the checkpoint, all files need to be downloaded;\n- if it is the second time or later, only files that are missing or partially downloaded\nlocally need to be fetched.\n\nAdditionally, the client is allowed to specify the checksum algorithm to use —\ncurrently, only MD5 is supported."
    },
    {
      "commit": "e64faa7d03f836e5212874bbbfb8f900341897d7",
      "tree": "6c80460098b782787bf073c73b9395b620f42686",
      "parents": [
        "6a40395d1c9c01c7dbaa3b420d3f71169af5f3b8"
      ],
      "author": {
        "name": "Dan Wang",
        "email": "wangdan@apache.org",
        "time": "Mon Apr 28 20:52:49 2025 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Apr 28 20:52:49 2025 +0800"
      },
      "message": "feat(make_idempotent): support making `check_and_set` request idempotent in `pegasus_write_service` (#2239)\n\nhttps://github.com/apache/incubator-pegasus/issues/2197\n\nImplement higher-level APIs `make_idempotent()` and `put()` on\n`pegasus_write_service` for `check_and_set` request. Both of them\nwill Internally call APIs provided by `pegasus_write_service::impl`.\nTwo metrics are also introduced to measure the duration that make\n`incr` and `check_and_set` idempotent."
    },
    {
      "commit": "6a40395d1c9c01c7dbaa3b420d3f71169af5f3b8",
      "tree": "0f6c3b0f5ee1a41837ad93dd9094fcb63962cf42",
      "parents": [
        "34f556219c4257fa946e52560f84ceb6093f6595"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Mon Apr 28 00:14:28 2025 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Apr 28 00:14:28 2025 +0800"
      },
      "message": "build(deps): bump golang.org/x/net from 0.36.0 to 0.38.0 in /collector (#2232)\n\n"
    },
    {
      "commit": "34f556219c4257fa946e52560f84ceb6093f6595",
      "tree": "e77faf7868a153443ee2e406596a8aadc0aef84a",
      "parents": [
        "908d3ee8e335ca77cf14114fe1e47b000752cf53"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Mon Apr 28 00:13:41 2025 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Apr 28 00:13:41 2025 +0800"
      },
      "message": "build(deps): bump golang.org/x/net from 0.33.0 to 0.38.0 in /pegic (#2231)\n\n"
    },
    {
      "commit": "908d3ee8e335ca77cf14114fe1e47b000752cf53",
      "tree": "cad4fea239b029177477b40894b4ca92dcae5ddd",
      "parents": [
        "bed48daa9f55a96f60812e6e0513aa6b8bd4119f"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Mon Apr 28 00:12:57 2025 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Apr 28 00:12:57 2025 +0800"
      },
      "message": "build(deps): bump golang.org/x/net from 0.33.0 to 0.36.0 in /go-client (#2226)\n\n"
    },
    {
      "commit": "bed48daa9f55a96f60812e6e0513aa6b8bd4119f",
      "tree": "7d040092e57cd4b7ec07dbc76403206e6a6082c0",
      "parents": [
        "a59acd01c232a41e1de90c219184b945234671b9"
      ],
      "author": {
        "name": "Dan Wang",
        "email": "wangdan@apache.org",
        "time": "Sun Apr 27 16:54:45 2025 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sun Apr 27 16:54:45 2025 +0800"
      },
      "message": "ci(github): fix Go workflows which failed due to Ubuntu 20.04 retirement (#2240)\n\nResolve https://github.com/apache/incubator-pegasus/issues/2241.\n\nGo workflows run on Ubuntu 20.04 because Go client uses thrift-compiler 0.13.0\nto generate code and the thrift-compiler version on Ubuntu 20.04 is 0.13.0. However\nUbuntu 20.04 runner has been retired and removed on 2025-04-15. To solve this\nproblem, we choose to build thrift 0.13.0 in a image based on Ubuntu 22.04.\n\nAlso add Collector to the workflow for regular building."
    },
    {
      "commit": "a59acd01c232a41e1de90c219184b945234671b9",
      "tree": "65ab09849e78f4261acb63644e282219c9d4f7a2",
      "parents": [
        "60bb031de6ae3db90dafa814b9328a13979c9f17"
      ],
      "author": {
        "name": "Dan Wang",
        "email": "wangdan@apache.org",
        "time": "Tue Apr 22 14:55:15 2025 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Apr 22 14:55:15 2025 +0800"
      },
      "message": "ci(github): fix that sbt could not be found while checking format for Scala (#2236)\n\nResolve https://github.com/apache/incubator-pegasus/issues/2237.\n\nInstall `sbt` with [sdkman](https://get.sdkman.io) before checking format. Also\nbump actions/cache from v2 to v3 for Scala workflows."
    },
    {
      "commit": "60bb031de6ae3db90dafa814b9328a13979c9f17",
      "tree": "13dc2d2c48a6740a523b60be721871d2cf80f7bf",
      "parents": [
        "682d960c6a2317c57a4fa791c540b5d6407014ff"
      ],
      "author": {
        "name": "Dan Wang",
        "email": "wangdan@apache.org",
        "time": "Tue Apr 22 14:54:35 2025 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Apr 22 14:54:35 2025 +0800"
      },
      "message": "ci(github): bump actions/cache from v2 to v3 for Java workflows (#2234)\n\nResolve https://github.com/apache/incubator-pegasus/issues/2235."
    },
    {
      "commit": "682d960c6a2317c57a4fa791c540b5d6407014ff",
      "tree": "285863d135a823ea2ac36d11996d83e2416ab799",
      "parents": [
        "600b34f88a8af2297783e05ed88f4bc0cfc195b0"
      ],
      "author": {
        "name": "Dan Wang",
        "email": "wangdan@apache.org",
        "time": "Tue Apr 22 14:54:02 2025 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Apr 22 14:54:02 2025 +0800"
      },
      "message": "feat(make_idempotent): support making `check_and_set` request idempotent in `pegasus_write_service::impl` (#2230)\n\nhttps://github.com/apache/incubator-pegasus/issues/2197\n\nImplement two APIs in `pegasus_write_service::impl` to make `check_and_set`\nrequests idempotent:\n\n- implement `make_idempotent()` function to translate a `check_and_set` request\ninto the single-put request which is naturally idempotent, and process the possible\nerrors during the translation, e.g. failed to read the check value or did not pass the\ncheck;\n- implement `put()` function to apply the single-put request into the RocksDB\ninstance and make response for `check_and_set`.\n\nAlso refactor `validate_check()` function to make the check for `check_and_set`\nand `check_and_mutate` conditions more clearer and readable."
    },
    {
      "commit": "600b34f88a8af2297783e05ed88f4bc0cfc195b0",
      "tree": "9eb70c63c501855921b6a92d3a17f5838a19b06a",
      "parents": [
        "034d79a0e47c46934156a635ed7554cbfad21e06"
      ],
      "author": {
        "name": "Pengfan Lu",
        "email": "lu_peng_fan@163.com",
        "time": "Mon Apr 21 17:38:40 2025 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Apr 21 17:38:40 2025 +0800"
      },
      "message": "fix(learn): avoid learn use DEFAULT_POOL (#2126)\n\nFLAGS_max_copy_rate_megabytes_per_disk will use `sleep_for` function\nto block THREAD_POOL_DEFAULT.\nIt\u0027s cause replica server cannot deal `remote command`. This modify is\nsame as FLAGS_max_send_rate_megabytes_per_disk, only use\nTHREAD_POOL_BLOCK_SERVICE to sleep."
    },
    {
      "commit": "034d79a0e47c46934156a635ed7554cbfad21e06",
      "tree": "906a093d38a1767a32d63b4cfed2cc8e00ebc402",
      "parents": [
        "980ee2805404d8cd0086e93d6df89345d52c9038"
      ],
      "author": {
        "name": "Dan Wang",
        "email": "wangdan@apache.org",
        "time": "Thu Apr 17 15:56:12 2025 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Apr 17 15:56:12 2025 +0800"
      },
      "message": "feat(make_idempotent): support getting/enabling/disabling `atomic_idempotent` on shell (#2229)\n\nhttps://github.com/apache/incubator-pegasus/issues/2197\n\nFollowing commands are supported on shell to operate `atomic_idempotent`,\nwhich decides whether all atomic requests written to a table are idempotent\":\n- `get_atomic_idempotent` \n- `enable_atomic_idempotent`\n- `disable_atomic_idempotent`\n\nAll of these commands are based on a table, thus an argument `app_name`\nis required."
    },
    {
      "commit": "980ee2805404d8cd0086e93d6df89345d52c9038",
      "tree": "36c351ddd2664db86e5915b77d1c67f287ff1902",
      "parents": [
        "586119a03ef1cc21dd57f96245c26922b6a5c8f9"
      ],
      "author": {
        "name": "Dan Wang",
        "email": "wangdan@apache.org",
        "time": "Thu Apr 17 15:55:34 2025 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Apr 17 15:55:34 2025 +0800"
      },
      "message": "feat(new_metrics): introduce metrics for memory usage of RocksDB Write Buffer Manager (#2224)\n\nAlthough the memory usage of each replica\u0027s **memtable** is already tracked\nvia `kCurSizeAllMemTables`, the actual memory allocated for memtables can\nbe much larger — for example, pre-allocated but unused memory, additional\nmemory overhead, and temporary allocations. These will not be reflected in the\nmetric obtained via `kCurSizeAllMemTables`. \n\nSince the **Write Buffer Manager** is commonly used to manage major types\nof memory allocations in RocksDB — including block cache, memtables, indexes,\nand filters — it\u0027s possible to retrieve the actual memory usage of memtables from\nthe Write Buffer Manager. Of course, this metric reflects memory usage at the\nserver (process) level rather than per-replica.\n\nIn addition to being visible through metrics, it is also available via the `nodes -u`\nshell command."
    },
    {
      "commit": "586119a03ef1cc21dd57f96245c26922b6a5c8f9",
      "tree": "2cb9c86734cb7c3b2b11d12d06c50b49f1e1ac87",
      "parents": [
        "7144844d8415ecb87c784f4efd6a5ad11636d7ea"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Thu Apr 17 10:43:01 2025 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Apr 17 10:43:01 2025 +0800"
      },
      "message": "build(deps): bump golang.org/x/net from 0.23.0 to 0.36.0 in /collector (#2228)\n\nBumps [golang.org/x/net](https://github.com/golang/net) from 0.23.0 to 0.36.0.\n- [Commits](https://github.com/golang/net/compare/v0.23.0...v0.36.0)\n\n---\nupdated-dependencies:\n- dependency-name: golang.org/x/net\n  dependency-version: 0.36.0\n  dependency-type: indirect"
    },
    {
      "commit": "7144844d8415ecb87c784f4efd6a5ad11636d7ea",
      "tree": "65806ed03365426b67504ed7ebda322ae4ce465e",
      "parents": [
        "5bc6421a4db20a4795e4f7a3593cb1bcc2db2382"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Wed Apr 16 22:14:28 2025 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Apr 16 22:14:28 2025 +0800"
      },
      "message": "build(deps): bump golang.org/x/crypto in /collector (#2225)\n\nBumps [golang.org/x/crypto](https://github.com/golang/crypto) from 0.31.0 to 0.35.0."
    },
    {
      "commit": "5bc6421a4db20a4795e4f7a3593cb1bcc2db2382",
      "tree": "8c18f2375461af6888aabcf23a47d3d87a947cd7",
      "parents": [
        "ff4a7d376a4dfd3629204d81d12ad73a0f439f56"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Tue Apr 15 15:36:19 2025 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Apr 15 15:36:19 2025 +0800"
      },
      "message": "build(deps): bump golang.org/x/net from 0.23.0 to 0.36.0 in /admin-cli (#2207)\n\nBumps [golang.org/x/net](https://github.com/golang/net) from 0.23.0 to 0.36.0.\n- [Commits](https://github.com/golang/net/compare/v0.23.0...v0.36.0)\n\n---\nupdated-dependencies:\n- dependency-name: golang.org/x/net\n  dependency-type: indirect\n...\n\nSigned-off-by: dependabot[bot] \u003csupport@github.com\u003e\nCo-authored-by: dependabot[bot] \u003c49699333+dependabot[bot]@users.noreply.github.com\u003e"
    },
    {
      "commit": "ff4a7d376a4dfd3629204d81d12ad73a0f439f56",
      "tree": "0d1d228180a17125b6d1d49a2d92186b007a5cc8",
      "parents": [
        "2da689c18a70ec4c04b7dd65d931b7008d7caf58"
      ],
      "author": {
        "name": "Dan Wang",
        "email": "wangdan@apache.org",
        "time": "Tue Apr 15 15:17:13 2025 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Apr 15 15:17:13 2025 +0800"
      },
      "message": "feat(new_metrics): support `server_stat` command showing some important server-level metrics (part 2) (#2223)\n\nAdd metrics related to the number of replicas as the 2rd part to be shown by\n`server_stat` command."
    },
    {
      "commit": "2da689c18a70ec4c04b7dd65d931b7008d7caf58",
      "tree": "4db5fa46d9edb0d407ee72fdf6eaf4d097a2b428",
      "parents": [
        "03a2c92c9b6ea26e5f5dd66334a7e525ab929135"
      ],
      "author": {
        "name": "Dan Wang",
        "email": "wangdan@apache.org",
        "time": "Tue Apr 15 15:16:53 2025 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Apr 15 15:16:53 2025 +0800"
      },
      "message": "feat(make_idempotent): each primary replica uses `atomic_idempotent` to decide whether to make all atomic writes idempotent (#2222)\n\nhttps://github.com/apache/incubator-pegasus/issues/2197\n\nSince in https://github.com/apache/incubator-pegasus/pull/2220 `atomic_idempotent`\nwas synced from meta server to replica server, it could be used to decide whether a\nprimary replica makes all atomic writes idempotent."
    },
    {
      "commit": "03a2c92c9b6ea26e5f5dd66334a7e525ab929135",
      "tree": "329f66aa2a4a75216cd29cd23a671e3fc8d08cda",
      "parents": [
        "fc416e3acf0f1a58114c081ddc315d0703f8a9c8"
      ],
      "author": {
        "name": "Dan Wang",
        "email": "wangdan@apache.org",
        "time": "Tue Apr 15 15:16:25 2025 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Apr 15 15:16:25 2025 +0800"
      },
      "message": "feat(make_idempotent): support `atomic_idempotent` for `create` and `ls` commands on shell (#2221)\n\nhttps://github.com/apache/incubator-pegasus/issues/2197\n\nSupport `atomic_idempotent` for `create` and `ls` by:\n- Add a flag to the `create` command to decide whether the created table is\n`atomic_idempotent` (false by default).\n- Add a column `atomic_idempotent` to the result shown by `ls` command."
    },
    {
      "commit": "fc416e3acf0f1a58114c081ddc315d0703f8a9c8",
      "tree": "ae2632b8f6d61cf20f71e2649e93dec9b35df29c",
      "parents": [
        "cebbfae84fe6958983acf70e16bf32833fd99c18"
      ],
      "author": {
        "name": "Dan Wang",
        "email": "wangdan@apache.org",
        "time": "Mon Apr 14 14:19:54 2025 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Apr 14 14:19:54 2025 +0800"
      },
      "message": "feat(make_idempotent): sync `atomic_idempotent` from meta server into `.app-info` file for each replica (#2220)\n\nhttps://github.com/apache/incubator-pegasus/issues/2197\n\nIn https://github.com/apache/incubator-pegasus/pull/2205, we introduced a\nnew attribute `atomic_idempotent` to meta, which is used to enable/disable\nthe idempotence of atomic write operations.\n\nThis attribute should be broadcast to each replica: whenever one replica is\npromoted to the primary, by this attribute it can decide whether to make all\natomic writes idempotent. This attribute will be persisted into `.app-info`\nfile to ensure it can be loaded after restarted."
    },
    {
      "commit": "cebbfae84fe6958983acf70e16bf32833fd99c18",
      "tree": "4000fa44110c7b002426f52b1dc42cee609d64fe",
      "parents": [
        "e612d2cd8371684a1c2ff42b972234990b0956e9"
      ],
      "author": {
        "name": "Dan Wang",
        "email": "wangdan@apache.org",
        "time": "Mon Apr 14 14:14:22 2025 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Apr 14 14:14:22 2025 +0800"
      },
      "message": "perf(make_idempotent): introduce row lock to improve 2PC for idempotent atomic writes (#2214)\n\nhttps://github.com/apache/incubator-pegasus/issues/2197\n\nPreviously in https://github.com/apache/incubator-pegasus/pull/2198, we implemented\nidempotence for each atomic write by blocking the entire mutation queue until the 2PC\npipeline was drained. However, this significantly affects performance since the pipeline\nis stalled and all write requests get stuck in the mutation queue.\n\nTo address this performance issue, we introduce a row-lock mechanism: each hash key\nand the highest decree currently in the 2PC phase are recorded in a hash table. For each\natomic write request, if the maximum decree associated with its hash key has not yet been\napplied to the storage engine, the request is blocked in the mutation queue. Otherwise,\nthe hash key is considered unlocked and the request can proceed into the 2PC phase at\nany time.\n\nTo avoid the performance overhead of deserialization, we directly use the `partition_hash`\n(an unsigned 64-bit integer) from the client instead of the hash key. This also makes memory\nusage more predictable, as the `partition_hash` has a fixed size.\n\nAdditionally, to mitigate the performance impact caused by frequent insertions and deletions\nin the row-lock hash table, we introduce an LRU strategy: keys are only evicted when the hash\ntable exceeds a certain size threshold, and only the least recently used keys with no active\nusage are removed.\n\nGive a concrete example to illustrate how atomic write requests are handled after introducing\nrow locks. Suppose a client issues an `incr` request to a primary replica. If the primary replica\nhas been configured to make all atomic write requests idempotent, then:\n1. A mutation will be created as a blocking candidate to hold this atomic write request and then\nappended to the mutation queue.\n2. This mutation will be blocked and cannot get popped once the hash key contained in it is\nlocked(i.e. the maximum decree associated with the hash key has not been applied to the\nstorage engine).\n3. This mutation can get popped only after its hash key becomes unlocked.\n4. Popped from the mutation queue, the current base value 100 is read from the storage\nengine, and create a single put request to store the final value 101.\n5. Another mutation is then created to hold this idempotent single put request.\n6. Subsequently the new mutation enters 2PC phase, appended to `plog` and broadcast to\nsecondary replicas."
    },
    {
      "commit": "e612d2cd8371684a1c2ff42b972234990b0956e9",
      "tree": "2232104d8535154437cf2aa0276154637f55f563",
      "parents": [
        "76cd7989690ec17e790283d8f3ba5b1e985e9e56"
      ],
      "author": {
        "name": "Dan Wang",
        "email": "wangdan@apache.org",
        "time": "Wed Apr 09 16:01:46 2025 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Apr 09 16:01:46 2025 +0800"
      },
      "message": "ci: bump dorny/paths-filter from v2 to v3.0.2 (#2218)\n\nResolve https://github.com/apache/incubator-pegasus/issues/2219.\n\nFix workflows that failed as dorny/paths-filter@v2 is not allowed to be used."
    }
  ],
  "next": "76cd7989690ec17e790283d8f3ba5b1e985e9e56"
}
