)]}'
{
  "log": [
    {
      "commit": "0eb3ec67e3450e3ca71846e067227ae4668f0beb",
      "tree": "db73d2862f9c2b815f3840756d62a1a4d15d7112",
      "parents": [
        "f5d5bdfc07e68bd774e6e394718872cc02355eda"
      ],
      "author": {
        "name": "Nick Vatamaniuc",
        "email": "vatamane@gmail.com",
        "time": "Tue Jul 28 19:36:56 2026 -0400"
      },
      "committer": {
        "name": "Nick Vatamaniuc",
        "email": "nickva@users.noreply.github.com",
        "time": "Wed Jul 29 11:19:30 2026 -0400"
      },
      "message": "Handle errors better in index cleanup\n\nPreviously, if a node was down when cleaning up any indexes we\u0027d get an\nexception like:\n\n```\n{erpc,noconnection} : node@host\n     [\u003c\u003c\"erpc:receive_response/3 L1442\"\u003e\u003e,\u003c\u003c\"dreyfus_fabric_cleanup:recv/3 L54\"\u003e\u003e\n     [\u003c\u003c\"erpc:receive_response/3 L1442\"\u003e\u003e,\u003c\u003c\"dreyfus_fabric_cleanup:recv/3 L54\"\u003e\u003e,...\n```\n\nWe can handle that better by anticipating a few more error conditions:\nnoconnection, exits, throws, timeouts.\n\nTo avoid copying the mess in three place let\u0027s just use a single helper\nfunction in fabric.\n\nAdd tests for all the silly bits.\n"
    },
    {
      "commit": "f5d5bdfc07e68bd774e6e394718872cc02355eda",
      "tree": "a476216dab22a82a7fa39522afee235564330892",
      "parents": [
        "654122981ff1ef83db5d79edb3304736d09bd30e"
      ],
      "author": {
        "name": "Nick Vatamaniuc",
        "email": "vatamane@gmail.com",
        "time": "Wed Jul 29 03:10:22 2026 -0400"
      },
      "committer": {
        "name": "Nick Vatamaniuc",
        "email": "nickva@users.noreply.github.com",
        "time": "Wed Jul 29 09:51:33 2026 -0400"
      },
      "message": "Update gun to 2.5.0\n\nChangelog:\n https://github.com/apache/couchdb-gun/compare/CouchDB-2.4.1-1...CouchDB-2.5.0-1\n"
    },
    {
      "commit": "654122981ff1ef83db5d79edb3304736d09bd30e",
      "tree": "9d3c3ca4f189d4238a6302bb31b2ab8885fe4973",
      "parents": [
        "977fecb535c4e50a2d1356469b670c6da0e6d7b9",
        "b22922c27b93b1113bb0b9e1c5d55e861f429f86"
      ],
      "author": {
        "name": "Robert Newson",
        "email": "rnewson@apache.org",
        "time": "Tue Jul 28 19:28:27 2026 +0100"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Jul 28 19:28:27 2026 +0100"
      },
      "message": "Merge pull request #6078 from apache/nouveau-6075-sort-by-relevance\n\nFix explicit sorting by relevance/score"
    },
    {
      "commit": "b22922c27b93b1113bb0b9e1c5d55e861f429f86",
      "tree": "9d3c3ca4f189d4238a6302bb31b2ab8885fe4973",
      "parents": [
        "977fecb535c4e50a2d1356469b670c6da0e6d7b9"
      ],
      "author": {
        "name": "Robert Newson",
        "email": "rnewson@apache.org",
        "time": "Tue Jul 28 13:30:18 2026 +0100"
      },
      "committer": {
        "name": "Robert Newson",
        "email": "rnewson@apache.org",
        "time": "Tue Jul 28 14:01:07 2026 +0100"
      },
      "message": "Fix explicit sorting by relevance/score\n\nAlso fixed some misleading docs (from the original import from previous search docs)\n\nCloses https://github.com/apache/couchdb/issues/6075\n"
    },
    {
      "commit": "977fecb535c4e50a2d1356469b670c6da0e6d7b9",
      "tree": "ed5d37f06caabac8db1c459e44b1ffb830ca7a07",
      "parents": [
        "c2a97ae6829f7617e8be7612501c90aba6785f19"
      ],
      "author": {
        "name": "Nick Vatamaniuc",
        "email": "vatamane@gmail.com",
        "time": "Mon Jul 27 18:02:16 2026 -0400"
      },
      "committer": {
        "name": "Nick Vatamaniuc",
        "email": "nickva@users.noreply.github.com",
        "time": "Tue Jul 28 08:43:54 2026 -0400"
      },
      "message": "Quadratic speed up in _bulk_docs in pair_write_info\n\nPreviously lists:keyfind scan inside a lists:map was essentially a guadratic\npenalty right in the middle of _bulk_docs hotpath. Even with individual doc\nupdates, because couch db updater coalesces batches together this should help\neven individual doc updates running concurrently.\n"
    },
    {
      "commit": "c2a97ae6829f7617e8be7612501c90aba6785f19",
      "tree": "ec01f775dc3af105f32ff72c0cb29207f77fbc0d",
      "parents": [
        "91cc9619c359ae5514ab2cae53f0555b544ddc59"
      ],
      "author": {
        "name": "Nick Vatamaniuc",
        "email": "vatamane@gmail.com",
        "time": "Mon Jul 27 03:03:16 2026 -0400"
      },
      "committer": {
        "name": "Nick Vatamaniuc",
        "email": "nickva@users.noreply.github.com",
        "time": "Mon Jul 27 09:50:39 2026 -0400"
      },
      "message": "Simplify chttpd_db_doc_size_tests with sigils\n\nSince OTP 27 we can use sigils to avoid escaping strings, especially since we\nhave a bunch of json strings everywhere. Pick a test file as an example to see\nhow it look chttpd_db_doc_size_tests\n"
    },
    {
      "commit": "91cc9619c359ae5514ab2cae53f0555b544ddc59",
      "tree": "7336f8d8bb108b5fd2ba2b22f5894db13a660fe8",
      "parents": [
        "a2eedd4af19f40d9f92de3fd52ab3e922668748a"
      ],
      "author": {
        "name": "Nick Vatamaniuc",
        "email": "vatamane@gmail.com",
        "time": "Fri Jul 24 12:19:35 2026 -0400"
      },
      "committer": {
        "name": "Nick Vatamaniuc",
        "email": "nickva@users.noreply.github.com",
        "time": "Sat Jul 25 03:38:33 2026 -0400"
      },
      "message": "Handle empty ddocs in ddoc_features scanner plugin\n\nWe had too strong of an assert that design docs should not be empty (and to be\nuseful they shouldn\u0027t be) but if user did have some empty ddoc it would crash\nthe scanner plugin, so fix it to anticipate that case.\n"
    },
    {
      "commit": "a2eedd4af19f40d9f92de3fd52ab3e922668748a",
      "tree": "65d6c6bfc7b69c7312ab1f5b796131aa525dac1b",
      "parents": [
        "3ebff7dae9eea9c9a52d5e908629b6e799c0214a"
      ],
      "author": {
        "name": "Nick Vatamaniuc",
        "email": "vatamane@gmail.com",
        "time": "Wed Jul 15 12:06:31 2026 -0400"
      },
      "committer": {
        "name": "Nick Vatamaniuc",
        "email": "nickva@users.noreply.github.com",
        "time": "Fri Jul 24 02:34:58 2026 -0400"
      },
      "message": "Try to re-enable s390x and ppc64le\n\nPrevious failures were often from picking up ASF Jenkins generic workers with\n`s390x` and `ppc64le` labels. Those workers were often over-subscribed and\npretty flaky. To avoid that use different label that only our project would\nmatch.\n\ns390x seems to have a slower disk and times out on a disk heavy prop test, so\nlet\u0027s bump the timeout value there a bit.\n"
    },
    {
      "commit": "3ebff7dae9eea9c9a52d5e908629b6e799c0214a",
      "tree": "70132cc70937e010a2c1775b64f66a6eb88308fa",
      "parents": [
        "84aa91700c011a82e242b18e99e875d80cb57331"
      ],
      "author": {
        "name": "Nick Vatamaniuc",
        "email": "vatamane@gmail.com",
        "time": "Wed Jul 22 16:24:49 2026 -0400"
      },
      "committer": {
        "name": "Nick Vatamaniuc",
        "email": "nickva@users.noreply.github.com",
        "time": "Wed Jul 22 18:22:47 2026 -0400"
      },
      "message": "Fix all stream attachments for serialize_worker_startup\n\nIn #6071 we fixed multipart attachment uploads but we forgot to fix plain\nattachment uploads with `PUT /db/doc/attachment`. We should apply the same fix\nfor these too, otherwise they\u0027ll also buffer whole attachment in memory when\nsws\u003dtrue, defeating the whole purpose of incremental attachment streaming.\n\nAnd add a few parsing tests, especially testing how workers wait on others and\nhow the parser should behave if the attachment is too short\n"
    },
    {
      "commit": "84aa91700c011a82e242b18e99e875d80cb57331",
      "tree": "aed87d69741711878465003d9d065a9ae4713346",
      "parents": [
        "c4fd3366c3fcd073a92e8d14027fdd3fa7ad7c10"
      ],
      "author": {
        "name": "Nick Vatamaniuc",
        "email": "vatamane@gmail.com",
        "time": "Wed Jul 22 01:11:24 2026 -0400"
      },
      "committer": {
        "name": "Nick Vatamaniuc",
        "email": "nickva@users.noreply.github.com",
        "time": "Wed Jul 22 11:59:58 2026 -0400"
      },
      "message": "Fix multipart attachments with serialize_worker_startup\n\nPreviously, if a multipart parser reached an eof before the declared length, it\nstill let the writer wait and timeout (300s). This was especially noticed if\nusers toggled `serialize_worker_startup\u003dtrue`. Then, the first worker would\nbuffer all the data (another undesirable behavior) until it reached a premature\neof and then get stuck. Other workers wouldn\u0027t start either and the request\nwould eventually crash.\n\nHere we fix both issues:\n\n 1) If we detect serialize_worker_startup\u003dtrue then we switch back to the\n default parallel worker startup pattern. This how the MP parser was built to\n work. Otherwise it would buffer the whole attachment into memory until the\n first worker wasn\u0027t done and the others started. That defies the purpose of\n incremental attachment uploads. So to go with the grain of MP parser design we\n switch back to parallel worker startup.\n\n 2) Let writers which wait on an EOF exit instead of deadlocking until a\n timeout. Writer waits for more bytes when the stream already reached EOF is\n because the user uploaded less than the declared number of bytes (attachment\n is too short). In that case we exit normally and let the parser monitors fire\n with `\"attachment shorter than expected\"` error.\n\nReproducer for the issue:\n\n * start dev/run cluster with 3 nodes\n * `s:multicall(fun() -\u003e config:set(\"fabric\", \"serialize_worker_startup\",\"true\") end)`\n * curl -XPUT \u0027http://adm:pass@127.0.0.1:15984/mptest\u0027\n\nBefore PR:\n\n```\ncurl  --max-time 10 -XPUT \u0027http://adm:pass@127.0.0.1:15984/mptest/short\u0027 -H \u0027Content-Type: multipart/related;boundary\u003d\"abc123\"\u0027 --data-binary $\u0027--abc123\\r\\nContent-Type: application/json\\r\\n\\r\\n{\"_attachments\":{\"ohai\":{\"follows\":true,\"content_type\":\"text/plain\",\"length\": 4}}}\\r\\n--abc123\\r\\n\\r\\noha\\r\\n--abc123--\u0027\ncurl: (28) Operation timed out after 10005 milliseconds with 0 bytes received\n```\n\nAfter PR\n```\ncurl  --max-time 10 -X PUT \u0027http://adm:pass@127.0.0.1:15984/mptest/short\u0027 -H \u0027Content-Type: multipart/related;boundary\u003d\"abc123\"\u0027 --data-binary $\u0027--abc123\\r\\nContent-Type: application/json\\r\\n\\r\\n{\"_attachments\":{\"ohai\":{\"follows\":true,\"content_type\":\"text/plain\",\"length\": 4}}}\\r\\n--abc123\\r\\n\\r\\noha\\r\\n--abc123--\u0027\n{\"error\":\"bad_request\",\"reason\":\"attachment shorter than expected\"}\n```\n"
    },
    {
      "commit": "c4fd3366c3fcd073a92e8d14027fdd3fa7ad7c10",
      "tree": "3245a9a257aacc5f517bb7a51ac87d3fdeb21265",
      "parents": [
        "0ea4747403a1b4ba3b25d45a1827c5b67b1579b4"
      ],
      "author": {
        "name": "Nick Vatamaniuc",
        "email": "vatamane@gmail.com",
        "time": "Mon Jul 20 17:54:57 2026 -0400"
      },
      "committer": {
        "name": "Nick Vatamaniuc",
        "email": "nickva@users.noreply.github.com",
        "time": "Tue Jul 21 09:14:00 2026 -0400"
      },
      "message": "Supervisor-level replicator auth plugin callbacks\n\nAs discussed in the comments of the new IAM plugin in [1], it would be nice to\nhave a per-plugin supervisor-level context for each plugin. So, for example,\nthey can create some kind of a ETS cache table for their tokens. This is what\nwe implement here. The API is simple:\n\n  * `sup_initialize() -\u003e Ctx`\n  * `sup_cleanup(Ctx) -\u003e ok`\n\nThe APIs are optional to implement. The name pattern mirror the regular plugin\nAPI names: `initialize(...) -\u003e {ok, ..., Ctx}` and `cleanup(Ctx) -\u003e ok`\n\n[1] https://github.com/apache/couchdb/pull/6069\n"
    },
    {
      "commit": "0ea4747403a1b4ba3b25d45a1827c5b67b1579b4",
      "tree": "b156977590dc3b0fa141aa3e61b10827fb1a75eb",
      "parents": [
        "2eed4886d1853b97459ffd4f0c827e0cdd816a91",
        "307e4d9751165cd632153399129f0315ab08e116"
      ],
      "author": {
        "name": "Robert Newson",
        "email": "rnewson@apache.org",
        "time": "Mon Jul 20 21:32:14 2026 +0100"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Jul 20 21:32:14 2026 +0100"
      },
      "message": "Merge pull request #6063 from apache/custom-peer-header\n\nconfigurable request header for determining peer"
    },
    {
      "commit": "307e4d9751165cd632153399129f0315ab08e116",
      "tree": "b156977590dc3b0fa141aa3e61b10827fb1a75eb",
      "parents": [
        "2eed4886d1853b97459ffd4f0c827e0cdd816a91"
      ],
      "author": {
        "name": "Robert Newson",
        "email": "rnewson@apache.org",
        "time": "Thu Jul 02 16:24:02 2026 +0100"
      },
      "committer": {
        "name": "Robert Newson",
        "email": "rnewson@apache.org",
        "time": "Mon Jul 20 20:16:55 2026 +0100"
      },
      "message": "configurable request header for determining peer\n"
    },
    {
      "commit": "2eed4886d1853b97459ffd4f0c827e0cdd816a91",
      "tree": "ca07dcf740b90154a91826ff8ecd258d2b5253ce",
      "parents": [
        "d4067c4f9274b93a0f07dda6c5f75ab451858bcd"
      ],
      "author": {
        "name": "Sam Smith",
        "email": "sam@samsmith.xyz",
        "time": "Thu Jul 16 10:48:35 2026 +0100"
      },
      "committer": {
        "name": "Nick Vatamaniuc",
        "email": "nickva@users.noreply.github.com",
        "time": "Thu Jul 16 09:59:18 2026 -0400"
      },
      "message": "sq - update gauge in dec_count and inc_count\n"
    },
    {
      "commit": "d4067c4f9274b93a0f07dda6c5f75ab451858bcd",
      "tree": "645074b22bb39e16e9b220741e001f7a2e1170db",
      "parents": [
        "803542b6ddddb41d1c02a8c64a2f56212796e5e7"
      ],
      "author": {
        "name": "Sam Smith",
        "email": "sam@samsmith.xyz",
        "time": "Wed Jul 15 15:47:01 2026 +0100"
      },
      "committer": {
        "name": "Nick Vatamaniuc",
        "email": "nickva@users.noreply.github.com",
        "time": "Thu Jul 16 09:59:18 2026 -0400"
      },
      "message": "feat(couch): add process_count gauge to query server manager\n\nTrack the number of active query server processes to provide\nvisibility into resource usage. The gauge is updated when processes\nspawn/remove.\n"
    },
    {
      "commit": "803542b6ddddb41d1c02a8c64a2f56212796e5e7",
      "tree": "3a3cd4022b74c162d298e76983a36996813e4772",
      "parents": [
        "fd6959258a25236df557cdd9806bcf83d7fae4f8"
      ],
      "author": {
        "name": "nightcityblade",
        "email": "nightcityblade@gmail.com",
        "time": "Wed Jul 15 11:11:13 2026 +0800"
      },
      "committer": {
        "name": "Robert Newson",
        "email": "rnewson@apache.org",
        "time": "Wed Jul 15 10:15:32 2026 +0100"
      },
      "message": "docs: make Figure 6 revision label readable\n"
    },
    {
      "commit": "fd6959258a25236df557cdd9806bcf83d7fae4f8",
      "tree": "47fa451b1b6eb97f0da457132309baf613c873ee",
      "parents": [
        "c0cb1737dca40a4d070e00b0378c87785f06e5e8"
      ],
      "author": {
        "name": "nightcityblade",
        "email": "nightcityblade@gmail.com",
        "time": "Fri Jul 10 11:27:01 2026 +0800"
      },
      "committer": {
        "name": "Robert Newson",
        "email": "rnewson@apache.org",
        "time": "Wed Jul 15 10:15:32 2026 +0100"
      },
      "message": "docs: correct figure 6 revision label\n"
    },
    {
      "commit": "c0cb1737dca40a4d070e00b0378c87785f06e5e8",
      "tree": "87eb203cbb553b78853a75fadd680b7ff206e889",
      "parents": [
        "5575c4de1b99ec92a6d3cc21e63dc964de9bc8cf"
      ],
      "author": {
        "name": "Sam Smith",
        "email": "sam@samsmith.xyz",
        "time": "Mon Jul 13 14:02:10 2026 +0100"
      },
      "committer": {
        "name": "Nick Vatamaniuc",
        "email": "nickva@users.noreply.github.com",
        "time": "Tue Jul 14 12:23:29 2026 -0400"
      },
      "message": "feat(prometheus): add Clouseau, DB count, IOQ and Smoosh metrics\n\nExpose new Prometheus metrics for monitoring:\n- Clouseau search connectivity status\n- Total database count in cluster\n- IOQ active channels and request counts\n- Smoosh compaction job statistics (active/starting/waiting)\n\nImproves observability of core CouchDB subsystems.\n"
    },
    {
      "commit": "5575c4de1b99ec92a6d3cc21e63dc964de9bc8cf",
      "tree": "e32c4da571bebe388a9b71068da5637f3dd7e48a",
      "parents": [
        "b6dab673f060d47bbfbb89af6ee280a796ddaf6d",
        "519941c9c6cab111daa134901a62e70b47c9821e"
      ],
      "author": {
        "name": "Robert Newson",
        "email": "rnewson@apache.org",
        "time": "Tue Jul 14 06:47:49 2026 +0100"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Jul 14 06:47:49 2026 +0100"
      },
      "message": "Merge pull request #6067 from apache/nouveau-fix-batch\n\nNouveau fix batch"
    },
    {
      "commit": "519941c9c6cab111daa134901a62e70b47c9821e",
      "tree": "e32c4da571bebe388a9b71068da5637f3dd7e48a",
      "parents": [
        "7f6900ab796039f93aa95e3386e62375c43b89fe"
      ],
      "author": {
        "name": "Robert Newson",
        "email": "rnewson@apache.org",
        "time": "Mon Jul 13 22:55:03 2026 +0100"
      },
      "committer": {
        "name": "Ronny Berndt",
        "email": "ronny@apache.org",
        "time": "Tue Jul 14 06:19:05 2026 +0200"
      },
      "message": "fix typo in portuguese analyzer\n"
    },
    {
      "commit": "7f6900ab796039f93aa95e3386e62375c43b89fe",
      "tree": "eb460858e634840526eb4d490a31b2e047564f8c",
      "parents": [
        "b6dab673f060d47bbfbb89af6ee280a796ddaf6d"
      ],
      "author": {
        "name": "Robert Newson",
        "email": "rnewson@apache.org",
        "time": "Mon Jul 13 22:48:02 2026 +0100"
      },
      "committer": {
        "name": "Ronny Berndt",
        "email": "ronny@apache.org",
        "time": "Tue Jul 14 06:19:05 2026 +0200"
      },
      "message": "nouveau: remove unused classes\n"
    },
    {
      "commit": "b6dab673f060d47bbfbb89af6ee280a796ddaf6d",
      "tree": "095ee519f7aa3c3cbbf217cb14bebd0c8fc8268f",
      "parents": [
        "5fc7775459af469222edc5c60ef2a0a1ea2a1b33"
      ],
      "author": {
        "name": "Nick Vatamaniuc",
        "email": "vatamane@gmail.com",
        "time": "Mon Jul 13 16:25:22 2026 -0400"
      },
      "committer": {
        "name": "Nick Vatamaniuc",
        "email": "nickva@users.noreply.github.com",
        "time": "Mon Jul 13 18:37:27 2026 -0400"
      },
      "message": "Strengthen purge client existence tests\n\nPreviously, in some cases if we could not positively verify if a purge client\nexisted (say we got a timeout from a clustered read) we\u0027d assume the client\ndidn\u0027t exist, when in fact the safest thing is to assume the clients exists\nuntil we get a definite response it doesn\u0027t\n\nTo fix the issue we return `true` for client existence checks on unexpected\nerrors when before we defaulted to `false`.\n"
    },
    {
      "commit": "5fc7775459af469222edc5c60ef2a0a1ea2a1b33",
      "tree": "2d0ff16cbd8a244c5590b218000b1dd03bf6b5e0",
      "parents": [
        "4fcda34e58b37a94ff9bb7cb6bf347e4914c014b",
        "00e617b66080c0d7d664c12148037867984870a0"
      ],
      "author": {
        "name": "Robert Newson",
        "email": "rnewson@apache.org",
        "time": "Tue Jul 07 21:31:04 2026 +0100"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Jul 07 21:31:04 2026 +0100"
      },
      "message": "Merge pull request #6056 from apache/nouveau-verify-cacertfile-config\n\nnouveau: always use cacertfile if specified; explicit peer verification"
    },
    {
      "commit": "00e617b66080c0d7d664c12148037867984870a0",
      "tree": "2d0ff16cbd8a244c5590b218000b1dd03bf6b5e0",
      "parents": [
        "4fcda34e58b37a94ff9bb7cb6bf347e4914c014b"
      ],
      "author": {
        "name": "Robert Newson",
        "email": "rnewson@apache.org",
        "time": "Mon Jun 29 15:58:17 2026 +0100"
      },
      "committer": {
        "name": "Robert Newson",
        "email": "rnewson@apache.org",
        "time": "Tue Jul 07 20:42:53 2026 +0100"
      },
      "message": "nouveau: always use cacertfile if specified; explicit peer verification\n\nUnless client certificates are used the cacertfile setting is\nignored. There are legitimate reasons you might want to specify the\nallowed CA certificates without using client certificates, so always\nset this.\n\nErlang 26 and above uses verify_peer by default but it doesn\u0027t hurt to\nbe explicit. The new ssl_verify also allowes the ability to disable\npeer verification which might be useful in dev and testing\nenvironments.\n"
    },
    {
      "commit": "4fcda34e58b37a94ff9bb7cb6bf347e4914c014b",
      "tree": "63eee9352729daffb6fd5c7f72c305749fd57589",
      "parents": [
        "4218427b65ca5be0a658fe8a2f4ad3edfb001e60",
        "14c5c20ddfd3d354c42ed4d1baba0ad2ce25b382"
      ],
      "author": {
        "name": "Robert Newson",
        "email": "rnewson@apache.org",
        "time": "Tue Jul 07 20:42:10 2026 +0100"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Jul 07 20:42:10 2026 +0100"
      },
      "message": "Merge pull request #6061 from apache/jwtf-error-messages\n\nimprove JWT error messages"
    },
    {
      "commit": "14c5c20ddfd3d354c42ed4d1baba0ad2ce25b382",
      "tree": "63eee9352729daffb6fd5c7f72c305749fd57589",
      "parents": [
        "4218427b65ca5be0a658fe8a2f4ad3edfb001e60"
      ],
      "author": {
        "name": "Robert Newson",
        "email": "rnewson@apache.org",
        "time": "Tue Jul 07 19:35:25 2026 +0100"
      },
      "committer": {
        "name": "Robert Newson",
        "email": "rnewson@apache.org",
        "time": "Tue Jul 07 19:35:25 2026 +0100"
      },
      "message": "improve JWT error messages\n"
    },
    {
      "commit": "4218427b65ca5be0a658fe8a2f4ad3edfb001e60",
      "tree": "e401e881cea424a905852a416cbaa666584aaf5e",
      "parents": [
        "6de9f6bb236c7da0a5eb3f2531381b87b4cb8efc",
        "3b3e55c52554b3d011849b0d2a5d79ee494cd9d9"
      ],
      "author": {
        "name": "Robert Newson",
        "email": "rnewson@apache.org",
        "time": "Wed Jul 01 07:44:11 2026 +0100"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Jul 01 07:44:11 2026 +0100"
      },
      "message": "Merge pull request #6058 from apache/jiffy-2.0.2\n\nUpdate jiffy to 2.0.2"
    },
    {
      "commit": "3b3e55c52554b3d011849b0d2a5d79ee494cd9d9",
      "tree": "e401e881cea424a905852a416cbaa666584aaf5e",
      "parents": [
        "6de9f6bb236c7da0a5eb3f2531381b87b4cb8efc"
      ],
      "author": {
        "name": "Nick Vatamaniuc",
        "email": "vatamane@apache.org",
        "time": "Tue Jun 30 20:27:02 2026 -0400"
      },
      "committer": {
        "name": "Nick Vatamaniuc",
        "email": "vatamane@apache.org",
        "time": "Tue Jun 30 20:27:02 2026 -0400"
      },
      "message": "Update jiffy to 2.0.2\n\n* Reduce encoder memory allocations https://github.com/davisp/jiffy/pull/301\n* Encode maps directly without an intermediate EJSON proplist  https://github.com/davisp/jiffy/pull/302\n* Fix out-of-bounds heap write in string encoder https://github.com/davisp/jiffy/pull/304\n"
    },
    {
      "commit": "6de9f6bb236c7da0a5eb3f2531381b87b4cb8efc",
      "tree": "bcc12abaddd9a268e33e6373b9db84f7cb11256c",
      "parents": [
        "8cec0e5e58504f79b4a4ff25a37b7b870e67dd12"
      ],
      "author": {
        "name": "Artúr Poór",
        "email": "gombocarti@gmail.com",
        "time": "Mon Jun 29 17:55:32 2026 +0200"
      },
      "committer": {
        "name": "Robert Newson",
        "email": "rnewson@apache.org",
        "time": "Tue Jun 30 09:40:55 2026 +0100"
      },
      "message": "Fix javascript for loop in index function\n"
    },
    {
      "commit": "8cec0e5e58504f79b4a4ff25a37b7b870e67dd12",
      "tree": "75d69d444dea6e4a8636cc77318c34b20028de66",
      "parents": [
        "eb89864dc5ccb25c9899fe7be5ded860237d3b45"
      ],
      "author": {
        "name": "Robert Newson",
        "email": "rnewson@apache.org",
        "time": "Mon Jun 29 14:15:47 2026 +0100"
      },
      "committer": {
        "name": "Robert Newson",
        "email": "rnewson@apache.org",
        "time": "Mon Jun 29 20:16:54 2026 +0100"
      },
      "message": "clarify lucene_version handling\n\ncloses: https://github.com/apache/couchdb/issues/6054\n"
    },
    {
      "commit": "eb89864dc5ccb25c9899fe7be5ded860237d3b45",
      "tree": "c11236aa93558f3621f1a78588c59656db6c78bc",
      "parents": [
        "2195612ae035c5e3436d5fb0a88b60bfa6ef15d9"
      ],
      "author": {
        "name": "Nick Vatamaniuc",
        "email": "vatamane@gmail.com",
        "time": "Fri Jun 26 16:30:49 2026 -0400"
      },
      "committer": {
        "name": "Nick Vatamaniuc",
        "email": "nickva@users.noreply.github.com",
        "time": "Mon Jun 29 13:53:48 2026 -0400"
      },
      "message": "Speed up views with ICU sort keys\n\nIn the previous commit we implemented sort keys and here is where we\u0027re using\nthem to optimize views.\n\nOn coordinators there are two separate places we optimize: the reduce views and\nmap-only views. They are implemented somewhat differently. For both cases we\nwin by generating the sort key once per row as it comes in, pay the CPU price\nonce, and then when we merge sort it or insert it into the gb_tree when\nreducing. After that we only do Erlang comparisons, avoiding expensive repeated\nICU pair-wise calls.\n\nFor both map and reduce views use a common buf_key/2 function to generate the\nsort key or a raw key, depending on the user\u0027s collator setting.\n\nThe map-only change is relatively straight-forward. We just use `{{buf_key,\nId}, ROw}` as the sortable rows and keep the same merge-sort behavior.\n\nFor reduce views we actually get a nice simplification. Previously, we had a\nmap keyed by ejson key and search over it (order O(N)) on every emit. There\nwere two distinct steps: 1) find the lowest key 2) find any other keys\ncollating equal to it. We don\u0027t have to do that any longer, with gb_trees use\nthe buf_key as the key and simply take the small (or greatest key).\n\nOn a quick benchmark of 100k docs with Q\u003d8 saw a decent speedup:\n```\n  reduce (group level\u003d3) : 5974ms -\u003e 3294ms  (1.8x)\n  maps                   : 2699ms -\u003e 1917ms  (1.4x)\n```\n"
    },
    {
      "commit": "2195612ae035c5e3436d5fb0a88b60bfa6ef15d9",
      "tree": "323002fa78a4e15cebce178db941882bb3834548",
      "parents": [
        "c8365b05370cf3b9e77a619291a5d41b5ad3b0de"
      ],
      "author": {
        "name": "Nick Vatamaniuc",
        "email": "vatamane@gmail.com",
        "time": "Wed Jun 24 16:40:24 2026 -0400"
      },
      "committer": {
        "name": "Nick Vatamaniuc",
        "email": "nickva@users.noreply.github.com",
        "time": "Mon Jun 29 13:53:48 2026 -0400"
      },
      "message": "Sort key libicu NIF\n\nAdd a sort key libicu NIF function. A sort key is an opaque binary\nrepresentation generated by libicu from a key, which then can then be compared\ndirectly against other sort keys to produce an equivalent collation order as\ncalling the pair-wise comparison libicu function.\n\nThe idea to use sort keys in the fabric view row \"merge head\" structure, where\nwe merge together streaming rows from multiple workers. When we do that we keep\neither a sorted list (for map-only views) and then do an insertion sort step\nand take the minimum, or we keep the rows in key/value structure for reduce\nviews and find the minimum key and its grouped values. In either case we can\nreduce the number of libicu compare(a,b) calls from O(K^2) to just O(K) sort\nkey generating calls and since libicu calls are not cheap, it worth adding an\nextra NIF calls just for it.\n\nAs a side note: we\u0027ve actually implemented this once during the now abandonned\nCouchDB 4.0 /w FoundationDB backed attempt, there we stored sort key in the\ndatabase, which libicu workers do not recommend doing. Here we\u0027re planning on\nusing in memory only on the coordinator.\n\nhttps://unicode-org.github.io/icu/userguide/collation/concepts#sortkeys-vs-comparison\n"
    },
    {
      "commit": "c8365b05370cf3b9e77a619291a5d41b5ad3b0de",
      "tree": "f408db023038c85503c98d1d9a28538f9c3c9d97",
      "parents": [
        "333ae93d030bab12f07eafa426055d93fe8792c9"
      ],
      "author": {
        "name": "Nick Vatamaniuc",
        "email": "vatamane@gmail.com",
        "time": "Wed Jun 24 02:57:16 2026 -0400"
      },
      "committer": {
        "name": "Nick Vatamaniuc",
        "email": "nickva@users.noreply.github.com",
        "time": "Wed Jun 24 10:05:00 2026 -0400"
      },
      "message": "Remove old libicu max collation sentinel hack\n\nFor old libicu versions \u003c 59 on RHEL 6 and 7 we had to add a hack in the NIF\ndriver to handle the max sortable sentinel `\u003c\u003c255,255,255,255\u003e\u003e` [1]. We don\u0027t\nsupport those versions any longer, and since libicu version 59 the library will\nautomatically sort those as the highest values [2], so we can clean up our\ncollator NIF.\n\n[1] https://github.com/apache/couchdb/pull/3491\n\n[2] https://www.unicode.org/reports/tr35/tr35-collation.html#tailored-noncharacter-weights\n\n\u003e U+FFFF: This code point is tailored to have a primary weight higher than all\nother characters. This allows the reliable specification of a range, such as\n“Sch” ≤ X ≤ “Sch\\uFFFF”, to include all strings starting with \"sch\" or\nequivalent.\n"
    },
    {
      "commit": "333ae93d030bab12f07eafa426055d93fe8792c9",
      "tree": "68d30c4f735c072f9b655727e169b16e67b6733a",
      "parents": [
        "65cd52c96bdf6f35a4a2925ff0ebbc29b6583d93",
        "4b6cb03d7e217a8529a6b43e3713727aa6b37099"
      ],
      "author": {
        "name": "Jan Lehnardt",
        "email": "jan@apache.org",
        "time": "Wed Jun 24 14:00:28 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Jun 24 14:00:28 2026 +0200"
      },
      "message": "Merge pull request #6049 from apache/doc/rhel-10\n\ndocs: clarify and simplify RHEL10 install instructions"
    },
    {
      "commit": "4b6cb03d7e217a8529a6b43e3713727aa6b37099",
      "tree": "68d30c4f735c072f9b655727e169b16e67b6733a",
      "parents": [
        "65cd52c96bdf6f35a4a2925ff0ebbc29b6583d93"
      ],
      "author": {
        "name": "Jan Lehnardt",
        "email": "jan@apache.org",
        "time": "Wed Jun 24 13:28:18 2026 +0200"
      },
      "committer": {
        "name": "Jan Lehnardt",
        "email": "jan@apache.org",
        "time": "Wed Jun 24 13:30:28 2026 +0200"
      },
      "message": "docs: clarify and simplify RHEL10 install instructions\n\n- RHEL10 EPEL no longer ships SpiderMonkey and as a result our\n  packages are QuickJS-only.\n- Hence there is no need to install EPEL at all, as the only\n  remaining dependency ICU is in the regular catalogue.\n- And dnf tooling was improved so adding a third-party repo is\n  supported natively and no separate tooling is required.\n- Hence: only two commands to install CouchDB needed! \\o/\n"
    },
    {
      "commit": "65cd52c96bdf6f35a4a2925ff0ebbc29b6583d93",
      "tree": "162d1b241fe9ac3c041b8cff34d098555659d35e",
      "parents": [
        "fc6bd4f59cc1fa48cab8f63638a82b99277b548d"
      ],
      "author": {
        "name": "Nick Vatamaniuc",
        "email": "vatamane@gmail.com",
        "time": "Sun Jun 21 00:43:41 2026 -0400"
      },
      "committer": {
        "name": "Nick Vatamaniuc",
        "email": "nickva@users.noreply.github.com",
        "time": "Mon Jun 22 09:44:30 2026 -0400"
      },
      "message": "Speed-up reduce view merging in fabric\n\nPreviously, `find_next_key/5` reduce collector [1] effectively ran\n`hd(lists:sort(...))` to get the next key. It was spending time sorting, then\nthrowing everything away except the head. For the next row, it was sorting\nagain, throwing everything away, and taking only the head, and so on...\nNeedless to say, that\u0027s wasteful and we should simply find the minimum and\nreturn that.\n\nAs an another optimization replace the dict with a map. Maps are more\nefficient and generally faster.\n\nAlso, add extra unit tests asserting ICU collation behavior actually takes\nplace. In a few cases explicitly assert that the new behavior is the same as\nthe previous `hd(lists:sort(...))` behavior.\n\nTo benchmark used a simple reduce view with a built-in _count reducer [2]. For\n100k docs, Q\u003d8 this optimization leads to an ~2x speedup in view querying.\nTheoretically it would be an O(n log n) -\u003e O(n) speedup.\n\nPR\n\n```\n./reduce_group_bench.py --ndocs 100000 --q 8 --reps 7\ndb\u003dreduce_group_bench q\u003d8 n\u003d1 ndocs\u003d100000 group\u003dtrue\nloading...\n  loaded 100000 docs in 4.4s\nbuilding index...\n  built in 4.5s\ntiming group\u003dtrue query x7...\n  rows\u003d100000\n  min\u003d5644.0ms  median\u003d5786.6ms  max\u003d6108.0ms\n```\n\nMAIN\n\n```\n ./reduce_group_bench.py --ndocs 100000 --q 8 --reps 7\ndb\u003dreduce_group_bench q\u003d8 n\u003d1 ndocs\u003d100000 group\u003dtrue\nloading...\n  loaded 100000 docs in 4.5s\nbuilding index...\n  built in 4.3s\ntiming group\u003dtrue query x7...\n  rows\u003d100000\n  min\u003d10910.8ms  median\u003d11212.5ms  max\u003d11627.4ms\n```\n\n[1] Reduce collector buffers rows from workers and keys them by the view key.\nFor each row it emits it 1) finds the next key 2) takes all the rows that\ncollate equal to it. This optimization will only improve reduce views\n\n[2] https://gist.github.com/nickva/cc0a3fb296be965e014eec8c484aa8a5\n"
    },
    {
      "commit": "fc6bd4f59cc1fa48cab8f63638a82b99277b548d",
      "tree": "9de11211d38c13f76537d5a92a1f86d904a40de6",
      "parents": [
        "164aabae9daa936b0d9e130180a01f6d3e51792f",
        "ba6cd1787fd2b3dc68ed14ddead67b12671fe96a"
      ],
      "author": {
        "name": "Jan Lehnardt",
        "email": "jan@apache.org",
        "time": "Sun Jun 21 15:38:16 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sun Jun 21 15:38:16 2026 +0200"
      },
      "message": "Merge pull request #6047 from apache/doc/rhel-10\n\ndoc: update RHEL10 instructions"
    },
    {
      "commit": "ba6cd1787fd2b3dc68ed14ddead67b12671fe96a",
      "tree": "9de11211d38c13f76537d5a92a1f86d904a40de6",
      "parents": [
        "164aabae9daa936b0d9e130180a01f6d3e51792f"
      ],
      "author": {
        "name": "Jan Lehnardt",
        "email": "jan@apache.org",
        "time": "Sun Jun 21 13:18:28 2026 +0200"
      },
      "committer": {
        "name": "Jan Lehnardt",
        "email": "jan@apache.org",
        "time": "Sun Jun 21 15:35:52 2026 +0200"
      },
      "message": "doc: update RHEL10 instructions\n"
    },
    {
      "commit": "164aabae9daa936b0d9e130180a01f6d3e51792f",
      "tree": "8cd7459854c51f47a922682b22f16fd628597af1",
      "parents": [
        "80385b6c431f7b49df31240076334bd1dd9436b6"
      ],
      "author": {
        "name": "Nick Vatamaniuc",
        "email": "vatamane@gmail.com",
        "time": "Fri Jun 19 11:19:24 2026 -0400"
      },
      "committer": {
        "name": "Nick Vatamaniuc",
        "email": "nickva@users.noreply.github.com",
        "time": "Fri Jun 19 13:18:06 2026 -0400"
      },
      "message": "Fix invalid revisions function_clause\n\nPreviously, invalid revisions for `_missing_revs`, `_revs_diff` and likely\n`_purge` could trigger a function clause [1]. Instead since we\u0027re letting user\nprovided values in there we should throw a proper \"bad request\" exception.\n\n[1]\n```\nPOST /db_foo/_missing_revs\n\n{\n  \"test_doc_001\": [\"1-ad7c8ee69b8215bd0a0062732e9b2f59\"],\n  \"_deleted\": true,\n  \"new_edits\": true\n}\n\nHTTP/2 500 Internal Server Error\n{\"error\":\"unknown_error\",\"reason\":\"function_clause\",\"ref\":4294547805}\n```\n"
    },
    {
      "commit": "80385b6c431f7b49df31240076334bd1dd9436b6",
      "tree": "626d477f714ca9a0403fd74d9c5d891aeb589568",
      "parents": [
        "205d4f385bd595cf4eceffa5773336d2050719ea"
      ],
      "author": {
        "name": "Ronny Berndt",
        "email": "ronny@apache.org",
        "time": "Fri Jun 19 15:21:48 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Jun 19 15:21:48 2026 +0200"
      },
      "message": "docs: Hint for CouchDB 3.5.2.1 (#6044)"
    },
    {
      "commit": "205d4f385bd595cf4eceffa5773336d2050719ea",
      "tree": "d6eaf0c8c8e77073cd1750f649583a51a0ded662",
      "parents": [
        "e7098a281762e524b9a7172e7240fe1c1b9f49cc"
      ],
      "author": {
        "name": "Nick Vatamaniuc",
        "email": "vatamane@gmail.com",
        "time": "Fri Jun 19 00:51:18 2026 -0400"
      },
      "committer": {
        "name": "Nick Vatamaniuc",
        "email": "nickva@users.noreply.github.com",
        "time": "Fri Jun 19 02:33:24 2026 -0400"
      },
      "message": "Fix maintenance mode function_clause for _time_seq\n\nPreviously, when fetching the `_time_seq` histogram with one node in mm we\ncould get a function_clause error as show here: [0]\n\n`_time_seq` and a few other operations use `all` as fabric ring option. When\nusing that option the accumulator used by fabric_ring uses a simplified 2-tuple\nshape `{Shard, Result}` as opposed to a 3-tuple `{Range, Shard, Result}` used\nin most other cases [1]. Because of that when checking if progress is possible\nwe didn\u0027t correctly handle the case of 2-tuples and always expected a 3-tuple\nformat.\n\nThe fix is to expect a 2-tuple and 3-tuple and handle both.\n\n[0]\n ```\n function_clause#012 [\n  \u003c\u003c\"fabric_ring:-range_bounds/2-fun-0-/1 L274\"\u003e\u003e,\n  \u003c\u003c\"lists:map/2 L2077\"\u003e\u003e,\n  \u003c\u003c\"fabric_ring:range_bounds/2 L274\"\u003e\u003e,\n  \u003c\u003c\"fabric_ring:handle_error/4 L80\"\u003e\u003e,\n  \u003c\u003c\"fabric_time_seq:histogram_handle_message/3 L101\"\u003e\u003e\n  ...\n]\n```\n\n[1] The reason for both is a 2-tuple and 3-tuple is that in the default case we\ncare to record how many responses arrived per range interval and also\n`mem3_util:get_ring/3` works with ranges only. For `all` or `{any, ...}`\noptions we don\u0027t really need to track per range results, so we keep the\naccumulator simpler a bit.\n"
    },
    {
      "commit": "e7098a281762e524b9a7172e7240fe1c1b9f49cc",
      "tree": "9ebc43a6b9768c9e274177de54c46a542b71474a",
      "parents": [
        "e767f6f77b86c9d6a2cd26fadb195448f915d24c"
      ],
      "author": {
        "name": "Robert Newson",
        "email": "rnewson@apache.org",
        "time": "Thu Jun 18 16:49:54 2026 +0100"
      },
      "committer": {
        "name": "Nick Vatamaniuc",
        "email": "nickva@users.noreply.github.com",
        "time": "Thu Jun 18 13:49:39 2026 -0400"
      },
      "message": "monitor spawned process for crash in test\n"
    },
    {
      "commit": "e767f6f77b86c9d6a2cd26fadb195448f915d24c",
      "tree": "d654010c8d68d454ad090409dee2a9ee8b12ebde",
      "parents": [
        "8e87d2437c76a07e5e3f8850cafbd2f2d84b9eaf"
      ],
      "author": {
        "name": "Nick Vatamaniuc",
        "email": "vatamane@gmail.com",
        "time": "Mon Jun 15 23:57:25 2026 -0400"
      },
      "committer": {
        "name": "Nick Vatamaniuc",
        "email": "nickva@users.noreply.github.com",
        "time": "Wed Jun 17 14:36:15 2026 -0400"
      },
      "message": "Speed up bulk doc updates\n\nPreviously in `fabric_doc_update` we used a dict keyed by the whole `#doc{}`\nrecord. Updating a large batch meant spening a decent amount of CPU time\nrepeatedly hashing the document bodies. To avoid that we use small and\nlightweight integers as key and while at it, also switch to use maps instead of\ndicts.\n\nA few more details on the two optimizations\n\n1) Use a lightweight integer tag to match and index documents instead of using\ntheir whole `#doc{}` records Using `#doc{}` as a key means applying the\n`phash/2` function to it, which, in turn, traverses the whole term to produce\nthe hash slot number for the dict implementation\nhttps://github.com/erlang/otp/blob/OTP-29.0.2/lib/stdlib/src/dict.erl#L676. A\nseemingly obvious choice to use might be a the DocId, however in a batch we can\nhave duplicate DocIds so that won\u0027t work. So we borrow an already used pattern\nin couch_db local doc updater which tags docs in a batch with the `tag` field\nin the `meta` proplist. This coordinator tag lives only in the coordinator we\nstrip away before sending the data to workers or returning it.\n\n2) Use a map instead of a dict. This one is a no-brainer. A map scales better\nand uses an internal C based structures. Dict is as just phashes of tuples\nessentially\n\nI benchmarked lazily with the built-in fabric bench and at last on my laptop\nthe difference is noticeable for the default 1000 doc batches. I ran the\nbenchmarks 3 times alternating between main and PR code.\n\nEnvironment\n----\n```\nfabric_bench:go().\n *** Parameters\n * batch_size       : 1000\n * doc_size         : medium\n * docs             : 100000\n * individual_docs  : 1000\n * n                : default\n * q                : default\n\n *** Environment\n * Nodes        : 1\n * Bench ver.   : 1\n * N            : 1\n * Q            : 2\n * OS           : unix/darwin\n * Couch ver.   : 3.5.2-25b1b9a\n * Couch git sha: 25b1b9a\n * VM details   : Erlang/OTP 27 [erts-15.2.7.9] [source] [64-bit] [smp:12:12]\n * [ds:12:12:16] [async-threads:1]\n```\n\nMain\n----\n```\n *** Inserting 100000 docs\n * Add 100000 docs, ok:100/accepted:0     (Hz):     440\n * Get random doc 100000X                 (Hz):    1600\n * All docs                               (Hz):   49000\n * All docs w/ include_docs               (Hz):    3900\n * Changes                                (Hz):   24000\n * Single doc updates 1000X               (Hz):     280\n * Time to run all benchmarks            (sec):     300\n\n *** Inserting 100000 docs\n * Add 100000 docs, ok:100/accepted:0     (Hz):     440\n * Get random doc 100000X                 (Hz):    1600\n * All docs                               (Hz):   46000\n * All docs w/ include_docs               (Hz):    3900\n * Changes                                (Hz):   16000\n * Single doc updates 1000X               (Hz):     290\n * Time to run all benchmarks            (sec):     301\n\n *** Inserting 100000 docs\n * Add 100000 docs, ok:100/accepted:0     (Hz):     460\n * Get random doc 100000X                 (Hz):    1700\n * All docs                               (Hz):   48000\n * All docs w/ include_docs               (Hz):    3900\n * Changes                                (Hz):   21000\n * Single doc updates 1000X               (Hz):     300\n * Time to run all benchmarks            (sec):     288\n```\n\nPR\n---\n\n```\n *** Inserting 100000 docs\n * Add 100000 docs, ok:100/accepted:0     (Hz):     540\n * Get random doc 100000X                 (Hz):    1600\n * All docs                               (Hz):   49000\n * All docs w/ include_docs               (Hz):    3900\n * Changes                                (Hz):   25000\n * Single doc updates 1000X               (Hz):     290\n * Time to run all benchmarks            (sec):     257\n\n *** Inserting 100000 docs\n * Add 100000 docs, ok:100/accepted:0     (Hz):     550\n * Get random doc 100000X                 (Hz):    1700\n * All docs                               (Hz):   45000\n * All docs w/ include_docs               (Hz):    3900\n * Changes                                (Hz):   22000\n * Single doc updates 1000X               (Hz):     300\n * Time to run all benchmarks            (sec):     253\n\n *** Inserting 100000 docs\n * Add 100000 docs, ok:100/accepted:0     (Hz):     560\n * Get random doc 100000X                 (Hz):    1600\n * All docs                               (Hz):   46000\n * All docs w/ include_docs               (Hz):    4000\n * Changes                                (Hz):   29000\n * Single doc updates 1000X               (Hz):     300\n * Time to run all benchmarks            (sec):     249\n```\n\nIf we approximate it\u0027s about 20% or so.\n"
    },
    {
      "commit": "8e87d2437c76a07e5e3f8850cafbd2f2d84b9eaf",
      "tree": "d8c4e023df99ef1c986a46daa7a3d8af74b46cbe",
      "parents": [
        "25b1b9a22d9bc6a98c1f011cd20de3f3bfeec40b"
      ],
      "author": {
        "name": "Nick Vatamaniuc",
        "email": "vatamane@gmail.com",
        "time": "Tue Jun 16 16:05:12 2026 -0400"
      },
      "committer": {
        "name": "Nick Vatamaniuc",
        "email": "nickva@users.noreply.github.com",
        "time": "Tue Jun 16 18:10:23 2026 -0400"
      },
      "message": "Fix replication job rewinds\n\nThis is due to https://github.com/apache/couchdb/pull/5869 (Faster selector\nexecution by pre-parsing fields) where normalized form changed which results in\nall the replication jobs with selector to change their IDs and rewind.\n\nTo fix, bring back the binary dotted format.\n"
    },
    {
      "commit": "25b1b9a22d9bc6a98c1f011cd20de3f3bfeec40b",
      "tree": "a6d678c8a72cafb6244abcf83ab92cbff78aaaf5",
      "parents": [
        "e9872a353625598ab2f28747ee1ee7b45f0d0850"
      ],
      "author": {
        "name": "Nick Vatamaniuc",
        "email": "vatamane@gmail.com",
        "time": "Wed Jun 10 17:29:07 2026 -0400"
      },
      "committer": {
        "name": "Nick Vatamaniuc",
        "email": "nickva@users.noreply.github.com",
        "time": "Mon Jun 15 13:14:00 2026 -0400"
      },
      "message": "Improve document grouping in fabric_doc_update\n\nThe idea of doc/shard grouping and rotation was that different databases would\nstart their workers on different copies, spread those uniformly and\nconsistently by database and range.\n\nHowever, the order of entries were actually dependent on `dict:to_list/1`\ninternals. So, if `dict` was changed to return sorted items, like for instance\nmaps do, we\u0027d end up suddenly breaking the supposedly randomized spread (I\nfound this out by actually trying to use a map there instead of a dict).\n\nTo fix this, make the ordering explicit. Group the entries first, then order\neach range\u0027s group by the unified `mem3:owners/3` membership order, so the\nfirst copy of each range lands on the owner node, consistent with \"Unify\nmembership hashes\", and the result no longer depends on dict internals at all.\n\nWhile at it make it so we don\u0027t have to duplicate the main rotate function in\ntests and use the actual function we intend to test.\n"
    },
    {
      "commit": "e9872a353625598ab2f28747ee1ee7b45f0d0850",
      "tree": "9b09c9317def40eaf6d919c2a81b0cfbedf68c04",
      "parents": [
        "5a8d31eeee55ae7aef2bae01de4b75d5cbb852be"
      ],
      "author": {
        "name": "Nick Vatamaniuc",
        "email": "vatamane@apache.org",
        "time": "Sun Jun 14 10:38:43 2026 -0400"
      },
      "committer": {
        "name": "Nick Vatamaniuc",
        "email": "nickva@users.noreply.github.com",
        "time": "Sun Jun 14 13:38:27 2026 -0400"
      },
      "message": "Make OTP 27 the minimum OTP version\n\nOTP 27-29 are aready the only versions tested in CI so we don\u0027t test\n26 any longer and it\u0027s gone out of support.\n\nWe can take advantage of OTP 27+ with some of these features:\n\n* Tripple quotes strings\n\n```\n    J \u003d \"\"\"\n        {\"a\":\"b\"}\n        \"\"\"\n```\n\nNice for json blobs\n\n* Sigils. Nice for binaries.\n\n```\nB \u003d ~\"a binary\"\n```\n\n* `maybe` is always enabled\n\n* New json module. Jiffy is faster but for small and quick command\n  line scripts it may be nice to not have to load a NIF\n\n* Process labels\n\n`proc_lib:set_label({client_proc, IP})`\n\nThen we can filter by that and or see them in observer and other debug tools.\n\n* ets:first_lookup/ets:next_lookup\n\nTraverse ets tables easier\n"
    },
    {
      "commit": "5a8d31eeee55ae7aef2bae01de4b75d5cbb852be",
      "tree": "1f436ae3080f3907dd860424f31f9a50928d8f72",
      "parents": [
        "4ee0561afb6995782cc0fa47e3ef083c76333e24"
      ],
      "author": {
        "name": "Ronny Berndt",
        "email": "ronny@apache.org",
        "time": "Sun Jun 14 13:25:25 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sun Jun 14 13:25:25 2026 +0200"
      },
      "message": "ci: Use OTP27 as minimum version (#6036)"
    },
    {
      "commit": "4ee0561afb6995782cc0fa47e3ef083c76333e24",
      "tree": "fc09aeb1750bbe27f310cc48c23c7ba9db5cab4c",
      "parents": [
        "6cf3c7d33e80ab80b526516eac9c55bd34eb77fb"
      ],
      "author": {
        "name": "Nick Vatamaniuc",
        "email": "vatamane@gmail.com",
        "time": "Sat Jun 13 17:30:10 2026 -0400"
      },
      "committer": {
        "name": "Nick Vatamaniuc",
        "email": "nickva@users.noreply.github.com",
        "time": "Sun Jun 14 01:29:58 2026 -0400"
      },
      "message": "Update jiffy, gun and ibrowse\n\nJiffy and ibrowse have OTP 29 support\n\nGun has some security and other fixes (some in cowlib)\n"
    },
    {
      "commit": "6cf3c7d33e80ab80b526516eac9c55bd34eb77fb",
      "tree": "807bb287810a33c503ef34dc70b1bf139ae4dc01",
      "parents": [
        "2b117584198aa60b61822125742b2ba68883daef"
      ],
      "author": {
        "name": "Ronny Berndt",
        "email": "ronny@apache.org",
        "time": "Sat Jun 13 00:25:11 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sat Jun 13 00:25:11 2026 +0200"
      },
      "message": "Update snappy dependency to CouchDB-1.0.11 (#6035)\n\n- replaced deprecated catch-statement for OTP29\n- simplified nif loading code"
    },
    {
      "commit": "2b117584198aa60b61822125742b2ba68883daef",
      "tree": "68cfd526cd9bdd1a25608b975982f0cc76110d94",
      "parents": [
        "f40dc3985ef80707f00d2e3d62ebac27807a8c0d"
      ],
      "author": {
        "name": "Nick Vatamaniuc",
        "email": "vatamane@gmail.com",
        "time": "Thu Jun 11 19:27:04 2026 -0400"
      },
      "committer": {
        "name": "Nick Vatamaniuc",
        "email": "nickva@users.noreply.github.com",
        "time": "Fri Jun 12 09:03:30 2026 -0400"
      },
      "message": "Unify membership hashes\n\nPreviously replicator and fabric_doc_updater used different membership\nalgorithms to consistently pick a first node order from a range of shard copies.\nUnifying them simplifies the code and also fixes issues like #6029.\n\nWhile at it move away from crc32 and used a new phash2/1 function. We don\u0027t\nhave to create a term_to_binary for it first as it can take regular Erlang\nterms.\n\n(Thanks to Robert Newson for the original idea to do this)\n\nFix #6029\n"
    },
    {
      "commit": "f40dc3985ef80707f00d2e3d62ebac27807a8c0d",
      "tree": "b19910a4e89c2baa9be17eec97caeaa63e1ae5ea",
      "parents": [
        "c8adf714f3fe1cda2bd60d13e6d5e3a83a9b5bb9",
        "37a4bb2e5b1732fde8fa0a831966c85be29e6cd8"
      ],
      "author": {
        "name": "Robert Newson",
        "email": "rnewson@apache.org",
        "time": "Thu Jun 11 16:58:56 2026 +0100"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Jun 11 16:58:56 2026 +0100"
      },
      "message": "Merge pull request #6033 from apache/couch-file-test-failure\n\ntighten num_calls assertions"
    },
    {
      "commit": "37a4bb2e5b1732fde8fa0a831966c85be29e6cd8",
      "tree": "b19910a4e89c2baa9be17eec97caeaa63e1ae5ea",
      "parents": [
        "c8adf714f3fe1cda2bd60d13e6d5e3a83a9b5bb9"
      ],
      "author": {
        "name": "Robert Newson",
        "email": "rnewson@apache.org",
        "time": "Thu Jun 11 14:30:04 2026 +0100"
      },
      "committer": {
        "name": "Robert Newson",
        "email": "rnewson@apache.org",
        "time": "Thu Jun 11 14:30:06 2026 +0100"
      },
      "message": "tighten num_calls assertions\n\na concurrent couch_log event writes to a different file and counts\nas a file:write call. tighten our assertions to only calls by the Fd\nwe care about.\n"
    },
    {
      "commit": "c8adf714f3fe1cda2bd60d13e6d5e3a83a9b5bb9",
      "tree": "82c16cb07d80ee0dd76c6751575df56225d408c1",
      "parents": [
        "e58ef7c8878874b685be32d3ee6c4002ae1981d8"
      ],
      "author": {
        "name": "Nick Vatamaniuc",
        "email": "vatamane@gmail.com",
        "time": "Tue Jun 09 01:35:18 2026 -0400"
      },
      "committer": {
        "name": "Nick Vatamaniuc",
        "email": "nickva@users.noreply.github.com",
        "time": "Tue Jun 09 14:19:02 2026 -0400"
      },
      "message": "Basic zstd compression\n\nThis is using the built-in zstd API from Erlang/OTP 28+. For 26 and 27 it falls\nback to `deflate`. Otherwise it\u0027s not that different than deflate and snappy\nwhich we already support.\n\nAn interesting feature of zstd is to use dictionaries. This PR doesn\u0027t do it,\nbut it sets up a shim `couch_zstd` module where that could plug-in eventually.\nThe idea is to train a dictionary it based on document bodies for each database\nbefore compaction and then saving the dictionary. zstd as is in Erlang/OTP\ndoesn\u0027t expose a trainign API but we can still use a concatenative/raw\ndictionary:\n\n```erlang\n\n\u003e Dict \u003d ~\"{\\\"type\\\":\\\"foo\\\",\\\"bar\\\":1,\\\"baz\\\":\\\"a\\\"}\".\n\u003c\u003c\"{\\\"type\\\":\\\"foo\\\",\\\"bar\\\":1,\\\"baz\\\":\\\"a\\\"}\"\u003e\u003e\n\n\u003e {ok, C} \u003d zstd:dict(compress, Dict).\n{ok,{cdict,#Ref\u003c0.4075923125.4131520536.31325\u003e}}\n\n\u003e Doc \u003d ~\"{\\\"type\\\":\\\"foo\\\", \\\"bar\\\":2, \\\"baz\\\":\\\"b\\\"}\".\n\u003c\u003c\"{\\\"type\\\":\\\"foo\\\", \\\"bar\\\":2, \\\"baz\\\":\\\"b\\\"}\"\u003e\u003e\n\n\u003e byte_size(iolist_to_binary(zstd:compress(Doc, #{dictionary\u003d\u003eC}))).\n29\n\n\u003e byte_size(iolist_to_binary(zstd:compress(Doc))).\n43\n```\n"
    },
    {
      "commit": "e58ef7c8878874b685be32d3ee6c4002ae1981d8",
      "tree": "6302dd71e0f1ff5d895ffa1956626a0faaeb455b",
      "parents": [
        "b5f23602af0480689ff5491100b04df080b632e6"
      ],
      "author": {
        "name": "Nick Vatamaniuc",
        "email": "vatamane@gmail.com",
        "time": "Mon Jun 08 18:38:18 2026 -0400"
      },
      "committer": {
        "name": "Nick Vatamaniuc",
        "email": "nickva@users.noreply.github.com",
        "time": "Mon Jun 08 20:34:20 2026 -0400"
      },
      "message": "Temporarily disable FreeBSD x86 worker\n\nTo unblock PR merging\n"
    },
    {
      "commit": "b5f23602af0480689ff5491100b04df080b632e6",
      "tree": "c32d03fa3ac5454cd56a9f3b9f2c4e50341fa71c",
      "parents": [
        "a8b399fb0ec4c5591919321e38f7c693e503dc33"
      ],
      "author": {
        "name": "Nick Vatamaniuc",
        "email": "vatamane@gmail.com",
        "time": "Mon Jun 08 18:36:32 2026 -0400"
      },
      "committer": {
        "name": "Nick Vatamaniuc",
        "email": "nickva@users.noreply.github.com",
        "time": "Mon Jun 08 20:34:20 2026 -0400"
      },
      "message": "Mochiweb 3.4.0\n\nIt brings in OTP 29 support and make OTP 23 the minimum. We\u0027re already at 26\nminimum so it doesn\u0027t affect us.\n"
    },
    {
      "commit": "a8b399fb0ec4c5591919321e38f7c693e503dc33",
      "tree": "8c78a7ec28507095e0e56716ef5ec60e83e1a87d",
      "parents": [
        "e4eea5ae0735404a06fe123a9b85b33dad576da8"
      ],
      "author": {
        "name": "Nick Vatamaniuc",
        "email": "vatamane@gmail.com",
        "time": "Sun Jun 07 00:46:02 2026 -0400"
      },
      "committer": {
        "name": "Nick Vatamaniuc",
        "email": "nickva@users.noreply.github.com",
        "time": "Mon Jun 08 14:42:10 2026 -0400"
      },
      "message": "Always apply user configured compression\n\nPreviously, even when user picked a non-default compression algorithm in some\ninstances, like the purge trees and emsort, snappy would still be used such.\nMake sure to always respect user\u0027s choice, and if they picked something\nnon-default always use that.\n\n[1] There is a good reason to avoid snappy as doesn\u0027t properly yield when\nencoding or decoding. In a low concurrency environment it might not matter, but\nas the concurrency ramps up it could lead to scheduler collapse (it could\nmanifest as high p90+ latencies while cpus usage remains low). A similar effect\nis illustrated in scheduler responsiveness test for jiffy vs other C json\nlibraries in https://github.com/nickva/bench#scheduler-responsiveness-test\n"
    },
    {
      "commit": "e4eea5ae0735404a06fe123a9b85b33dad576da8",
      "tree": "09ea0d9a67d8a9bcd4147f3d52a16308faa7848e",
      "parents": [
        "7d9d2d36093b43d13a870ab4e9109c3bce98f5fb"
      ],
      "author": {
        "name": "Nick Vatamaniuc",
        "email": "vatamane@gmail.com",
        "time": "Fri Jun 05 12:18:50 2026 -0400"
      },
      "committer": {
        "name": "Nick Vatamaniuc",
        "email": "nickva@users.noreply.github.com",
        "time": "Fri Jun 05 15:49:00 2026 -0400"
      },
      "message": "Fsync on reset\n\nLet\u0027s sync when we truncate/reset headers. In case of truncate that\u0027s also a\nmetadata operation so it dirties the inode but doesn\u0027t necessarily sync.\nCalling datasync will write that metadata change to disk [*]. These resets\nshould be very rare so shouldn\u0027t be a performance impact.\n\n[*] fdatasync despite its name also syncs metadata required for data operations\nto work correctly, one of those is file size changes when it affects data\noperations (writes at eof or truncates).\n"
    },
    {
      "commit": "7d9d2d36093b43d13a870ab4e9109c3bce98f5fb",
      "tree": "db024838dad79dd41534d3fe0f0c8b56251af985",
      "parents": [
        "741854d6f8685714bbe51711744d11e16d1c2a10"
      ],
      "author": {
        "name": "Nick Vatamaniuc",
        "email": "vatamane@gmail.com",
        "time": "Thu Jun 04 15:50:59 2026 -0400"
      },
      "committer": {
        "name": "Nick Vatamaniuc",
        "email": "nickva@users.noreply.github.com",
        "time": "Fri Jun 05 09:47:43 2026 -0400"
      },
      "message": "Limit couch_server sharding\n\nWith a default setting `max_dbs_open \u003d 500` on servers with 128 CPU cores,\nper-instance LRU cache limits would become tiny (500/128 \u003d 4). In that case, if\njust 4 db names on any gen_server randomly pick any the same server the cluster\nwill start emitting `all_dbs_active` errors, even though in aggregate across\nall instances there will still be plenty of available LRU slots left.\n\nAs a simple solution, let\u0027s limit the sharding factor with a config setting.\nUse the scheduler count on small instances and those will more schedulers are\nlimited by the limit.\n"
    },
    {
      "commit": "741854d6f8685714bbe51711744d11e16d1c2a10",
      "tree": "b556f9926912f5fa8525cc9f8de2ac95555faad8",
      "parents": [
        "ef5d6407a5c56e0c18c9ee13b62b0be9a425ea5c"
      ],
      "author": {
        "name": "Nick Vatamaniuc",
        "email": "vatamane@gmail.com",
        "time": "Thu Jun 04 13:11:10 2026 -0400"
      },
      "committer": {
        "name": "Nick Vatamaniuc",
        "email": "nickva@users.noreply.github.com",
        "time": "Thu Jun 04 15:50:03 2026 -0400"
      },
      "message": "QuickJS update: faster math ops, return checks, new release\n\n* New release 2026-06-04\nhttps://github.com/bellard/quickjs/commit/3d5e064e9dd67c70f7962836505a7fa067bf0a4e\n\n* Check return values of fallible functions\nhttps://github.com/bellard/quickjs/commit/ccfe0764eddc17bc531dcf9fc69f9ee3a2b3e0e2\n\n* Fuzz targets for ES6 modules, JSON, RegExp, and bytecode\nhttps://github.com/bellard/quickjs/commit/8b045501f92617951060ffb31f9db0be745195d9\n\n* Doc updates\nhttps://github.com/bellard/quickjs/commit/cfc846a31c5b60130ca02d121932438bcfc94cd1\n\n* More generic `cpu_count()` for non Linux systems for tests\nhttps://github.com/bellard/quickjs/commit/ad1e7bd3ce00544f86c254fde1f3db20fefa089f\n\n* Fixed microbench with d8\nhttps://github.com/bellard/quickjs/commit/92a3d4d5ea04c98c462161fb881ee00b78176d73\n"
    },
    {
      "commit": "ef5d6407a5c56e0c18c9ee13b62b0be9a425ea5c",
      "tree": "e6a2581cabb88b97fdde0059baabca49f478f004",
      "parents": [
        "1ef26320b753e62971d287975e6e7b3653efaca2"
      ],
      "author": {
        "name": "Nick Vatamaniuc",
        "email": "vatamane@gmail.com",
        "time": "Wed Jun 03 23:51:12 2026 -0400"
      },
      "committer": {
        "name": "Nick Vatamaniuc",
        "email": "nickva@users.noreply.github.com",
        "time": "Thu Jun 04 02:31:36 2026 -0400"
      },
      "message": "Add all_dbs_active metric\n\nBump a counter when couch_server reaches an `all_dbs_active` state.\n\nUsers may use that to decide if they need to bump their max_dbs_open setting.\n"
    },
    {
      "commit": "1ef26320b753e62971d287975e6e7b3653efaca2",
      "tree": "fe3e777eead7b2e47f3e19d4c7518f45293ceabe",
      "parents": [
        "bffd5274b1691e345c29adc04df347ac7c67d5d1"
      ],
      "author": {
        "name": "Nick Vatamaniuc",
        "email": "vatamane@gmail.com",
        "time": "Wed Jun 03 17:44:25 2026 -0400"
      },
      "committer": {
        "name": "Nick Vatamaniuc",
        "email": "nickva@users.noreply.github.com",
        "time": "Wed Jun 03 18:34:39 2026 -0400"
      },
      "message": "CI: Disable MacOS runner for a bit\n\nIt\u0027s running out of space and Jenkins keep auto-pausing it which blocks CI jobs\nindefinitely it seems (likely they\u0027d time out after 2h).\n"
    },
    {
      "commit": "bffd5274b1691e345c29adc04df347ac7c67d5d1",
      "tree": "ba8266a06f25c53765799c930c5bd05196f91aad",
      "parents": [
        "aa9595350c9345e7c9b2871008e438055a61c7cd"
      ],
      "author": {
        "name": "Nick Vatamaniuc",
        "email": "vatamane@gmail.com",
        "time": "Wed Jun 03 14:27:13 2026 -0400"
      },
      "committer": {
        "name": "Nick Vatamaniuc",
        "email": "nickva@users.noreply.github.com",
        "time": "Wed Jun 03 18:34:39 2026 -0400"
      },
      "message": "QuickJS Update: fix gcc perf regression, faster test262 runs\n\n* Add optional define to add asm labels for each opcode to ease code inspection\nand profiling\nhttps://github.com/bellard/quickjs/commit/e2c01dff615c0df4d65ed545e4a80ad40b94ea28\n\n* Fixed large performance regression with recent GCC versions\nhttps://github.com/bellard/quickjs/commit/10c81b1989de2d2e8d482d252b160a34f215d3e2\n\n* Exclude few very slow and currently useless test262 tests\nhttps://github.com/bellard/quickjs/commit/594f965146308f4bc8260bd7d91c0eb92b8990d1\n"
    },
    {
      "commit": "aa9595350c9345e7c9b2871008e438055a61c7cd",
      "tree": "1a2a2acf1ed2807d8694f959a1b967db254c8882",
      "parents": [
        "e823a6ed43288f43822fc515b530b7724459c290"
      ],
      "author": {
        "name": "Nick Vatamaniuc",
        "email": "vatamane@gmail.com",
        "time": "Tue Jun 02 00:23:35 2026 -0400"
      },
      "committer": {
        "name": "Nick Vatamaniuc",
        "email": "nickva@users.noreply.github.com",
        "time": "Tue Jun 02 17:07:06 2026 -0400"
      },
      "message": "QuickJS Update: 10-40% speedup, compilation fixes, test speed-ups\n\n* Added: multi-threading support in run-test262\nhttps://github.com/bellard/quickjs/commit/2504823832cccc9d3930d8811ef60a5891c37495\n\n* Removed `CONFIG_AGENT`\nhttps://github.com/bellard/quickjs/commit/458992ec8cd73710ba8131322dd502da040d5389\n\n* Fixed win32 compilation\nhttps://github.com/bellard/quickjs/commit/774e30e796aad01b7e463f7a41ea83a612961667\n\n* ArrayBuffer.prototype.transfer: avoid destroying the old array buffer in case\nthe allocation of the new array buffer fails\nhttps://github.com/bellard/quickjs/commit/f8381776891b3d6eb115aa98677f06be87f9d700\n\n* Add line number info in variable initialization\nhttps://github.com/bellard/quickjs/commit/14a1536e936bfca3ef41d40b6dbffc9b989cfe70\n\n* Use the host `malloc()` for all allocations when ASAN is enabled\nhttps://github.com/bellard/quickjs/commit/ecd05ea13383e9aeba1932548b5303d0d2ff248f\n\n* Fixed `setuid()` / `setgid()` ordering\nhttps://github.com/bellard/quickjs/commit/4a13c45081cfcbaa1ba738c05db1ea4d5f99c73f\n\n* Disable: inlining of malloc() wrappers to avoid problems with LTO\nhttps://github.com/bellard/quickjs/commit/e6c2be818a3d18e384be9702c6b1c9e68fbe6c11\n\n* Add `poll()` support so that the number of file handles is not limited\nhttps://github.com/bellard/quickjs/commit/163b9b725dd60ad07b56877bcedaa994d6e3551e\n\n* Add run-test262 --no-can-block flag\nhttps://github.com/bellard/quickjs/commit/8a3aaa129dc561e8f62db5090f9a960c401d990f\n\n* Add custom malloc for small blocks /w an 11% speedup in v8 bench (as claimed\nupstream). My own local `make microbench` showed a 13458 nsec -\u003e 7385 nsec\nimprovement which is closer to 40%(!)\nhttps://github.com/bellard/quickjs/commit/99e9181d117a0cb65d37cb11a55a34bf29853309\n\n* Add Uint8Array base64/hex methods (initial patch by saghul)\nhttps://github.com/bellard/quickjs/commit/e182e3df5c51017a7faa97a654b3f2b9c6330448\n\n* Fix `memcpy()` undefined behavior if a pointer is NULL with zero size\nhttps://github.com/bellard/quickjs/commit/1f50b39e99d12042fc2e2ce3b754719fa42af753\n\n* Fixed error handling in `os.exec()`\nhttps://github.com/bellard/quickjs/commit/b1b4733bd9f75509ffbf1243b754a8e61278b790\n\n* Add missing NULL pointer check https://github.com/bellard/quickjs/issues/504\n\n* Use __EMSCRIPTEN__ define instead of EMSCRIPTEN\nhttps://github.com/bellard/quickjs/commit/9b90125510d8a57bb1b687a798237d8b7133fb49\n\n* Heap-Use-After-Free in Atomics Operations via ResizableArrayBuffer\nhttps://github.com/bellard/quickjs/issues/508\n\n* Expose Unicode version in C API https://github.com/bellard/quickjs/issues/509\n\n* Fix member access on non-decimal numeric literals\nhttps://github.com/bellard/quickjs/commit/66afb7234cf53957094509014cc5e97fa152b0f4\n\n* Avoid initializer-string warning for the digits array\nhttps://github.com/bellard/quickjs/commit/d38eea93365879b5bff8b649d8dbb4dc1b849e56\n\nWARNING: `couchjs.c` inlines refcount helpers `(JS_FreeValue/JS_DupValue/...)`\nfrom `quickjs.h`. Rebar port compiler rebuilds couchjs.o when couchjs.c changes\nnot when included header changes. This update alters the header (refcount\nlayout) so a stale couchjs.o would mismatch the new libquickjs.a and corrupt\nrefcounts. TL;DR do clean -xffd build with this change.\n"
    },
    {
      "commit": "e823a6ed43288f43822fc515b530b7724459c290",
      "tree": "bce2327746ecc50738e4a0fe192b812e25a898b9",
      "parents": [
        "96ea5b501a03a956f561ecffcef6cf82cede8fed"
      ],
      "author": {
        "name": "Ronny Berndt",
        "email": "ronny@apache.org",
        "time": "Tue Jun 02 19:48:52 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Jun 02 19:48:52 2026 +0200"
      },
      "message": "dev: Print synchronized ouput of make during builds (#6019)"
    },
    {
      "commit": "96ea5b501a03a956f561ecffcef6cf82cede8fed",
      "tree": "6601bca94bbb79b1b94dad424ab064d7fc38985c",
      "parents": [
        "03d6065ca19e185e18a19a61bf6ca30d77977aff"
      ],
      "author": {
        "name": "Nick Vatamaniuc",
        "email": "vatamane@gmail.com",
        "time": "Fri May 29 13:39:12 2026 -0400"
      },
      "committer": {
        "name": "Nick Vatamaniuc",
        "email": "nickva@users.noreply.github.com",
        "time": "Fri May 29 18:08:26 2026 -0400"
      },
      "message": "Improve CI by matching variants to the number of workers\n\nPreviously, after we added trixie we ended up with N+1 variants for N worker\nslots for generic docker workers. This means CI jobs have to wait until one of\nthe workers finishes completely before even starting. To improve the situation,\nlet\u0027s skip intermediate (27 currently) CI run to hopefully restore the speed\nback.\n\nThere is some separate docker pull or java run flakiness we noticed but that\u0027s\nnot related to this most likely.\n"
    },
    {
      "commit": "03d6065ca19e185e18a19a61bf6ca30d77977aff",
      "tree": "c6a9126c7c91f1e67e7eb82eaeb435176f21a4b0",
      "parents": [
        "750569267321f70f73d03976a8f4642efde1d1b6",
        "38770829f114505d667d3bcc79a5b34a523a733e"
      ],
      "author": {
        "name": "Robert Newson",
        "email": "rnewson@apache.org",
        "time": "Fri May 29 21:10:44 2026 +0100"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri May 29 21:10:44 2026 +0100"
      },
      "message": "Merge pull request #6015 from apache/no-eof\n\neliminate internal tracking of EOF"
    },
    {
      "commit": "38770829f114505d667d3bcc79a5b34a523a733e",
      "tree": "c6a9126c7c91f1e67e7eb82eaeb435176f21a4b0",
      "parents": [
        "750569267321f70f73d03976a8f4642efde1d1b6"
      ],
      "author": {
        "name": "Robert Newson",
        "email": "rnewson@apache.org",
        "time": "Tue May 26 12:44:59 2026 +0100"
      },
      "committer": {
        "name": "Robert Newson",
        "email": "rnewson@apache.org",
        "time": "Fri May 29 19:35:00 2026 +0100"
      },
      "message": "eliminate internal tracking of EOF\n"
    },
    {
      "commit": "750569267321f70f73d03976a8f4642efde1d1b6",
      "tree": "5137dcecfe9c0f4e77490283a11fe89052b1a847",
      "parents": [
        "11a3d0a766cf01d3b203208efda4f3d66d3ddb8c"
      ],
      "author": {
        "name": "Nick Vatamaniuc",
        "email": "vatamane@gmail.com",
        "time": "Wed May 27 14:48:47 2026 -0400"
      },
      "committer": {
        "name": "Nick Vatamaniuc",
        "email": "nickva@users.noreply.github.com",
        "time": "Wed May 27 23:11:15 2026 -0400"
      },
      "message": "Fix leaked opened db handle in smoosh\n\n`smoosh_channel:maybe_remonitor_cpid/3` opened db and never closed it. That\nleft a dangling reference (monitor to it) which prevented that db handle from\nbecoming idle.\n\nWe noticed this after inspecting dangling deleted fd handles which were still\nleft open by something. That something turned to be smoosh_channel gen_server.\n"
    },
    {
      "commit": "11a3d0a766cf01d3b203208efda4f3d66d3ddb8c",
      "tree": "20ec023f705f5e3d67a558830ce7597ebd149e46",
      "parents": [
        "a006a2ca161e4a82e6632247572f981c0de33037"
      ],
      "author": {
        "name": "Nick Vatamaniuc",
        "email": "vatamane@gmail.com",
        "time": "Sun May 24 00:00:02 2026 -0400"
      },
      "committer": {
        "name": "Nick Vatamaniuc",
        "email": "nickva@users.noreply.github.com",
        "time": "Sun May 24 08:24:22 2026 -0400"
      },
      "message": "Merge 3.5.2 change to main\n\nThis just the version bump and release notes\n"
    },
    {
      "commit": "a006a2ca161e4a82e6632247572f981c0de33037",
      "tree": "b1d3151bfcbd58188525d2bda5873d6d5fd0a918",
      "parents": [
        "577232ea355f40489d81c327a27f30a52c959bff"
      ],
      "author": {
        "name": "Nick Vatamaniuc",
        "email": "vatamane@gmail.com",
        "time": "Thu May 21 17:37:27 2026 -0400"
      },
      "committer": {
        "name": "Nick Vatamaniuc",
        "email": "nickva@users.noreply.github.com",
        "time": "Fri May 22 00:16:28 2026 -0400"
      },
      "message": "Fix function clause on auto_purge ttl \u003d infinity\n\nFix function_clause when per-db values was not set and the default in config\nwas set to \"infinity\".\n\nThe clause is already covered by eunit tests it\u0027s just that now it logs should\nshow an function_clause error.\n"
    },
    {
      "commit": "577232ea355f40489d81c327a27f30a52c959bff",
      "tree": "df778195b879322a069236487c15366eca7e79af",
      "parents": [
        "e2cded77e367fb4577834c0e196bff6a81779212"
      ],
      "author": {
        "name": "Ronny Berndt",
        "email": "ronny@apache.org",
        "time": "Thu May 21 19:55:05 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu May 21 19:55:05 2026 +0200"
      },
      "message": "dev: Allow OTP 29 compiler (#6009)"
    },
    {
      "commit": "e2cded77e367fb4577834c0e196bff6a81779212",
      "tree": "384842456a90cd9414026f2bacce180ab85a2213",
      "parents": [
        "90750afa9022c3c06d13e37e4a55c4725ead1dd2"
      ],
      "author": {
        "name": "Ronny Berndt",
        "email": "ronny@apache.org",
        "time": "Tue May 19 22:42:01 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue May 19 22:42:01 2026 +0200"
      },
      "message": "dev: Update Gradle 9.5.1 (#6007)"
    },
    {
      "commit": "90750afa9022c3c06d13e37e4a55c4725ead1dd2",
      "tree": "044cfc59ebb7b986ce7dbccab4103b8e0012fbc6",
      "parents": [
        "74ac0419742c51009d48abb46fd7549301fe26c6"
      ],
      "author": {
        "name": "Ronny Berndt",
        "email": "ronny@apache.org",
        "time": "Mon May 18 23:50:15 2026 +0200"
      },
      "committer": {
        "name": "Ronny Berndt",
        "email": "ronny@apache.org",
        "time": "Tue May 19 00:03:54 2026 +0200"
      },
      "message": "doc: Highlight the required Java version for Nouveau\n"
    },
    {
      "commit": "74ac0419742c51009d48abb46fd7549301fe26c6",
      "tree": "f761dbc8328d0f3e2590f1292bc15ad0da4cb326",
      "parents": [
        "3790a7967ed26be171dde2c436a22cf2ef925011"
      ],
      "author": {
        "name": "Jan Lehnardt",
        "email": "jan@apache.org",
        "time": "Mon May 18 22:18:05 2026 +0200"
      },
      "committer": {
        "name": "Ronny Berndt",
        "email": "ronny@apache.org",
        "time": "Tue May 19 00:03:54 2026 +0200"
      },
      "message": "doc: link to Adoptium for third-party Java 21 debs.\n"
    },
    {
      "commit": "3790a7967ed26be171dde2c436a22cf2ef925011",
      "tree": "b6aab7be43edbd65c8ed91565858272206de8865",
      "parents": [
        "54f70243d7c1c3979692b1ab5b1d088432f90c94"
      ],
      "author": {
        "name": "Nick Vatamaniuc",
        "email": "vatamane@gmail.com",
        "time": "Mon May 18 12:35:18 2026 -0400"
      },
      "committer": {
        "name": "Nick Vatamaniuc",
        "email": "nickva@users.noreply.github.com",
        "time": "Mon May 18 16:46:26 2026 -0400"
      },
      "message": "Fix error accumulation in bulk_get\n\nPreviously we didn\u0027t accumulate errors from bulk_get worker properly. If we had\nto bail when progress became impossiblme we didn\u0027t save any previous errors in\norder to pick amongst those those instead of the only having the last one\navailable.\n"
    },
    {
      "commit": "54f70243d7c1c3979692b1ab5b1d088432f90c94",
      "tree": "37c5d3a2f106a89e70a843e3cc861c568118c90a",
      "parents": [
        "3e50edc6fdef9e11d8dc0771ded7992bfb7bbfbe"
      ],
      "author": {
        "name": "Nick Vatamaniuc",
        "email": "vatamane@gmail.com",
        "time": "Mon May 18 11:06:55 2026 -0400"
      },
      "committer": {
        "name": "Nick Vatamaniuc",
        "email": "nickva@users.noreply.github.com",
        "time": "Mon May 18 12:14:31 2026 -0400"
      },
      "message": "Fix bulk_get not_found response handling when revs\u003dall\n\nSince revs\u003dall when doc is not found we return `{ok, []}` we didn\u0027t count that\nresponse as a not_found response and success_possible would return false too\nearly. If a node was in mm mode and that was the last response we could end up\nemitting that as an internal error instead of the proper \"not found\" result.\n"
    },
    {
      "commit": "3e50edc6fdef9e11d8dc0771ded7992bfb7bbfbe",
      "tree": "f29d7c2e324442768c570b87867fbc4306602da1",
      "parents": [
        "a6c58283b0aa335e6f8f14ea4f0819d46886d89c"
      ],
      "author": {
        "name": "Ronny Berndt",
        "email": "ronny@apache.org",
        "time": "Sun May 17 19:50:05 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sun May 17 19:50:05 2026 +0200"
      },
      "message": "ci: Add Ubuntu Resolute Raccoon (26.04) to CI (#5999)"
    },
    {
      "commit": "a6c58283b0aa335e6f8f14ea4f0819d46886d89c",
      "tree": "7a7ed29bc9282cf2ad0ab49eedb4ce96edba75a7",
      "parents": [
        "0a50108d322452ba748c307397a30cd2779cae97",
        "b05db3d117062464a7ec2788a41406d91bb39e64"
      ],
      "author": {
        "name": "Will Holley",
        "email": "willholley@apache.org",
        "time": "Wed May 13 10:02:22 2026 +0100"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed May 13 10:02:22 2026 +0100"
      },
      "message": "Merge pull request #5983 from apache/wh/connect_to\n\nfeat: Add replicator connect_to support for outbound requests."
    },
    {
      "commit": "b05db3d117062464a7ec2788a41406d91bb39e64",
      "tree": "7a7ed29bc9282cf2ad0ab49eedb4ce96edba75a7",
      "parents": [
        "0a50108d322452ba748c307397a30cd2779cae97"
      ],
      "author": {
        "name": "Will Holley",
        "email": "will.holley@uk.ibm.com",
        "time": "Mon Apr 27 13:53:28 2026 +0100"
      },
      "committer": {
        "name": "Will Holley",
        "email": "will.holley@uk.ibm.com",
        "time": "Wed May 13 08:53:24 2026 +0100"
      },
      "message": "feat: Add connect_to override support for outbound requests.\n\nThis adds a feature to the CouchDB replicator\nto override the connection target for specific host\npatterns (including wildcards) when making\noutbound requests. This is similar to the\n`--connect-to` option in curl.\n\nOne use case is when requests need\nto be routed via a transparent SNI proxy e.g.\nfor network egress monitoring and specifying\noverrides in /etc/hosts or similar isn\u0027t suffient\n/ possible (e.g. due to lack of wildcard support).\n\nThere is adds a new configuration option to\nspecify the overrides:\n\n```\n[replicator]\nconnect_to \u003d patternhost:port:target:targetport,..\n```\n\nThe replicator resolves the configured host patterns\nto the alternative connection targets while\npreserving the request URL host (applies to\nregular requests and session-auth requests)\nand rewriting the port as necessary.\n\nIf using https, the SNI header is added for the\noriginal Hostname.\n\nThe `pattern` can be a hostname, including leading\nwildcards e.g. `*.example.com`. Targets must be\nIP addresses. IPv6 addresses are supported using\nbracketed notation e.g. `[2001:db8::1]`.\n"
    },
    {
      "commit": "0a50108d322452ba748c307397a30cd2779cae97",
      "tree": "7d4ac1ac6fc01be0487cce8d1b43943c419530a9",
      "parents": [
        "db961c0809cf8e201824ff0fbaa952f0a3fc72e2"
      ],
      "author": {
        "name": "Nick Vatamaniuc",
        "email": "vatamane@gmail.com",
        "time": "Sun May 10 23:11:41 2026 -0400"
      },
      "committer": {
        "name": "Nick Vatamaniuc",
        "email": "nickva@users.noreply.github.com",
        "time": "Mon May 11 00:30:52 2026 -0400"
      },
      "message": "Run git renormalize\n\nThis should fix `gradlew.bat` being show as `modified` even after a fresh\ngit clone:\n\n```\nmodified:   extra/nouveau/gradlew.bat\n```\n\nThat makes the dist tarball as \"dirty\" so it breaks our releases.\n\nThis seems to happen because `extra/nouveau/gradlew.bat` was stored with cr/lf\nendings in git, but then we also modified `.gitattributes` to have `text\neol\u003dcrlf`, which indicates we want to store the file with `lf` and only apply\n`cr/lf` after the checkout on Windows. So managed to thoroughly confuse git\nwith that we wanted to do.\n\nIt turns out we can fix this with `git add --renormalize .` so that\u0027s what this\ncommit does [1].\n\n[1]\nhttps://stackoverflow.com/questions/7156694/git-how-to-renormalize-line-endings-in-all-files-in-all-revisions\n"
    },
    {
      "commit": "db961c0809cf8e201824ff0fbaa952f0a3fc72e2",
      "tree": "6f8dcde72cbecfe9102e6d598ef139c7416a11c5",
      "parents": [
        "169643d9dd23f381c7818324001b651861f6fd13"
      ],
      "author": {
        "name": "Nick Vatamaniuc",
        "email": "vatamane@gmail.com",
        "time": "Mon Apr 27 21:53:37 2026 -0400"
      },
      "committer": {
        "name": "Nick Vatamaniuc",
        "email": "nickva@users.noreply.github.com",
        "time": "Wed May 06 00:46:14 2026 -0400"
      },
      "message": "Fix cluster index and process cleanup\n\nPreviously, as described in #5980 we didn\u0027t perform a thorough index cleanup\nwhen ddocs changed. We only cleaned up on nodes where the design docs were\nlocated. That was true for a n\u003d3 db and an n\u003d3, db but may not be true in\ngeneral in a cluster.\n\nTo fix the issue, run a small gen_server responsible performing cluster\nindex cleanup. To avoid spawning Q*N jobs, deduplicate the requests by delaying\nfor up to 30 seconds per clustered db. For cleanup reuse and call the already\nexisting fabric index file cleanup machinery. That accomplishes two things:\n\n - Starts a quicker index file cleanup. Previously we only did this during\n   smoosh compaction runs. The view files could linger for a while until\n   compaction in smoosh would be triggered.\n\n - Cleaning search index files also stops indexes on their (Java) side, so\n   index file clean-up does \"double duty\" so speak when it comes to index shut\n   down.\n\nFix https://github.com/apache/couchdb/issues/5980\n"
    },
    {
      "commit": "169643d9dd23f381c7818324001b651861f6fd13",
      "tree": "697276d8be7a7801fe84ab5635a3eaea274746d1",
      "parents": [
        "425d8aa9eb2c95c68da0ea805767a916ebd93c51"
      ],
      "author": {
        "name": "Nick Vatamaniuc",
        "email": "vatamane@gmail.com",
        "time": "Tue May 05 01:47:23 2026 -0400"
      },
      "committer": {
        "name": "Nick Vatamaniuc",
        "email": "nickva@users.noreply.github.com",
        "time": "Tue May 05 11:51:02 2026 -0400"
      },
      "message": "Optimize replicator\n\nThere are two related optimizations:\n\nUse gen casts to queue docs for _bulk_docs in replication workers instead of\ngen calls.\n\nPreviously, queue_fetch loop from the worker used a gen_sever call to add each\ndoc to the parent\u0027s (worker\u0027s) batch. Even though it was an immediate\ngen_server return, it was still synchronous call, and if the worker was in the\nmiddle of a _bulk_docs flush, it couldn\u0027t reply to the queue_fetch_loop and\nstall it for that moment. The optimization is to use casts instead. This way,\nthe fetch loop can continue fetching (running bulk_gets) without having to\nperiodically wait for individual batch_doc calls. The bulk_docs pending queue\nis still properly bounded, as at the end of the fetch loop there is a\n`gen_server:call(Parent, flush, infinity)` call which will properly\nbackpropagate the pressure for a slow target\n\nThe second optimization is to increase the bulk_docs worker memory limit a bit from\n500KB to 4MB. Previously 500KB always restricted _bulk_docs batch size to\nalways be less than 500KB regardless what the user set as the replicator worker\nbatch size. This way we\u0027ll still limit the maximum batch size at 4MB, but since\nit\u0027s a higher limit and user\u0027s replicator batch size will have a wider range\neffective range to take effect (in other words if some users want to set a\nbatch size of 2500, they can now)\n\nA quick benchmark with a script [1] replicating 100k 2KB docs shows a local\nspeedup of 32 -\u003e 22 seconds\n\n```\n./rep_bench.py --ndocs 100000 --doc-size 2048 --source-url http://localhost:15984  --target-url http://localhost:25984\nsource:      http://localhost:15984/rep_bench_source\ntarget:      http://localhost:25984 (db prefix: rep_bench_target)\ncoordinator: http://localhost:15984  poll: 2.0s  http_timeout: 600s\ndocs: 100000  doc_size: 2048  n_jobs: 1\n\u003d\u003d source \u003d\u003d\n  loading 100000 docs into rep_bench_source (doc_size\u003d2048, batch\u003d500)...\n  loaded 100000 docs in 23.8s, size 27.0MB\n setting applied: {(\u0027replicator\u0027, \u0027startup_jitter\u0027): \u00270\u0027, (\u0027replicator\u0027, \u0027interval\u0027): \u00271000\u0027}\n\u003d\u003d bench \u003d\u003d\n\nwall\u003d30.28s\n  job 00  elapsed\u003d 30.27s  docs_read\u003d 100000  docs_written\u003d 100000  missing\u003d  100000\n```\n\n```\n./rep_bench.py --ndocs 100000 --doc-size 2048 --source-url http://localhost:15984  --target-url http://localhost:25984\nsource:      http://localhost:15984/rep_bench_source\ntarget:      http://localhost:25984 (db prefix: rep_bench_target)\ncoordinator: http://localhost:15984  poll: 2.0s  http_timeout: 600s\ndocs: 100000  doc_size: 2048  n_jobs: 1\n\u003d\u003d source \u003d\u003d\n  loading 100000 docs into rep_bench_source (doc_size\u003d2048, batch\u003d500)...\n  loaded 100000 docs in 24.2s, size 26.9MB\n setting applied: {(\u0027replicator\u0027, \u0027startup_jitter\u0027): \u00270\u0027, (\u0027replicator\u0027, \u0027interval\u0027): \u00271000\u0027}\n\u003d\u003d bench \u003d\u003d\n\nwall\u003d22.11s\n  job 00  elapsed\u003d 22.10s  docs_read\u003d 100000  docs_written\u003d 100000  missing\u003d 100000\n```\n\n[1] https://gist.github.com/nickva/2a49f6e624208c45dc0dafdd935a4aae\n"
    },
    {
      "commit": "425d8aa9eb2c95c68da0ea805767a916ebd93c51",
      "tree": "42f388d2297efd236e2e03fa82729c1fa283de0b",
      "parents": [
        "43b31d90cd36524617c3eb124162858c7398c3d5"
      ],
      "author": {
        "name": "Nick Vatamaniuc",
        "email": "vatamane@gmail.com",
        "time": "Thu Apr 30 00:06:07 2026 -0400"
      },
      "committer": {
        "name": "Nick Vatamaniuc",
        "email": "nickva@users.noreply.github.com",
        "time": "Fri May 01 16:10:04 2026 -0400"
      },
      "message": "Fix append_update_replies case clause in fabric_doc_update\n\nIn `serialize_worker_startup\u003dfalse` mode it was possible before to get a\nfunction_clause error in `fabric_doc_update:append_update_replies/3`. The\nfunction_clause was because of an empty `Docs` list and a non-empty `Replies`\nlist. That happened when we had at least two conflicted replies for a doc one\narriving, and others in-flight, the arriving one would knock out the doc from\nthe expected replies list, such that when the second reply arrived, it wouldn\u0027t\nmatch up with anything.\n\nTo fix this, keep track of conflicts separately and check that conflicted list\nbefore extra workers spawn, and also avoid altering the grouped docs structure\nfor in-flight requests\n\nAlso fix another regression, and that\u0027s in case of sws\u003dfalse to keep going and\nperform the quorum the way we did before sws feature. Previously, we only\nspawned the workers in parallel but still short-cut the quorum on a conflict.\n"
    },
    {
      "commit": "43b31d90cd36524617c3eb124162858c7398c3d5",
      "tree": "cf19c1e3bb4148bd71b8af0ff0d7e1b3d092903f",
      "parents": [
        "2198a0a08c1f02abac6db0364ea18b10b36cebd3"
      ],
      "author": {
        "name": "Nick Vatamaniuc",
        "email": "vatamane@gmail.com",
        "time": "Thu Apr 30 16:56:12 2026 -0400"
      },
      "committer": {
        "name": "Nick Vatamaniuc",
        "email": "nickva@users.noreply.github.com",
        "time": "Fri May 01 13:01:13 2026 -0400"
      },
      "message": "Update dependencies before 3.5.2 release\n\n * snappy https://github.com/apache/couchdb-snappy/releases/tag/CouchDB-1.0.10\n * meck https://github.com/apache/couchdb-meck/releases/tag/v1.1.1\n * fauxton https://github.com/apache/couchdb-fauxton/releases/tag/v1.3.6\n * excoveralls https://github.com/parroty/excoveralls/releases/tag/v0.18.5\n"
    },
    {
      "commit": "2198a0a08c1f02abac6db0364ea18b10b36cebd3",
      "tree": "5ce233cdd49f071ba51a77705cceaf4a5010ca6a",
      "parents": [
        "486ed0aee9af39abb9b010f05b8e65e9fe56109b",
        "da53da51a5b60144b6347ca53f5a817f32c1aeba"
      ],
      "author": {
        "name": "Jan Lehnardt",
        "email": "jan@apache.org",
        "time": "Fri May 01 14:58:19 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri May 01 14:58:19 2026 +0200"
      },
      "message": "Merge pull request #5992 from apache/chore/ioq-default-ini\n\nchore: remove duplicate ioq section entry in default.ini"
    },
    {
      "commit": "da53da51a5b60144b6347ca53f5a817f32c1aeba",
      "tree": "5ce233cdd49f071ba51a77705cceaf4a5010ca6a",
      "parents": [
        "b2a00f820f5853e90f7b9ba960e70d8fbf1703ea"
      ],
      "author": {
        "name": "Jan Lehnardt",
        "email": "jan@apache.org",
        "time": "Fri May 01 11:10:44 2026 +0200"
      },
      "committer": {
        "name": "Jan Lehnardt",
        "email": "jan@apache.org",
        "time": "Fri May 01 11:10:44 2026 +0200"
      },
      "message": "chore: add missing comment from docs\n"
    },
    {
      "commit": "b2a00f820f5853e90f7b9ba960e70d8fbf1703ea",
      "tree": "546f7c8c942300558284afe1a5f8044f7a47e60a",
      "parents": [
        "486ed0aee9af39abb9b010f05b8e65e9fe56109b"
      ],
      "author": {
        "name": "Jan Lehnardt",
        "email": "jan@apache.org",
        "time": "Fri May 01 11:06:04 2026 +0200"
      },
      "committer": {
        "name": "Jan Lehnardt",
        "email": "jan@apache.org",
        "time": "Fri May 01 11:06:04 2026 +0200"
      },
      "message": "chore: remove duplicate ioq section entry in default.ini\n"
    },
    {
      "commit": "486ed0aee9af39abb9b010f05b8e65e9fe56109b",
      "tree": "14057081f70e62aa9fea5b9de13514f79e20acb5",
      "parents": [
        "291a24c4336dcb245e106dbc7f3b2da24387c664"
      ],
      "author": {
        "name": "Gabor Pali",
        "email": "gabor.pali@ibm.com",
        "time": "Thu Apr 30 05:57:47 2026 +0200"
      },
      "committer": {
        "name": "PÁLI Gábor János",
        "email": "pali.gabor@gmail.com",
        "time": "Thu Apr 30 14:18:14 2026 +0200"
      },
      "message": "clouseau: bump version to 3.3.0\n\nThere were some recent developments in Clouseau for which it may\nmake sense to bring them in by default and upgrade to the latest\nrelease.  While here, update outdated help messages in the\nconfigure scripts.\n"
    },
    {
      "commit": "291a24c4336dcb245e106dbc7f3b2da24387c664",
      "tree": "e3cfb245320fde0f1bf56bf27cb4cdbbe37cd953",
      "parents": [
        "c82fe8ffb3e5169d78be4cae6696ed0a3908b935"
      ],
      "author": {
        "name": "Gabor Pali",
        "email": "gabor.pali@ibm.com",
        "time": "Wed Apr 29 21:28:05 2026 +0200"
      },
      "committer": {
        "name": "PÁLI Gábor János",
        "email": "pali.gabor@gmail.com",
        "time": "Thu Apr 30 09:07:15 2026 +0200"
      },
      "message": "Re-enable Clouseau testing in containers\n\nRequests run in the Elixir and Mango tests tend to time out time\nto time due to reasons unknown at the moment, but only when they\nare run in virtualized or containerized environments, such as the\nCI for this repository or the Clouseau upstream CI [1].\n\nIncreasing the frequency of recurring commit checks seems to\noffer a way to mitigate the problem so that at least the\nresulting flakiness can be eliminated for now.\n\n[1] https://github.com/cloudant-labs/clouseau/pull/166\n"
    },
    {
      "commit": "c82fe8ffb3e5169d78be4cae6696ed0a3908b935",
      "tree": "3901e3e21823de90f8cd1da7d3667ece4eaf3af3",
      "parents": [
        "d7aefe0f7e599051cad25b8cb330709d264c457f"
      ],
      "author": {
        "name": "Nick Vatamaniuc",
        "email": "vatamane@gmail.com",
        "time": "Wed Apr 29 04:14:10 2026 -0400"
      },
      "committer": {
        "name": "Nick Vatamaniuc",
        "email": "nickva@users.noreply.github.com",
        "time": "Wed Apr 29 09:53:24 2026 -0400"
      },
      "message": "Make view compaction tests unflaky\n\nIt turns after we made view updates more efficient, some view compaction tests\nstarted to flake out because they relied on view builds batching inneficiently\nalways and creating garbage between the batches.\n\nTo fix it, do not rely on inneficient batching, instead just do another\nexplicit fresh and update, this should guarantee at least some extra garbage\nbeing created in the tree.\n"
    },
    {
      "commit": "d7aefe0f7e599051cad25b8cb330709d264c457f",
      "tree": "d514ff1f32d752474ac733bbd2907f183ba74a7a",
      "parents": [
        "2c4b6a138b981105b293d0e375adca1c72ec24b0"
      ],
      "author": {
        "name": "Nick Vatamaniuc",
        "email": "vatamane@gmail.com",
        "time": "Wed Apr 29 01:55:15 2026 -0400"
      },
      "committer": {
        "name": "Nick Vatamaniuc",
        "email": "nickva@users.noreply.github.com",
        "time": "Wed Apr 29 09:53:24 2026 -0400"
      },
      "message": "Use config:get_integer/3 in couch_mrview_updater\n\nThis avoids re-parsing the string values into integers when defaults are used\nevery time we run the check.\n"
    },
    {
      "commit": "2c4b6a138b981105b293d0e375adca1c72ec24b0",
      "tree": "0f5c271b70271572723b6cd9872188b06cc7316f",
      "parents": [
        "e979f7f8b448043b95f68214faf73790e4d2cfd1"
      ],
      "author": {
        "name": "Nick Vatamaniuc",
        "email": "vatamane@gmail.com",
        "time": "Wed Apr 29 00:43:42 2026 -0400"
      },
      "committer": {
        "name": "Nick Vatamaniuc",
        "email": "nickva@users.noreply.github.com",
        "time": "Wed Apr 29 09:53:24 2026 -0400"
      },
      "message": "Increase view queue size from 100KB to 10MB\n\n100KB was undersized given the 100 batch size used in the process_doc call.\n100 docs as small as 1KB will already start to get serialized and not take\nadvantage of the work queue buffering. Make it 10MB to fit about 10 batches of\n1MB each and be a bit under the min_writer_size default of 16MB.\n"
    },
    {
      "commit": "e979f7f8b448043b95f68214faf73790e4d2cfd1",
      "tree": "c38adf78a97150e71facbed77e0103887b722b98",
      "parents": [
        "7039e0be8a2487610e368066b72d20bd1ca65441"
      ],
      "author": {
        "name": "Nick Vatamaniuc",
        "email": "vatamane@gmail.com",
        "time": "Wed Apr 29 00:25:30 2026 -0400"
      },
      "committer": {
        "name": "Nick Vatamaniuc",
        "email": "nickva@users.noreply.github.com",
        "time": "Wed Apr 29 09:53:24 2026 -0400"
      },
      "message": "Do not run full GC after each doc update in the indexer\n\nRun it after 1000 docs, ensuring it still forced to run as a safe default.\nHowever, in OTP 27+ this should not be needed at all. So infinity is also a\npossible config setting, we may change to that in the future.\n\nComments from John Hogberg in OTP repo regarind behavior change in OTP 27:\n\nhttps://github.com/erlang/otp/issues/8229#issuecomment-1988858134\n\n\u003e the GC pressure of off-heap binaries (\"vheap\") was vastly under-counted prior\nto 24ef4cb [1]. In these tests this caused it to GC less often and, crucially, when\nthere was less live data to keep.\n\n[1]\nhttps://github.com/erlang/otp/commit/24ef4cbaeda9b9c26682cba75f2f15b0c58722aa\n"
    },
    {
      "commit": "7039e0be8a2487610e368066b72d20bd1ca65441",
      "tree": "449d4054e2a4d9bde90843e0c48c1948cf18753c",
      "parents": [
        "c88efca9ec17828521ad2c613a50f1a41de41155",
        "c4da1b8c765df85659209be8390d4f3d886b4e64"
      ],
      "author": {
        "name": "Robert Newson",
        "email": "rnewson@apache.org",
        "time": "Mon Apr 27 22:38:26 2026 +0100"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Apr 27 22:38:26 2026 +0100"
      },
      "message": "Merge pull request #5984 from apache/disable-copilot-code-review\n\ndisable copilot code review"
    },
    {
      "commit": "c4da1b8c765df85659209be8390d4f3d886b4e64",
      "tree": "449d4054e2a4d9bde90843e0c48c1948cf18753c",
      "parents": [
        "c88efca9ec17828521ad2c613a50f1a41de41155"
      ],
      "author": {
        "name": "Robert Newson",
        "email": "rnewson@apache.org",
        "time": "Mon Apr 27 21:05:57 2026 +0100"
      },
      "committer": {
        "name": "Robert Newson",
        "email": "rnewson@apache.org",
        "time": "Mon Apr 27 21:05:57 2026 +0100"
      },
      "message": "disable copilot code review\n"
    },
    {
      "commit": "c88efca9ec17828521ad2c613a50f1a41de41155",
      "tree": "999a5b7991bca2d1e65cb74cac4554e233975641",
      "parents": [
        "f7cb246cd54c2518a40df00e74b85996664a0402"
      ],
      "author": {
        "name": "Nick Vatamaniuc",
        "email": "vatamane@gmail.com",
        "time": "Sat Apr 25 12:23:22 2026 -0400"
      },
      "committer": {
        "name": "Nick Vatamaniuc",
        "email": "nickva@users.noreply.github.com",
        "time": "Sat Apr 25 17:47:14 2026 -0400"
      },
      "message": "Jiffy 2.0\n\nhttps://github.com/davisp/jiffy/releases/tag/2.0.0\n"
    },
    {
      "commit": "f7cb246cd54c2518a40df00e74b85996664a0402",
      "tree": "08d77872733cba0de3b31b9dbc32304e838eb318",
      "parents": [
        "ac042fbe6eaec3b1b60f41510eb8e17dc4b3b893",
        "05794a8976f501b44b54148c516d7a61eb2457dc"
      ],
      "author": {
        "name": "Robert Newson",
        "email": "rnewson@apache.org",
        "time": "Wed Apr 22 16:50:57 2026 +0100"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Apr 22 16:50:57 2026 +0100"
      },
      "message": "Merge pull request #5978 from apache/find-threshold\n\nFind threshold"
    },
    {
      "commit": "05794a8976f501b44b54148c516d7a61eb2457dc",
      "tree": "08d77872733cba0de3b31b9dbc32304e838eb318",
      "parents": [
        "ac042fbe6eaec3b1b60f41510eb8e17dc4b3b893"
      ],
      "author": {
        "name": "Robert Newson",
        "email": "rnewson@apache.org",
        "time": "Wed Apr 22 15:25:20 2026 +0100"
      },
      "committer": {
        "name": "Robert Newson",
        "email": "rnewson@apache.org",
        "time": "Wed Apr 22 16:03:15 2026 +0100"
      },
      "message": "fixes _find when over threshold\n\nfixed a typo also\n\ncloses https://github.com/apache/couchdb/issues/5977\n"
    },
    {
      "commit": "ac042fbe6eaec3b1b60f41510eb8e17dc4b3b893",
      "tree": "43445fc1f685134033065a32e347766c106e1ae4",
      "parents": [
        "6e51448e516cacc676e2e5711aead53b43c03676"
      ],
      "author": {
        "name": "Nick Vatamaniuc",
        "email": "vatamane@gmail.com",
        "time": "Wed Apr 22 00:26:39 2026 -0400"
      },
      "committer": {
        "name": "Nick Vatamaniuc",
        "email": "nickva@users.noreply.github.com",
        "time": "Wed Apr 22 09:57:29 2026 -0400"
      },
      "message": "Use errstr() instead of toSource() in nouveau js wrapper\n\n`toSource()` is a Spidermonkey special, use our `errstr()` warpper function which checks\nif `toSource()` is available, and if not,  it runs `toString()` instead\n"
    },
    {
      "commit": "6e51448e516cacc676e2e5711aead53b43c03676",
      "tree": "1d6e977eb27c59b3a28917b1acf1d703642ca17c",
      "parents": [
        "8491b4417bd7ff0fce80c09579f5c0d2ee590b33"
      ],
      "author": {
        "name": "Ronny Berndt",
        "email": "ronny@apache.org",
        "time": "Wed Apr 22 09:42:20 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Apr 22 09:42:20 2026 +0200"
      },
      "message": "Update CI badge URL in README.rst (#5974)"
    }
  ],
  "next": "8491b4417bd7ff0fce80c09579f5c0d2ee590b33"
}
