.. Licensed under the Apache License, Version 2.0 (the "License"); you may not
.. use this file except in compliance with the License. You may obtain a copy of
.. the License at
..
..   http://www.apache.org/licenses/LICENSE-2.0
..
.. Unless required by applicable law or agreed to in writing, software
.. distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
.. WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
.. License for the specific language governing permissions and limitations under
.. the License.

.. _release/3.0.x:

============
3.0.x Branch
============

.. contents::
    :depth: 1
    :local:

.. _release/3.0.x/upgrade:

Upgrade Notes
=============

* :ghissue:`2228`: The default maximum document size has been reduced to 8MB. This means
  that databases with larger documents will not be able to replicate into CouchDB 3.0
  correctly without modification. This change has been made in preparation for
  anticipated hard upper limits on document size imposed by CouchDB 4.0. For 3.x,
  the max document size setting can be relaxed via the ``[couchdb] max_document_size``
  config setting.

* :ghissue:`2228`: The default database sharding factor ``q`` has been reduced to 2 by
  default. This, combined with automated database resharding (see below), is a better
  starting place for new CouchDB databases. As in CouchDB 2.x, specify ``?q=#`` to
  change the value upon database creation if desired. The default can be changed
  via the config ``[cluster] q`` setting.

* :ghissue:`1523`, :ghissue:`2092`, :ghissue:`2336`, :ghissue:`2475`: The "node-local"
  HTTP interface, by default exposed on port 5986, has been removed. All functionality
  previously available at that port is now available on the main, clustered interface (by
  default, port 5984). Examples:

  .. code-block:: javascript

    GET /_node/{nodename}/_stats
    GET /_node/{nodename}/_system
    GET /_node/{nodename}/_all_dbs
    GET /_node/{nodename}/_uuids
    GET /_node/{nodename}/_config
    GET /_node/{nodename}/_config/couchdb/uuid
    POST /_node/{nodename}_config/_reload
    GET /_node/{nodename}/_nodes/_changes?include_docs=true
    PUT /_node/{nodename}/_dbs/{dbname}
    POST /_node/{nodename}/_restart
    GET /_node/{nodename}/{db-shard}
    GET /_node/{nodename}/{db-shard}/{doc}
    GET /_node/{nodename}/{db-shard}/{ddoc}/_info

  ...and so on. Documentation has been updated to reflect this change.

  .. warning::
     The _node endpoint is for adminstrative purposes it is NOT
     intended as an alternative to the regular endpoints ("GET
     /dbname", "PUT /dbname/docid" and so on)

* :ghissue:`2389`: CouchDB 3.0 now requires a server admin user to be defined at
  startup, or will print an error message and exit. If you do not have one, be sure
  to :ref:`create an admin user<config/admins>`. (The Admin Party is now over.)

.. figure:: ../../images/23379351593_0c480537de_q.jpg
  :align: center
  :alt: Dizzy the cat with a Santa hat.

  CC-BY-NC 2.0: `hehaden @ Flickr <https://www.flickr.com/photos/hellie55/23379351593/>`_

* :ghissue:`2576`: CouchDB 3.0 now requires admin-level access for the ``/_all_dbs``
  endpoint.

* :ghissue:`2339`: All databases are now created by default as admin-only. That is, the
  default new database ``_security`` object is now:

  .. code-block:: javascript

    {
      "members" : { "roles" : [ "_admin" ] },
       "admins" : { "roles" : [ "_admin" ] }
    }

  This can be changed after database creation.

* Due to code changes in :ghissue:`2324`, it is not possible to upgrade transparently from
  CouchDB 1.x to 3.x. In addition, the ``couchup`` utility has been removed from CouchDB
  3.0 by :ghissue:`2399`. If you are upgrading from CouchDB 1.x, you must first upgrade
  to CouchDB 2.3.1 to convert your database and indexes, using ``couchup`` if desired.
  You can then upgrade to CouchDB 3.0. Or, you can start a new CouchDB 3.0 installation
  and replicate directly from 1.x to 3.0.

* :ghissue:`1833`, :ghissue:`2358`, :ghissue:`1871`, :ghissue:`1857`: CouchDB 3.0 supports
  running only under the following Erlang/OTP versions:

  * 19.x - "soft" support only. No longer tested, but should work.
  * 20.x - must be newer than 20.3.8.11 (20.0, 20.1, 20.2 versions all invalid)
  * 21.x - for 21.2, must be newer than 21.2.3
  * 22.x - for 22.0, must be newer than 22.0.5

* :ghissue:`1804`: By default, views are limited to return a maximum of 2**28 (268435456)
  results. This limit can be configured separately for views and partitioned views via
  the ``query_limit`` and ``partition_query_limit`` values in the ini file
  ``[query_server_config]`` section.

* After upgrading all nodes in a cluster to 3.0, add ``[rexi] use_kill_all = true`` to
  ``local.ini`` to save some intra-cluster network bandwidth.

Deprecated feature removal
--------------------------

The following features, deprecated in CouchDB 2.x, have been removed or replaced in
CouchDB 3.0:

* :ghissue:`2089`, :ghissue:`2128`, :ghissue:`2251`: Local endpoints for replication
  targets, which never functioned as expected in CouchDB 2.x, have been completely
  removed. When replicating databases, always specify a full URL for the source and
  target. In addition, the node local ``_replicator`` database is no longer automatically
  created.

* :ghissue:`2163`: The ``disk_size`` and ``data_size`` fields have been retired from the
  database info object returned by ``GET /{db}/``. These were deprecated in CouchDB 2.x
  and replaced by the ``sizes`` object, which contains the improved ``file``,
  ``active`` and ``external`` size metrics. Fauxton has been updated to match.

* :ghissue:`2173`: The ability to submit multiple queries against a view using
  the :method:`POST` to ``/{db}/_design/{ddoc}/_view/{view}`` with the
  ``?queries=`` option has been replaced by the new :ref:`queries
  <api/ddoc/view/multiple_queries>` endpoint. The same is true of the
  :ref:`_all_docs, _design_docs, and _local_docs <api/db/all_docs>` endpoints.
  Specify a ``keys`` object when :method:`POST`-ing to these endpoints.

* :ghissue:`2248`: CouchDB externals (``_external/``) have been removed entirely.

* :ghissue:`2208`: CouchDB no longer supports the ``delayed_commits`` option in the
  configuration file. All writes are now full commits. The ``/_ensure_full_commit``
  API endpoint has been retained (as a no-op) for backwards compatibility with old
  CouchDB replicators.

* :ghissue:`2395`: The security object in the ``_users`` database cannot be edited by
  default. A setting exists in the configuration file to revert this behaviour. The
  ability to override the disable setting is expected to be removed in CouchDB 4.0.

Deprecated feature warnings
---------------------------

The following features are deprecated in CouchDB 3.0 and will be removed in CouchDB 4.0:

* Show functions (``/{db}/{ddoc}/_show``)

* List functions (``/{db}/{ddoc}/_list``)

* Update functions (``/{db}/{ddoc}/_update``)

* Virtual hosts and ini-file rewrites

* Rewrite functions (``/{db}/{ddoc}/_rewrite``)

.. _release/3.0.1:

Version 3.0.1
=============

Features and Enhancements
-------------------------

* Fauxton was updated to version `v1.2.3`.

Bugfixes
--------

* :ghissue:`2441`: A memory leak when encoding large binary content was patched.
  This should resolve a long-standing gradual memory increase bug in CouchDB.

* :ghissue:`2613`: Simultaneous attempts to create the same new database should
  no longer result in a :statuscode:`500` error.

* :ghissue:`2678`: Defaults for the ``smoosh`` compaction daemon are now consistent
  with the shipped ``default.ini`` file.

* :ghissue:`2680`: The Windows CouchDB startup batch file will no longer fail to
  start CouchDB if incompatible versions of OpenSSL are on the ``PATH``.

* :ghissue:`2741`: A small performance improvement in the ``couch_server`` process
  was made.

* :ghissue:`2745`: The ``require_valid_user`` exception logic was corrected.

* :ghissue:`2643`: The ``users_db_security_editable`` setting is now in the correct
  section of the ``default.ini`` file.

* :ghissue:`2654`: Filtered changes feeds that need to rewind partially should no
  longer rewind all the way to the beginning of the feed.

* :ghissue:`2655`: When deleting a session cookie, CouchDB should now respect the
  operator-specified cookie domain, if set.

* :ghissue:`2690`: Nodes that re-enter a cluster after a database was created (while
  the node was offline or in maintenance mode) should more correctly handle
  creating local replicas of that database.

* :ghissue:`2805`: Mango operators more correctly handle being passed empty arrays.

* :ghissue:`2716`, :ghissue:`2738`: The ``remsh`` utility will now try and guess the
  node name and Erlang cookie of the local installation. It will also respect the
  ``COUCHDB_ARGS_FILE`` environment variable.

* :ghissue:`2797`: The cluster setup workflow now uses the correct logging module.

* :ghissue:`2818`: Mango now uses a safer method of bookmark creation that prevents
  unexpectedly creating new Erlang atoms.

* :ghissue:`2756`: SpiderMonkey 60+ will no longer corrupt UTF-8 strings when
  various JS functions are applied to them.

* Multiple test case improvements, including more ports of JS tests to Elixir.

.. _release/3.0.0:

Version 3.0.0
=============

Features and Enhancements
-------------------------

.. rst-class:: open

* :ghissue:`1789`: :ref:`User-defined partitioned databases <partitioned-dbs>`.

  These special databases support user-driven placement of documents into the same
  shard range. :ref:`JavaScript views <api/partitioned/views>` and :ref:`Mango
  indexes <api/partitioned/find>` have specific optimizations for partitioned databases
  as well.

  Two tweakable configuration parameters exist:

  * :ghissue:`1842`: Partition size limits. By default, each partition is limited
    to 10 GiB.
  * :ghissue:`1684`: Partitioned database support can be disabled via feature
    flag in ``default.ini``.

* :ghissue:`1972`, :ghissue:`2012`: :ref:`Automated shard splitting
  <cluster/sharding/splitting_shards>`.  Databases can now be re-sharded *while online*
  to increase the ``q`` factor to a larger number. This can be configured to
  require specific node and range parameters upon execution.

* :ghissue:`1910`: :ref:`Automatic background indexing <config/index_builds>`,
  internally known as ``ken``. This subsystem ensures secondary indexes (such
  as JavaScript, Mango, and text search) are kept up to date, without requiring
  an external query to trigger building them. Many configuration parameters are
  available.

* :ghissue:`1904`: Completely rewritten :ref:`automatic compaction daemon
  <compact/auto>`, internally known as ``smoosh``. This subsystem automatically
  triggers background compaction jobs for both databases and views, based on
  :ref:`configurable thresholds <config/database_compaction>`.

* :ghissue:`1889`, :ghissue:`2408`: New IO Queue subsystem implementation.
  This is :ref:`highly configurable and well-documented <config/ioq>`.

* :ghissue:`2436`, :ghissue:`2455`: CouchDB now regression tests against, and officially
  supports, running on the ``arm64v8`` (``aarch64``) and ``ppc64le`` (``ppc64el``)
  machine architectures. Convenience binaries are generated on these architectures for
  Debian 10.x ("buster") packages, and for the Docker containers.

* :ghissue:`1875`, :ghissue:`2437`, :ghissue:`2423`: CouchDB now supports linking against
  SpiderMonkey 60 or SpiderMonkey 1.8.5. SpiderMonkey 60 provides enhanced support for
  ES5, ES6, and ES2016+. Full compatibility information is available at the
  `ECMAScript compatibility table`_. Click on "Show obsolete platforms", then look for
  "FF 60 ESR" in the list of engine types.

  However, it was discovered that on some ARM 64-bit distributions, SM 60 segfaults
  frequently, including the SM 60 packages on CentOS 8 and Debian 10.

  As a result, CouchDB's convenience binaries **only link against SM 60 on the
  ``x86_64`` and ``ppc64le`` architectures**. This includes the Docker image for these
  architectures.

  At present, CouchDB ships with SM 60 linked in on the following binary distributions:

  * Debian buster (10.x)
  * CentOS / RedHat 8.x
  * macOS (10.10+)
  * Windows (7+)
  * Docker (3.0.0)
  * FreeBSD (CURRENT)

  We expect to add SM 60 support to Ubuntu with Focal Fossa (20.04 LTS) when it ships in
  April 2020.

  It is unlikely we will backport SM 60 packages to older versions of Debian, CentOS,
  RedHat, or Ubuntu.

* The Windows installer has many improvements, including:

  * Prompts for an admin user/password as CouchDB 3.0 requires
    * Will not overwrite existing credentials if in place
  * No longer remove user-modified config files, closing :ghissue:`1989`
    * Also will not overwrite them on install.
  * Checkbox to disable installation of the Windows service
  * :ref:`Silent install support <install/windows/silent>`.
  * Friendly link to these online release notes in the exit dialog
  * Higher resolution icon for HiDPI (500x500)

.. warning::
    Windows 8, 8.1, and 10 require the `.NET Framework v3.5`_ to be installed.

* :ghissue:`2037`: Dreyfus, the CouchDB side of the Lucene-powered search solution, is now
  shipped with CouchDB. When one or more Clouseau Java nodes are joined to the cluster,
  text-based indexes can be enabled in CouchDB. It is recommended to have as many Clouseau
  nodes as you have CouchDB nodes. Search is advertised in the feature list present at
  ``GET /`` if configured correctly (:ghissue:`2206`).  :ref:`Configuration
  <config/search>` and :ref:`installation documentation is available <install/search>`.

* :ghissue:`2411`: The ``/_up`` endpoint no longer requires authentication, even when
  ``require_valid_user`` is ``true``.

* :ghissue:`2392`: A new ``_metrics`` role can be given to a user. This allows that
  user access only to the ``/_node/{node}/_stats`` and ``/_node/{node}/_system``
  endpoints.

* :ghissue:`1912`: A new alternative ``systemd-journald logging`` backend has been added,
  and can be enabled through the ini file. The new backend does not include CouchDB's
  microsecond-accurate timestamps, and uses the ``sd-daemon(3)`` logging levels.

* :ghissue:`2296`, :ghissue:`1977`: If the configuration file setting ``[couchdb]``
  ``single_node`` is set to ``true``, CouchDB will automatically create the system
  databases on startup if they are not present.

* :ghissue:`2338`, :ghissue:`2343`: :method:`POST` request to CouchDB views and the
  ``/{db}/_all_docs``, ``/{db}/_local_docs`` and ``/{db}/_design_docs`` endpoints now
  support the same functionality as :method:`GET`.  Parameters are passed in the body as a
  JSON object, rather than in the URL when using :method:`POST`.

* :ghissue:`2292`: The ``_scheduler/docs`` and ``_scheduler/info`` endpoints now return
  detailed replication stats for running and pending jobs.

* :ghissue:`2282`, :ghissue:`2272`, :ghissue:`2290`: CouchDB now supports specifying
  separate proxies for both the ``source`` and ``target`` in a replication via
  ``source_proxy`` and ``target_proxy`` keys. The :ref:`API documentation
  <api/server/replicate>` has been updated.

* :ghissue:`2240`: Headers are now returned from the ``/{db}/_changes`` feed
  immediately, even when there are no changes available. This avoids client
  blocking.

* :ghissue:`2005`, :ghissue:`2006`: The name of any node can now be retrieved through
  the :ref:`new API endpoint <api/server/name>` ``GET /_node/{node-name}``.

* :ghissue:`1766`: Timeouts for requests, ``all_docs``, attachments, views, and
  partitioned view requests can all be specified separately in the ini file under
  the ``[fabric]`` section. See ``default.ini`` for more detail.

* :ghissue:`1963`: Metrics are now kept on the number of partition and global view
  queries, along with the number of timeouts that occur.

* :ghissue:`2452`, :ghissue:`2221`: A new configuration field ``[couch_httpd_auth]
  same_site`` has been added to set the value of the CouchDB auth cookie's ``SameSite``
  attribute.  It may be necessary to set this to ``strict`` for compatibility with future
  versions of Google Chrome. If CouchDB CORS support is enabled, set this to ``None``.

Performance
-----------

.. rst-class:: open

* :ghissue:`2277`: The ``couch_server`` process has been highly optimized, supporting
  significantly more load than before.

* :ghissue:`2360`: It is now possible to make the rexi interface's unacked message
  limit configurable. A new, more optimized default (5, lowered from 10) has been set.
  This results in a ~50% improvement on view queries on large clusters with ``q ≥ 8``.

* :ghissue:`2280`: Connection sharing for replication now functions correctly when
  replicating through a forward proxy. Closes :ghissue:`2271`.

* :ghissue:`2195`, :ghissue:`2207`: Metrics aggregation now supports CouchDB systems
  that sleep or hibernate, ensuring that on wakeup does not trigger thousands of
  unnecessary function calls.

* :ghissue:`1795`: Avoid calling ``fabric:update_docs`` with empty doc lists.

* :ghissue:`2497`: The setup wizard no longer automatically creates the
  ``_global_changes`` database, as the majority of users do not need this
  functionality. This reduces overall CouchDB load.

Bugfixes
--------

.. rst-class:: open

* :ghissue:`1752`, :ghissue:`2398`, :ghissue:`1803`: The cluster setup wizard now ensures
  a consistent UUID and http secret across all nodes in a cluster. CouchDB admin passwords
  are also synced when the cluster setup wizard is used. This prevents being logged out
  when using Fauxton as a server admin user through a load balancer.

* :ghissue:`2388`: A compatibility change has been made to support replication with
  future databases containing per-document access control fields.

* :ghissue:`2379`: Any replicator error messages will provide an object in the response,
  or null, but never a string.

* :ghissue:`2244`, :ghissue:`2310`: CouchDB will no longer send more data than is
  requested when retrieving partial attachment data blocks.

* :ghissue:`2138`: Manual operator updates to a database's shard map will not
  corrupt additional database properties, such as partitioning values.

* :ghissue:`1877`: The ``_purge`` and ``_purged_infos_limit`` endpoints are now
  correctly restricted to server admin only.

* :ghissue:`1794`: The minimum purge sequence value for a database is now
  gathered without a clustered ``_all_docs`` lookup.

* :ghissue:`2351`: A timeout case clause in ``fabric_db_info`` has been normalised
  to match other case clauses.

* :ghissue:`1897`: The ``/{db}/_bulk_docs`` endpoint now correctly catches invalid
  (*i.e.*, non-hexadecimal) ``_rev_`` values and responds with a :statuscode:`400` error.

* :ghissue:`2321`: CouchDB no longer requires Basic auth credentials to reach the
  ``/_session`` endpoint for login, even when ``require_valid_user`` is enabled.

* :ghissue:`2295`: CouchDB no longer marks a job as failed permanently if the
  internal doc processor crashes.

* :ghissue:`2178`: View compaction files are now removed on view cleanup.

* :ghissue:`2179`: The error message logged when CouchDB does not have a ``_users``
  database is now less scary.

* :ghissue:`2153`: CouchDB no longer may return a ``badmatch`` error when querying
  ``all_docs`` with a passed ``keys`` array.

* :ghissue:`2137`: If search is not available, return a :statuscode:`400` instead of a
  :statuscode:`500` status code.

* :ghissue:`2077`: Any failed ``fsync(2)`` calls are now correctly raised to avoid
  data corruption arising from retry attempts.

* :ghissue:`2027`: Handle epoch mismatch when duplicate UUIDs are created through
  invalid operator intervention.

* :ghissue:`2019`: If a database is deleted and re-created while internal cluster
  replication is still active, CouchDB will no longer retry to delete it continuously.

* :ghissue:`2003`, :ghissue:`2438`: CouchDB will no longer automatically reset an index
  file if any attempt to read its header fails (such as when the couch_file process
  terminates unexpectedly).  CouchDB now also handles the case when a view file lacks a
  proper header.

* :ghissue:`1983`: Improve database "external" size calcuation to be more precise.

* :ghissue:`1971`: Correctly compare ETags using weak comparison methods to support
  `W/` prefix added by some load balancer configurations.

* :ghissue:`1901`: Invalid revision specified for a document update will no longer result
  in a ``badarg`` crash.

* :ghissue:`1845`: The ``end_time`` field in ``/_replicate`` now correctly converts time
  to UTC.

* :ghissue:`1824`: ``rexi`` stream workers are now cleaned up when the coordinator process
  is killed, such as when the ddoc cache is refreshed.

* :ghissue:`1770`: Invalid database ``_security`` objects no longer return a
  ``function_clause`` error and stack trace.

* :ghissue:`2412`: Mango execution stats now correctly count documents read which weren't
  followed by a match within a given shard.

* :ghissue:`2393`, :ghissue:`2143`: It is now possible to override the query server
  environment variables ``COUCHDB_QUERY_SERVER_JAVASCRIPT`` and
  ``COUCHDB_QUERY_SERVER_COFFEESCRIPT`` without overwriting the
  ``couchdb``/``couchdb.cmd`` startup scripts.

* :ghissue:`2426`, :ghissue:`2415`: The replicator now better handles the situation where
  design document writes to the target fail when replicating with non-admin credentials.

* :ghissue:`2444`, :ghissue:`2413`: Replicator error messages are now significantly
  improved, reducing ``function_clause`` responses.

* :ghissue:`2454`: The replication auth session plugin now ignores other cookies it may
  receive without logging an error.

* :ghissue:`2458`: Partitioned queries and dreyfus search functions no longer fail
  if there is a single failed node or rexi worker error.

* :ghissue:`1783`: Mango text indexes no longer error when given an empty selector or
  operators with empty arrays.

* :ghissue:`2466`: Mango text indexes no longer error if the indexed document revision
  no longer exists in the primary index.

* :ghissue:`2486`: The ``$lt``, ``$lte``, ``$gt``, and ``$gte`` Mango operators are
  correctly quoted internally when used in conjunction with a text index search.

* :ghissue:`2493`: The ``couch_auth_cache`` no longer has a runaway condition in which
  it creates millions of monitors on the ``_users`` database.

Other
-----

The 3.0.0 release also includes the following minor improvements:

.. rst-class:: open

* :ghissue:`2472`: CouchDB now logs the correct, clustered URI at startup (by default:
  port ``5984``.)

* :ghissue:`2034`, :ghissue:`2416`: The path to the Fauxton installation can now be
  specified via the ``COUCHDB_FAUXTON_DOCROOT`` environment variable.

* :ghissue:`2447`: Replication stats are both persisted when jobs are re-created, as well
  as properly handled when bulk document batches are split.

* :ghissue:`2410`, :ghissue:`2390`, :ghissue:`1913`: Many metrics were added for Mango
  use, including counts of unindexed queries, invalid index queries, docs examined that
  do and don't meet cluster quorum, query time, etc.

* :ghissue:`2152`, :ghissue:`2504`: CouchDB can now be started via a symlink to the
  binary on UNIX-based platforms.

* :ghissue:`1844`: A new internal API has been added to write custom Erlang
  request-level metrics reporting plugins.

* :ghissue:`2293`, :ghissue:`1095`: The ``-args_file``, ``-config`` and ``-couch_ini``
  parameters may now be overridden via the ``COUCHDB_INI_FILES`` environment variable
  on UNIX-based systems.

* :ghissue:`2352`: The ``remsh`` utility now searches for the Erlang cookie in
  ``ERL_FLAGS`` as well as ``vm.args``.

* :ghissue:`2324`: All traces of the (never fully functional) view-based ``_changes``
  feed have been expunged from the code base.

* :ghissue:`2337`: The md5 shim (introduced to support FIPS-compliance) is now
  used consistently throughout the code base.

* :ghissue:`2270`: Negative and non-integer ``heartbeat`` values now return
  :statuscode:`400`.

* :ghissue:`2268`: When rescheduling jobs, CouchDB now stops sufficient running jobs
  to make room for the pending jobs.

* :ghissue:`2186`: CouchDB plugin writers have a new field in which endpoint
  credentials may be stashed for later use.

* :ghissue:`2183`: ``dev/run`` now supports an ``--extra-args`` flag to modify the
  Erlang runtime environment during development.

* :ghissue:`2105`: ``dev/run`` no longer fails on unexpected remote end connection
  close during cluster setup.

* :ghissue:`2118`: Improve ``couch_epi`` process replacement mechanism using map
  childspecs functionality in modern Erlang.

* :ghissue:`2111`: When more than ``MaxJobs`` replication jobs are defined, CouchDB
  now correctly handles job rotation when some jobs crash.

* :ghissue:`2020`: Fix full ring assertion in fabric stream shard replacements

* :ghissue:`1925`: Support list for docid when using ``couch_db:purge_docs/3``.

* :ghissue:`1642`: ``io_priority`` is now set properly on view update and compaction
  processes.

* :ghissue:`1865`: Purge now supports >100 document IDs in a single request.

* :ghissue:`1861`: The ``vm.args`` file has improved commentary.

* :ghissue:`1808`: Pass document update type for additional checks in
  ``before_doc_update``.

* :ghissue:`1835`: Module lists are no longer hardcoded in ``.app`` files.

* :ghissue:`1798`, :ghissue:`1933`: Multiple compilation warnings were eliminated.

* :ghissue:`1826`: The ``couch_replicator_manager`` shim has been fully removed.

* :ghissue:`1820`: After restarting CouchDB, JS and Elixir tests now wait up to 30s for
  it to be ready before timing out.

* :ghissue:`1800`: ``make elixir`` supports specifying individual tests to run with
  ``tests=``.

* :ghissue:`1805`: ``dev/run`` supports ``--with-haproxy`` again.

* :ghissue:`1774`: ``dev/run`` now supports more than 3 nodes.

* :ghissue:`1779`: Refactor Elixir test suite initialization.

* :ghissue:`1769`: The Elixir test suite uses Credo for static analysis.

* :ghissue:`1776`: All Python code is now formatted using `Python black`_.

* :ghissue:`1786`: ``dev/run``: do not create needless ``dev/data/`` directory.

* :ghissue:`2482`: A redundant ``get_ring_opts`` call has been removed from
  ``dreyfus_fabric_search``.

* :ghissue:`2506`: CouchDB's release candidates no longer propagate the RC tags
  into each Erlang application's version string.

* :ghissue:`2511`: `recon`_, the Erlang diagnostic toolkit, has been added to
  CouchDB's build process and ships in the release + convenience binaries.

* Fauxton updated to v1.2.3, which includes:

  * Support multiple server-generated warnings when running queries

  * Partitioned database support

  * Search index support

  * Remove references to deprecated dbinfo fields

  * Improve accessibility for screen readers

  * Numerous CSS fixes

* Improved test cases:

  * Many, many test race conditions and bugs have been removed (PR list too long to
    include here!)

  * More test cases were ported to Elixir, including:

    * Cluster with and without quorum tests (:ghissue:`1812`)
    * ``delayed_commits`` (:ghissue:`1796`)
    * ``multiple_rows`` (:ghissue:`1958`)
    * ``invalid_docids`` (:ghissue:`1968`)
    * ``replication`` (:ghissue:`2090`)
    * All ``attachment_*`` tests (:ghissue:`1999`)
    * ``copy_doc`` (:ghissue:`2000`)
    * ``attachments`` (:ghissue:`1953`)
    * ``erlang_views`` (:ghissue:`2237`)
    * ``auth_cache``, ``cookie_auth``, ``lorem*``, ``multiple_rows``, ``users_db``,
      ``utf8`` (:ghissue:`2394`)
    * ``etags_head`` (:ghissue:`2464`, :ghissue:`2469`)

  * :ghissue:`2431`: ``chttpd_purge_tests`` have been improved in light of CI failures.

  * :ghissue:`2432`: Address flaky test failure on ``t_invalid_view/1``.

  * :ghissue:`2363`: Elixir tests now run against a single node cluster, in line with
    the original design of the JavaScript test suite. This is a permanent change.

  * :ghissue:`1893`: Add "w:3" for lots of doc tests.

  * :ghissue:`1939`, :ghissue:`1931`: Multiple fixes to improve support in constrained
    CI environments.
  * :ghissue:`2346`: Big-endian support for the ``couch_compress`` tests.

  * :ghissue:`2314`: Do not auto-index when testing ``update=false`` in Mango.

  * :ghissue:`2141`: Fix ``couch_views`` encoding test.

  * :ghissue:`2123`: Timeout added for ``fold_docs-with_different_keys`` test.

  * :ghissue:`2114`: EUnit tests now correctly inherit necessary environment
    variables.

  * :ghissue:`2122`: `:meck.unload()` is now called automatically after every test.

  * :ghissue:`2098`: Fix ``cpse_test_purge_replication`` eunit test.

  * :ghissue:`2085`, :ghissue:`2086`: Fix a flaky ``mem3_sync_event_listener`` test.

  * :ghissue:`2084`: Increase timeouts on two slow btree tests.

  * :ghissue:`1960`, :ghissue:`1961`: Fix for ``chttpd_socket_buffer_size_test``.

  * :ghissue:`1922`: Tests added for shard splitting functionality.

  * :ghissue:`1869`: New test added for doc reads with etag ``If-None-Match`` header.

  * :ghissue:`1831`: Re-introduced `cpse_test_purge_seqs` test.

  * :ghissue:`1790`: Reorganise ``couch_flag_config_tests`` into a proper suite.

  * :ghissue:`1785`: Use ``devclean`` on elixir target for consistency of Makefile.

  * :ghissue:`2476`: For testing, ``Triq`` has been replaced with ``PropEr`` as an
    optional dependency.

* External dependency updates:

  * :ghissue:`1870`: Mochiweb has been updated to 2.19.0.

  * :ghissue:`1938`: Folsom has been updated to 0.8.3.

  * :ghissue:`2001`: ibrowse has been updated to 4.0.1-1.

  * :ghissue:`2400`: jiffy has been updated to 1.0.1.

* A llama! OK, no, not really. If you got this far...thank you for reading.

.. _Python black: https://github.com/ambv/black
.. _hehaden: https://www.flickr.com/photos/hellie55/23379351593/
.. _ECMAScript compatibility table: https://kangax.github.io/compat-table/
.. _recon: https://github.com/ferd/recon
.. _.NET Framework v3.5: https://docs.microsoft.com/en-us/dotnet/framework/install/dotnet-35-windows-10
