1.1. 3.5.x Branch
1.1.1. Version 3.5.0
1.1.1.1. Highlights
#5399, #5441, #5443, #5460, #5461: Implement parallel
pread
calls: lets clients issue concurrentpread
calls without blocking each other or having to wait for all writes andfsync
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 ascouch_cfile
to allow multipledup()
’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’sfile
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 throughputread
_all_docs
withinclude_docs=true
: 25% more throughputread
_changes
: 4% more throughputsingle 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 between1
and100
. 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 eachdevice_id
if we had a key like[device_id, timestamp]
if we query the view withgroup_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.1.2. Performance
#5499: QuickJS rope based string implementation.
#5451: Optimize config system to use persistent terms.
#5437: Fix
atts_since
functionality for documentGET
requests. Avoids re-replicating attachment bodies on doc updates.#5398: Save 1
write
for each committing data to disk by usingfdatasync
while keeping the same level of storage reliability.
1.1.1.3. Features
#5526: Default
upgrade_hash_on_auth
totrue
. Downgrading to3.4.1
,3.4.2
, or3.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.
#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 fromcouch_work_queue
.#5402: Remove unused, undocumented and detrimental idle check timeout feature.
#5395: Remove unused, undocumented and unreliabele
pread_limit
feature fromcouch_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
#5515: Make sure
query_limit
config takes effect. Raise default limit from2^28
to2^59
. Allowinfinity
as a more ergonomic config value.#5522: Reopen indexes closed by Lucene in Nouveau.
#5508: Fix array
from()
andat()
for QuickJS.#5502: Buffer overflow and segfault fix in QuickJS.
#5463: Fix
badarith
in Nouveau index query.#5447: Fix arithmetic mean in
_prometheus
.#5440: Fix
_purged_infos
when exceedingpurged_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.
#5432: Add conceptual docs for Mango.
#5428: Fix wrong link in example in
CONTRIBUTING.md
.#5400: Clarify RHEL9 installation caveats.
#5338: Clouseau: document version in
/_version
endpoint.#5316, #5325, #5426, #5442, #5445: Document various JavaScript engine incompatibilities, including SpiderMonkey 1.8.5 vs. newer SpiderMonkey and SpiderMonkey vs. QuickJS.
#5323: Nouveau: improve install instructions.
1.1.1.5.1. 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.