.. 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/2.3.x:

============
2.3.x Branch
============

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

.. _release/2.3.x/upgrade:

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

.. rst-class:: open

* :ghissue:`1602`: To improve security, there have been major changes in the
  configuration of query servers, SSL support, and HTTP global handlers:

    1. Query servers

    Query servers are NO LONGER DEFINED in the .ini files, and can
    no longer be altered at run-time.

    The JavaScript and CoffeeScript query servers continue to be enabled
    by default. Setup differences have been moved from default.ini to
    the ``couchdb`` and ``couchdb.cmd`` start scripts respectively.

    Additional query servers can now be configured using environment
    variables:

    .. code-block:: bash

        export COUCHDB_QUERY_SERVER_PYTHON="/path/to/python/query/server.py with args"
        couchdb

    where the last segment in the environment variable (``_PYTHON``) matches
    the usual lowercase(!) query language in the design doc
    ``language`` field (here, ``python``.)

    Multiple query servers can be configured by using more environment
    variables.

    You can also override the default servers if you need to set command-
    line options (such as ``couchjs`` stack size):

    .. code-block:: bash

        export COUCHDB_QUERY_SERVER_JAVASCRIPT="/path/to/couchjs /path/to/main.js -S <STACKSIZE>"
        couchdb

    2. Native Query Servers

    The mango query server continues to be enabled by default. The Erlang
    query server continues to be disabled by default. This change adds
    a ``[native_query_servers] enable_erlang_query_server = BOOL`` setting
    (defaults to ``false``) to enable the Erlang query server.

    If the legacy configuration for enabling the query server is detected,
    that is counted as a ``true`` setting as well, so existing configurations
    continue to work just fine.

    3. SSL Support

    Enabling SSL support in the ini file is now easier:

    .. code-block:: bash

        [ssl]
        enable = true

    If the legacy httpsd configuration is found in your ini file, this will
    still enable SSL support, so existing configurations do not need to be
    changed.

    4. HTTP global handlers

    These are no longer defined in the default.ini file, but have been
    moved to the couch.app context. If you need to customize your handlers,
    you can modify the app context using a couchdb.config file as usual.

* :ghissue:`1602`: Also to improve security, the deprecated ``os_daemons`` and
  ``couch_httpd_proxy`` functionality has been completely removed ahead of the planned
  CouchDB 3.0 release. We recommend the use of OS-level daemons such as runit, sysvinit,
  systemd, upstart, etc. to launch and maintain OS daemons instead, and the use of
  a reverse proxy server in front of CouchDB (such as haproxy) to proxy access to other
  services or domains alongside CouchDB.
* :ghissue:`1543`: The node-local (default port 5986) ``/_restart`` endpoint has been
  replaced by the clustered (default port 5984) endpoint ``/_node/$node/_restart`` and
  ``/_node/_local/_restart`` endpoints. The node-local endpoint has been removed.
* :ghissue:`1764`: All python scripts shipped with CouchDB, including ``couchup`` and the
  ``dev/run`` development cluster script, now specify and require Python 3.x.
* :ghissue:`1396`: CouchDB is now compatible with Erlang 21.x.
* :ghissue:`1680`: The embedded version of ``rebar`` used to build CouchDB has been
  updated to the last version of ``rebar2`` available. This assists in building on
  non-x86 platforms.
* :ghissue:`1857`: Refuse building with known bad versions of Erlang.

.. _release/2.3.1:

Version 2.3.1
=============

Features
--------

.. rst-class:: open

* :ghissue:`1811`: Add new ``/{db}/_sync_shards`` endpoint (admin-only).
* :ghissue:`1870`: Update to mochiweb 2.19.0. See also :ghissue:`1875`.
* :ghissue:`1857`: Refuse building with known bad versions of Erlang.
* :ghissue:`1880`: Compaction: Add snooze_period_ms for finer tuning.

Bugfixes
--------

.. rst-class:: open

* :ghissue:`1795`: Filter out empty missing_revs results in ``mem3_rep``.
* :ghissue:`1384`: Fix ``function_clause`` error on invalid DB ``_security`` objects.
* :ghissue:`1841`: Fix ``end_time`` field in ``/_replicate`` response.
* :ghissue:`1860`: Fix read repair in a mixed cluster environment.
* :ghissue:`1862`: Fix ``fabric_open_doc_revs``.
* :ghissue:`1865`: Support purge requests with more than 100 doc ids.
* :ghissue:`1867`: Fix timeout in ``chttpd_purge_tests``.
* :ghissue:`1766`: Add default fabric request timeouts.
* :ghissue:`1810`: Requests return 400 Bad Request when URL length exceeds 1460
  characters. See :ghissue:`1870` for details.
