.. 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.1.x:

============
3.1.x Branch
============

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

.. _release/3.1.2:

Version 3.1.2
=============

This is a security release for a *low severity* vulnerability. Details of
the issue will be published one week after this release. See the `CVE
database <https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2021-38295>`_
for details at a later time.

.. _release/3.1.1:

Version 3.1.1
=============

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

.. rst-class:: open

* :ghissue:`3102`, :ghissue:`1600`, :ghissue:`2877`, :ghissue:`2041`: When a
  client disconnects unexpectedly, CouchDB will no longer log a "``normal :
  unknown``" error. Bring forth the rainbows.

.. figure:: ../../images/gf-gnome-rainbows.png
  :align: center
  :alt: The Gravity Falls gnome pukes some rainbows for us.

* :ghissue:`3109`: Drilldown parameters for text index searches may now be
  specified as a list of lists, to avoid having to define this redundantly
  in a single query. (Some languages don't have this facility.)

* :ghissue:`3132`: The new ``[chttpd] buffer_response`` option can be enabled
  to delay the start of a response until the end has been calculated. This
  increases memory usage, but simplifies client error handling as it
  eliminates the possibility that a response may be deliberately
  terminated midway through, due to a timeout. This config value may be
  changed at runtime, without impacting any in-flight responses.

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

Bugfixes
--------

* :ghissue:`2935`: The replicator now correctly picks jobs to restart during
  rescheduling, where previously with high load it may have failed to try to
  restart crashed jobs.

* :ghissue:`2981`: When handling extremely large documents (≥50MB), CouchDB
  can no longer time out on a ``gen_server:call`` if bypassing the IOQ.

* :ghissue:`2941`: CouchDB will no longer fail to compact databases if it
  finds files from a 2.x compaction process (prior to an upgrade) on disk.

* :ghissue:`2955` CouchDB now sends the correct CSP header to ensure
  Fauxton operates correctly with newer browsers.

* :ghissue:`3061`, :ghissue:`3080`: The `couch_index` server won't crash
  and log errors if a design document is deleted while that index is
  building, or when a ddoc is added immediately after database creation.

* :ghissue:`3078`: CouchDB now checks for and complains correctly about
  invalid parameters on database creation.

* :ghissue:`3090`: CouchDB now correctly encodes URLs correctly when
  encoding the ``atts_since`` query string.

* :ghissue:`2953`: Some parameters not allowed for text-index queries on
  partitioned database are now properly validated and rejected.

* :ghissue:`3118`: Text-based search indexes may now be cleaned up
  correctly, even if the design document is now invalid.

* :ghissue:`3121`: ``fips`` is now only reported in the welcome message
  if FIPS mode was enabled at boot (such as in ``vm.args``).

* :ghissue:`3128`: Using :method:`COPY` to copy a document will no longer
  return a JSON result with two ``ok`` fields.

* :ghissue:`3138`: Malformed URLs in replication requests or documents
  will no longer throw an error.

Other
-----

* JS tests skip faster now.

* More JS tests ported into elixir: ``reader_acl``, ``reduce_builtin``,
  ``reduce_false``, ``rev_stemming``, ``update_documents``,
  ``view_collation_raw``, ``view_compaction``, all the
  ``view_multi_key`` tests, ``view_sandboxing``,
  ``view_update_seq``.

.. _release/3.1.0:

Version 3.1.0
=============

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

.. rst-class:: open

* :ghissue:`2648`: Authentication via :ref:`JSON Web Token (JWT) <api/auth/jwt>`. Full
  documentation is at the friendly link.

* :ghissue:`2770`: CouchDB now supports linking against SpiderMonkey 68, the current
  Mozilla SpiderMonkey ESR release. This provides direct support for packaging on the
  latest operating system variants, including Ubuntu 20.04 "Focal Fossa."

* A new Fauxton release is included, with updated dependencies, and a new optional
   CouchDB news page.

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

.. rst-class:: open

* :ghissue:`2754`: Optimized compactor performance, resulting in a 40% speed improvement
  when document revisions approach the ``revs_limit``. The fixes also include additional
  metrics on size tracking during the sort and copy phases, accessible via the
  :get:`/_active_tasks` endpoint.

* A big bowl of candy! OK, no, not really. If you got this far...thank you for reading.
