# 1.1. 3.5.x Branch

## 1.1.1. Version 3.5.2

### 1.1.1.1. Features

- #5628, #5940: Nouveau Lucene 10 upgrade. Lucene is bumped to `10.4.0`. New Nouveau indexes use Lucene 10 by default. Existing Lucene 9 indexes continue to work via version negotiation, and an upgrade scanner (`nouveau_index_upgrader`) can rebuild them at a configurable rate.

- #5896: Nouveau bulk index updates. Replace doc-at-a-time updates to bulk updates which should improve index building.

- #5942: Fix cluster index cleanup. Adds the `[couchdb] index_cleanup_delay_msec` setting.

- #5624: Use SpiderMonkey 128 as the default version.

- #5754: Support safe secret rotation.

- #5811: Avoid updating password hash when request uses simple password scheme.

### 1.1.1.2. Performance

- #5984: Update Jiffy to `2.0`. Jiffy 2.0 has a number of performance optimization which should speed up both encoding and decoding.

- #5908: Optimize replicator. Use `gen_server` casts to queue docs for `_bulk_docs` in replication workers instead of synchronous calls.

- #5992: Do not run a full GC after each index doc update. Increase view queue size from 100KB to 10MB. This should improve view index building times.

- #5942: Pre-fetch design docs once per cleanup request and reuse signatures across nodes (instead of fetching them on every worker).

### 1.1.1.3. Bugfixes

- #5776, #5704, #5701, #5708, #5707, #5702, #5694, #5691, #5731, #5867: QuickJS updates. Memory leak fixes, use-after-free fixes in workers and regex, regex memory blowup fix, Unicode 17 support, FP16 support, optimized string operations, faster context creation, closure optimization, iterator improvements.

- #5776: Fix purge `mem3_rep` client verification.

- #5830: Fix race condition during purge checkpoint creation.

- #5825: Fix handling shards dbs purge checkpoints in `mem3_rep`. Consider previous-node replications for `_dbs` purge checkpoints.

- #5917: Fix signatures in mrview purge checkpoints. Avoid creating purge checkpoints for invalid views. Do not reset dreyfus `purge_seq` back to 0.

- #5940: Initialise nouveau index `purge_seq` from db `purge_seq`, and commit purge seq update before returning.

- #5939: Handle cases when dreyfus checkpoint is out-of-sync with the index. Fix view compaction duration logging.

- #5793: Fix replicator scheduler total jobs metric.

- #5793: Fix Prometheus metrics annotations.

- #5893: Improve replication `since_seq` parameter handling.

- #5865: Fix intermittent `_scheduler/docs` 500 error.

- #5853: Tolerate invalid `typ` claim when not required.

- #5846: Tolerate maintenance mode and a node down in partition info calls.

- #5628: Fix `bulk_get` error handling.

- #5978: Fix `_find` when over threshold. Use `errstr()` instead of `toSource()` in nouveau JS wrapper.

- #5984: Fix `ReferenceError` in QuickJS dispatch.

- #5893: Send 404 for `/_all_dbs` and `/_dbs_info` with extra path parts.

### 1.1.1.4. Docs

- #5973: Fix Jenkins badge link in README.

- #5974: Update CI badge URL in `README.rst`.

- #5984: Add missing comment from docs.

- #5865: Fix docs about replication.

- #5925: Change CouchDB links to use HTTPS.

- #5924: Update URLs to use HTTPS in mac installation guide.

### 1.1.1.5. Tests/CI/Builds

- #5825, #5914, #5854, #5843: CI parallelism. Parallel `make eunit` (sub-targets / `-j4` / Windows). Concat eunit test logs and remove tmp dirs in `Makefile`. Speed up compiling and release building.

- #5971: Update Black to `26.3.1`.

- #5967: Make creation of `couch.uri` independent of `--auto-ports`. Make file path for `couch.uri` absolute.

- #5964: Use `couchdb.uri` only when auto-ports is enabled. Clean up the `couch.uri` on `make devclean`.

- #5687: Write `couch_uri` files so ports are discoverable with `--auto-ports` option.

- #5864: Enable EUnit/Elixir/Nouveau tests on Windows.

- #5894: Improve / fix Jenkins workspace cleanup.

- #5938: CI: enable xref checking for undefined functions.

- #5805: Don’t run tests if we only change `.github` configuration.

- #5897: Temporarily disable freebsd-arm worker.

- #5908: Improve CI performance by combining some stages.

- #5908: Add Trixie to CI.

- #5805: Update Elixir tests and config files.

## 1.1.2. Version 3.5.1

### 1.1.2.1. Features

- #5626, #5665: Debian Trixie support

- #5709: Automatic Nouveau and Clouseau index cleanup