* :ghissue:`1799`: Restrict ``_purge`` to server admin.
* :ghissue:`1874`: This fixes inability to set keys with regex symbols in them.
* :ghissue:`1901`: Fix badarg crash on invalid rev for individual doc update.
* :ghissue:`1897`: Fix ``from_json_obj_validate`` crash when provided rev isn't
  a valid hex.
* :ghissue:`1803`: Use the same salt for admin passwords on cluster setup.
* :ghissue:`1053`: Fix python2 compatibility for ``couchup``.
* :ghissue:`1905`: Fix python3 compatibility for ``couchup``.

.. _release/2.3.0:

Version 2.3.0
=============

Features
--------

.. rst-class:: open

* (Multiple) Clustered purge is now available. This feature restores the CouchDB 1.x
  ability to completely remove any record of a document from a database. Conditions
  apply; to use the feature safely, and for full details, read the complete
  :ref:`cluster/purging` documentation.
* :ghissue:`1658`: A new config setting is available, allowing an administrator to
  configure an initial list of nodes that should be contacted when a node boots up.
  Nodes in the ``seedlist`` that are successfully reached will be added to that node's
  ``_nodes`` database automatically, triggering a distributed Erlang connection and
  replication of the internal system databases to the new node. This can be used instead
  of manual config or the cluster setup wizard to bootstrap a cluster. The progress of
  the initial seeding of new nodes is exposed at the ``GET /_up`` endpoint.
* Replication supports ipv6-only peers after updating ibrowse dependency.
* :ghissue:`1708`: The UUID of the server/cluster is once again exposed in the
  ``GET /`` response. This was a regression from CouchDB 1.x.
* :ghissue:`1722`: Stats counts between job runs of the replicator are no longer reset
  on job restart.
* :ghissue:`1195`, :ghissue:`1742`: CouchDB's ``_bulk_get`` implementation now supports
  the ``multipart/mixed`` and ``multipart/related`` content types if requested,
  extending compatibility with third-party replication clients.

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

.. rst-class:: open

* :ghissue:`1409`: CouchDB no longer forces the TCP receive buffer to a fixed size
  of 256KB, allowing the operating system to dynamically adjust the buffer size. This
  can lead to significantly improved network performance when transferring large
  attachments.
* :ghissue:`1423`: Mango selector matching now occurs at the shard level, reducing the
  network traffic within a cluster for a mango query.
* :ghissue:`1423`: Long running operations at the node level could exceed the inter-node
  timeout, leading to a fabric timeout error in the logfile and a cancellation of the
  task. Nodes can now ping to stop that from happening.
* :ghissue:`1560`: An optimization to how external data sizes of attachments were
  recorded was made.
* :ghissue:`1586`: When cleaning up outdated secondary index files, the search is limited
  to the index directory of a specific database.
* :ghissue:`1593`: The ``couch_server`` ETS table now has the ``read_concurrency``
  option set, improving access to the global list of open database handles.
* :ghissue:`1593`: Messages to update the least-recently used (LRU) cache are not
  sent when the ``[couchdb] update_lru_on_read`` setting is disabled.
* :ghissue:`1625`: All nodes in a cluster now run their own ``rexi`` server.

Bugfixes
--------

.. rst-class:: open

* :ghissue:`1484`: ``_stats`` now correctly handles the case where a map function emits
  an array of integers. This bug was introduced in 2.2.0.
* :ghissue:`1544`: Certain list functions could return a ``render_error`` error
  intermittently.
* :ghissue:`1550`: Replicator ``_session`` support was incompatible with CouchDB
  installations using the ``require_valid_user = true`` setting.
* :ghissue:`1571`: Under very heavy load, it was possible that ``rexi_server`` could
  die in such a way that it's never restarted, leaving a cluster without the ability
  to issue RPC calls - effectively rendering the cluster useless.
* :ghissue:`1574`: The built-in ``_sum`` reduce function has been improved to check
  if the objects being summed are not overflowing the view storage. Previously, there
  was no protection for ``_sum``-introduced overflows.
* :ghissue:`1582`: Database creation parameters now have improved validation, giving a
  more readable error on invalid input.
* :ghissue:`1588`: A missing security check has been restored for the noop
  ``/db/_ensure_full_commit`` call to restore database validation checks.
* :ghissue:`1591`: CouchDB now creates missing shard files when accessing a database
  if necessary. This handles the situation when, on database creation, no nodes were
  capable of creating any of the shard files required for that database.
* :ghissue:`1568`: CouchDB now logs a warning if a changes feed is rewound to 0. This
  can help diagnose problems in busy or malfunctioning clusters.
