1.1. 3.5.x Branch

1.1.1. Version 3.5.0

1.1.1.1. Highlights

  • #5399, #5441, #5443: 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.

1.1.1.2. Performance

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

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

1.1.1.3. Features

  • #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.

  • #5359: 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.1.4. Bugfixes

  • #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.1.5. Docs

  • #5433: Mango: document Nouveau index type.

  • #5433: Nouveau: document Mango index type.

  • #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.1.5.1. Tests

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

1.1.1.6. Builds

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

1.1.1.7. Other

There’s always IOPS in the banana stand.