- #5697: Add UUID v7 as a `uuid` algorithm option. The default is still the default `sequential` algorithm.

- #5713, #5697, #5701, #5704: Purge improvements and fixes. Optimize it up to ~30% faster for large batches. `max_document_id_number` setting was removed and `max_revisions_number` set to `unlimited` by default to match `_bulk_docs` and `_bulk_get` endpoints.

- #5611: Implement the ability to downgrade CouchDB versions

- #5588: Populate zone from `COUCHDB_ZONE` env variable in Docker

- #5563: Set Erlang/OTP 26 as minimum supported version

- #5546, #5641: Improve Clouseau service checks in `clouseau_rpc` module.

- #5639: Use OS certificates for replication

- #5728: Configurable reduce limit threshold and ratio

### 1.1.2.2. Performance

- #5625: BTree engine term cache

- #5617: Optimize Nouveau searches when index is fresh

- #5598: Use HTTP/2 for Nouveau

- #5701: Optimize revid parsing: 50-90% faster. Should help purge requests as well as `_bulk_docs` and `_bulk_get` endpoints.

- #5564: Use the built-in binary hex encode

- #5613: Improve scanner performance

- #5545: Bump process limit to 1M

### 1.1.2.3. Bugfixes

- #5722, #5683, #5678, #5646, #5630, #5615, #5696: Scanner fixes. Add write limiting and switch to traversing documents by sequence IDs instead of by document IDs.

- #5707, #5706, #5706, #5694, #5691, #5669, #5629, #5574, #5573, #5566, #5553, #5550, #5534, #5730: QuickJS Updates. Optimized string operations, faster context creation, a lot of bug fixes.

- #5719: Use “all” ring options for purged_infos

- #5649: Retry call to dreyfus index on noproc errors

- #5663: More informative error if epochs out of order

- #5649: Dreyfus retries on error

- #5643: Fix reduce_limit = log feature

- #5620: Use copy_props in the compactor instead of set_props

- #5632, #5627, #5607: Nouveau fixes. Enhance `_nouveau_cleanup`. Improve security on http/2.

- #5614: Stop replication jobs to nodes which are not part of the cluster

- #5596: Fix query args parsing during cluster upgrades

- #5595: Make replicator shutdown a bit more orderly

- #5595: Avoid making a mess in the logs when stopping replicator app

- #5588: Fix `couch_util:set_value/3`

- #5587: Improve `mem3_rep:find_source_seq/4` logging

- #5586: Don’t wait indefinitely for replication jobs to stop

- #5578: Use `[sync]` option in `couch_bt_engine:commit_data/1`

- #5556: Add guards to `fabric:design_docs/1` to prevent `function_clause` error

- #5555: Improve replicator client mailbox flush

- #5551: Handle `bad_generator` and `case_clause` in `ken_server`

- #5552: Improve cluster startup logging

- #5552: Improve mem3 supervisor

- #5552: Handle shard opener tables not being initializes better

- #5549: Don’t spawn more than one `init_delete_dir` instance

- #5535: Disk monitor always allows `mem3_rep` checkpoints

- #5536: Fix `mem3_util` overlapping shards

- #5533: No cfile support for 32bit systems

- #5688: Handle timeout in `dreyfus_fabric_search`

- #5548: Fix config key typo in mem3_reshard_dbdoc

- #5540: Ignore extraneous cookie in replicator session plugin

### 1.1.2.4. Cleanups

- #5717: Do not check for Dreyfus. It’s part of the tree now.

- #5715: Remove Hastings references

- #5714: Cleanup fabric r/w parameter handling

- #5693: Remove explicit erlang module prefix for auto-imported functions

- #5686: Remove `erlang:` prefix from `erlang:error()`

- #5686: Fix `case_clause` when got `missing_target` error

- #5690: Fix props caching in mem3

- #5680: Implement db doc updating

- #5666: Replace `gen_server:format_status/2` with `format_status/1`

- #5672: Cache and store mem3 shard properties in one place only

- #5644: Remove redundant `*_to_list` / `list_to_*` conversion

- #5633: Use `config:get_integer/3` in couch_btree

- #5618: DRY out `couch_bt_engine` header pointer term access

- #5614: Stop replication jobs to nodes which are not part of the cluster

- #5610: Add a `range_to_hex/1` utility function

- #5565: Use maps comprehensions and generators in a few places

- #5649: Remove pointless message

- #5649: Remove obsolete clauses from dreyfus

- #5621: Minor couch_btree refactoring

### 1.1.2.5. Docs

- #5705: Docs: Update the /_up endpoint docs to include status responses

- #5653: Document that _all_dbs endpoint supports inclusive_end query param

- #5575: Document how to mitigate high memory usage in docker