* :ghissue:`1596`: It is no longer possible that a busy ``couch_server``, under a
  specific ordering and timing of events, will incorrectly track ``open_async``
  messages in its mailbox.
* :ghissue:`1601`, :ghissue:`1654`: CouchDB now logs better when an error causes it to
  read past the EOF of a database shard. The check for whether CouchDB is trying to read
  too many bytes has been correctly separated out from the error indicating it has
  attempted to read past the EOF.
* :ghissue:`1613`: Local nodes are now filtered out during read repair operations.
* :ghissue:`1636`: A memory leak when replicating over HTTPS and a problem occurs
  has been squashed.
* :ghissue:`1635`: ``/_replicate`` jobs are no longer restarted if parameters haven't
  changed.
* :ghissue:`1612`: JavaScript rewrite functions now send the body of the request to
  the rewritten endpoint.
* :ghissue:`1631`: The replicator no longer crashes if the user has placed an
  invalid VDU function into one of the ``_replicator`` databases.
* :ghissue:`1644`, :ghissue:`1647`: It is no longer possible to create illegally-named
  databases within the reserved system space (``_`` prefix.)
* :ghissue:`1650`: ``_bulk_get`` is once again operational for system databases such
  as ``_users``.
* :ghissue:`1652`: Access to ``/_active_tasks`` is once again restricted to server
  admins only.
* :ghissue:`1662`: The ``couch_log`` application no longer crashes when new, additional
  information is supplied by a crashing application, or when any of its own children are
  restarted.
* :ghissue:`1666`: Mango could return an error that would crash the
  ``couch_query_servers`` application. This is no longer the case.
* :ghissue:`1655`: Configuration of ``ets_lru`` in ``chttpd`` now performs proper error
  checking of the specified config value.
* :ghissue:`1667`: The ``snappy`` dependency has been updated to fix a memory allocation
  error.
* :ghissue:`1683`: Attempting to create a local document with an invalid revision no
  longer throws a ``badarg`` exception. Also, when setting ``new_edits`` to ``false``
  and performing a bulk write operation, local documents are no longer written into the
  wrong btree. Finally, it is no longer possible to create a document with an empty
  ID during a bulk operation with ``new_edits`` set to ``false``.
* :ghissue:`1721`: The ``couchup`` convenience script for upgrading from CouchDB 1.x
  now also copies a database's ``_security`` object on migration.
* :ghissue:`1672`: When checking the status of a view compaction immediately after
  starting it, the ``total_changes`` and ``changes_done`` fields are now immediately
  populated with valid values.
* :ghissue:`1717`: If the ``.ini`` config file is read only, an attempt to update the
  config through the HTTP API will now result in a proper ``eacces`` error response.
* :ghissue:`1603`: CouchDB now returns the correct ``total_rows`` result when querying
  ``/{db}/_design_docs``.
* :ghissue:`1629`: Internal load validation functions no longer incorrectly hold open
  a deleted database or its host process.
* :ghissue:`1746`: Server admins defined in the ini file accessing via HTTP API no longer
  result in the auth cache logging the access as a miss in the statistics.
* :ghissue:`1607`: The replicator no longer fails to re-authenticate to open a remote
  database when its session cookie times out due to a VDU function forbidding writes
  or a non-standard cookie expiration duration.
* :ghissue:`1579`: The compaction daemon no longer incorrectly only compacts a single
  view shard for databases with a ``q`` value greater than 1.
* :ghissue:`1737`: CouchDB 2.x now performs as well as 1.x when using a ``_doc_ids``
  or ``_design_docs`` filter on a changes feed.

Mango
-----

.. rst-class:: open

Other
-----

The 2.3.0 release also includes the following minor improvements:

.. rst-class:: open

* Improved test cases:

  * The Elixir test suite has been merged. These test cases are intended to replace the
    aging, unmaintainable JavaScript test suite, and help reduce our dependency on
    Mozilla Spidermonkey 1.8.5. The test suite does not yet cover all of the tests that
    the JS test suite does. Once it achieves full coverage, the JS test suite will be
    removed.
  * Many racy test cases improved for reliable CI runs.
  * The Makefile targets for ``list-eunit-*`` now work correctly on macOS.
  * :ghissue:`1732`, :ghissue:`1733`, :ghissue:`1736`: All of the test suites run and
    pass on the Windows platform once again.

* :ghissue:`1597`: Off-heap messages, a new feature in Erlang 19+, can now be disabled
  per module if desired.
* :ghissue:`1682`: A new ``[feature_flags]`` config section exists for the purpose of
  enabling or disabling experimental features by CouchDB developers.
* A narwhal! OK, no, not really. If you got this far...thank you for reading.