- #5600: Avoid “master” wording at setup cluster

- #5381: Change unauthorized example to 401 for replication

- #5682: Update install instructions

- #5674: Add setup documentation for two factor authentication

- #5562: Add AI policy

- #5548: Fix reshard doc section name

- #5543: Add `https` to allowed replication proxy protocols

### 1.1.2.6. Tests/CI/Builds

- #5720: Update deps: Fauxton, meck and PropEr

- #5708: Improve search test

- #5702: Increase timeout for process_response/3 to fix flaky tests

- #5703: Use deterministic doc IDs in Mango key test

- #5692: Implement ‘assert_on_status’ macro

- #5684: Sequester docker ARM builds and fail early

- #5679: Add `--disable-spidermonkey` to `--dev[-with-nouveau]`

- #5671: Print request/response body on errors from mango test suite

- #5670: Fix `make clean` after `dev/run --enable-tls`

- #5668: Update xxHash

- #5667: Update mochiweb to v3.3.0

- #5664: Disable ppc64le and s390x builds

- #5604: Use ASF fork of `gun` for `cowlib` dependency

- #5636: Reduce btree prop test count a bit

- #5633: Fix and improve couch_btree testing

- #5572: Remove a few more instances of Ubuntu Focal

- #5571: Upgrade Erlang for CI

- #5570: Skip macos CI for now and remove Ubuntu Focal

- #5488: Bump Clouseau to 2.25.0

- #5541: Enable Clouseau for the Windows CI

- #5537: Add retries to native full CI stage

- #5531: Fix Erlang cookie configuration in `dev/run`

- #5662: Remove old Jenkinsfiles

- #5661: Unify CI jobs

## 1.1.3. Version 3.5.0

### 1.1.3.1. Highlights

- #5399, #5441, #5443, #5460, #5461: Implement parallel `pread` calls: lets clients issue concurrent `pread` calls without blocking each other or having to wait for all writes and `fsync` calls. This is enabled by default and can be disabled with `[couchdb] use_cfile = false` in the configuration.

  CouchDB already employs a multiple-parallel-read and concurrent serial-write design at the database engine layer, but below that in the storage engine, each file representing a database shard is required to route all read / write / sync requests through a single Erlang process that owns the file descriptor (fd).

  An Erlang process can at most execute at the speed of a single CPU core. Two scenarios can lead to a starvation of the fd-owning Erlang process message inbox:

  > - 1000s of concurrent read requests with a constant stream of writes per shard, or:

  > - a high latency storage devices like network block storage.

  Parallel preads re-implements the Erlang `file` module in parts as `couch_cfile` to allow multiple `dup()`’d file descriptors to be used for reading and writing. Writes continue to be serialised at the database engine layer, but reads now are no longer blocked by writes waiting to commit.

  Comes with an extensive test suite that includes property testing to ensure `couch_cfile` behaves exactly like Erlang’s `file` in all other cases.

  Performance is always equal or better than before. These scenarios show preliminary improvements:

  - random document reads: 15% more throughput

  - read `_all_docs`: 15% more throughput

  - read `_all_docs` with `include_docs=true`: 25% more throughput

  - read `_changes`: 4% more throughput

  - single document writes: 8% more throughput

  - 2000x concurrent clients, random document reads on a 12 node cluster: 30% more throughput

  - concurrent constant document writes and concurrent single document reads on a single shard: 40% more throughput.

    This feature is not available on Windows.

- #5435: Improve default `chttpd_server` options. This helps with faster processing of many concurrent TCP connections.

- #5347: Fix attachment size calculation. This could lead to shards not being scheduled for compaction correctly.

- #5494: Implement `_top_N` and `_bottom_N` reducers. These reducers return the top or bottom values from a map-reduce view. `N` is a number between `1` and `100`. For instance, a `_top_5` reducer will return the top 5 highest values for a group level.

- #5498: Implement `_first` and `_last` reducers. These reducers return the first, and respectively, the last view row for a given group level. For example, `_last` can be used to retrieve the last timestamp update for each `device_id` if we had a key like `[device_id, timestamp]` if we query the view with `group_level=1`.

- #5466: Conflict finder plugin. Enable the `couch_scanner_plugin_conflict_finder` plugin to find conflicting docs across all the databases. It can be configured to report individual revisions or aggregated statistics.

### 1.1.3.2. Performance

- #5499: QuickJS rope based string implementation.

- #5451: Optimize config system to use persistent terms.

- #5437: Fix `atts_since` functionality for document `GET` requests. Avoids re-replicating attachment bodies on doc updates.

- #5398: Save 1 `write` for each committing data to disk by using `fdatasync` while keeping the same level of storage reliability.

### 1.1.3.3. Features

- #5526: Default `upgrade_hash_on_auth` to `true`. Downgrading to `3.4.1`, `3.4.2`, or `3.4.3` is safe. Those versions know how to verify these new password hashes.

- #5517: Enable xxHash file checksums by default. Downgrading to `3.4.x` versions should be safe. Those versions know how to read and verify xxHash checksums.

- #5527: Update Fauxton and xxHash dependencies.

- #5525: Array opcode optimization for QuickJS.

- #5518: More precise error location reporting for QuickJS.

- #5507, #5510, #5509: Erlang 28 compatibiliity.

- #5516: Detailed node membership info for Prometheus.

- #5489: Allow TLS client certs for Nouveau requests.

- #5452: `BigInt` support for QuickJS.

- #5439: Nouveau: upgrade `dropwizard` to 4.0.12.

- #5429: Add `simple+pbkdf2` migration password scheme.

- #5424: Scanner: reduce log noise, fix QuickJS plugin mocks, gracefully handle broken search indexes.

- #5421: Nouveau: upgrade Lucene to 9.12.1.

- #5414: Remove unused `multi_workers` option from `couch_work_queue`.

- #5402: Remove unused, undocumented and detrimental idle check timeout feature.

- #5395: Remove unused, undocumented and unreliabele `pread_limit` feature from `couch_file`.

- #5385: Clean up `fabric_doc_update` by introducing an `#acc` record.

- #5372: Upgrade to Elixir 1.17.

- #5351: Clouseau: show version in `/_version` endpoint.

- #5338: Scanner: add Nouveau and Clouseau design doc validation.

- #5335: Nouveau: support reading older Lucene 9x indexes.

- #5327, #5329, #5419: Allow switching JavaScript engines at runtime.

- #5326, #5328: Allow clients to specify HTTP request ID, including UUIDs.

- #5321, #5366, #5413: Add support for SpiderMonkey versions 102, 115 and 128.

- #5317: Add quickjs to the list of welcome features.

### 1.1.3.4. Bugfixes

- #5515: Make sure `query_limit` config takes effect. Raise default limit from `2^28` to `2^59`. Allow `infinity` as a more ergonomic config value.

- #5522: Reopen indexes closed by Lucene in Nouveau.

- #5508: Fix array `from()` and `at()` for QuickJS.

- #5502: Buffer overflow and segfault fix in QuickJS.

- #5469, #5471: Retry closed connections in Nouveau.

- #5463: Fix `badarith` in Nouveau index query.

- #5447: Fix arithmetic mean in `_prometheus`.

- #5440: Fix `_purged_infos` when exceeding `purged_infos_limit`.

- #5431: Restore the ability to return `Error` objects from map().

- #5417: Clouseau: add a version check to `connected()` function to reliably detect if a Clouseau node is ready to be used.

- #5416: Ensure we always map the documents in order in `couch_mrview_updater`. While views still built correctly, this behaviour simplifies debugging.

- #5373: Fix checksumming in `couch_file`, consolidate similar functions and bring test coverage from 66% to 90%.

- #5367: Scanner: be more resilient in the face of non-deterministic functions.

- #5345: Scanner: be more resilient in the face of incomplete sample data.

- #5344: Scanner: allow empty doc fields.

- #5341: Improve Mango test reliability.

- #5337: Prevent a broken `mem3` app from permanently failing replication.

- #5334: Fix QuickJS scanner `function_clause` error.

- #5332: Skip deleted documents in the scanner.

- #5331: Skip validation for design docs in the scanner.

- #5330: Prevent inserting illegal design docs via Mango.

### 1.1.3.5. Docs

- #5433: Mango: document Nouveau index type.

- #5432: Add conceptual docs for Mango.

- #5428: Fix wrong link in example in `CONTRIBUTING.md`.

- #5400: Clarify RHEL9 installation caveats.

- #5380, #5404: Fix various typos.

- #5338: Clouseau: document version in `/_version` endpoint.

- #5340, #5412: Nouveau: document search cleanup API.

- #5316, #5325, #5426, #5442, #5445: Document various JavaScript engine incompatibilities, including SpiderMonkey 1.8.5 vs. newer SpiderMonkey and SpiderMonkey vs. QuickJS.

- #5320, #5374: Improve auto-lockout feature documentation.

- #5323: Nouveau: improve install instructions.

#### 1.1.3.5.1. Tests

- #5492: Enable Clouseau testing for FreeBSD

- #5490: Enable Clouseau testing for MacOS

- #5397: Fix negative-steps error in Elixir tests.

### 1.1.3.6. Builds

- #5360: Use `brew --prefix` to find ICU paths on macOS.

### 1.1.3.7. Other

There’s always IOPS in the banana stand.