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

============
2.1.x Branch
============

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

.. _release/2.1.x/upgrade:

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

* When upgrading from 2.x to 2.1.1, if you have not customized your
  node name in ``vm.args``, be sure to retain your original ``vm.args``
  file. The default node name has changed from ``couchdb@localhost`` to
  ``couchdb@127.0.0.1``, which can prevent CouchDB from accessing existing
  databases on the system. You may also change the name option back to the
  old value by setting ``-name couchdb@localhost`` in ``etc/vm.args`` by
  hand. The default has changed to meet new guidelines and to provide
  additional functionality in the future.

  If you receive errors in the logfile, such as
  ``internal_server_error : No DB shards could be opened.`` or in Fauxton,
  such as ``This database failed to load.`` you need to make this change.

* The deprecated (and broken) OAuth 1.0 implementation has been removed.

* If user code reads or manipulates replicator document states,
  consider using the ``[replicator] update_docs = true`` compatibility
  parameter. In that case the replicator will continue updating documents
  with transient replication states. However, that will incur a
  performance cost. Consider instead using the ``_scheduler/docs`` HTTP
  endpoint.

* The ``stale`` parameter for views and ``_find`` has been deprecated in favour
  of two new parameters: ``stable`` and ``update``. The old ``stale=ok``
  behaviour is equivalent to ``stable=true&update=false``, and the old
  ``stale=update_after`` behaviour is equivalent to ``stable=true&update=lazy``.
  The deprecated ``stale`` parameter will be removed in CouchDB 3.0.

* The new :``httpd/max_http_request_size`` configuration parameter
  was added. This has the same behavior as the old
  :config:option:`couchdb/max_document_size` configuration parameter, which
  had been unfortunately misnamed, and has now been updated to behave as the
  name would suggest. Both are documented in the shipped ``default.ini`` file.

  Note that the default for this new parameter is 64MB instead of 4GB. If you
  get errors when trying to PUT or POST and see HTTP 413 return codes in couchdb
  logs, this could be the culprit. This can affect couchup in-place upgrades as
  well.

* :ghissue:`914`: Certain critical config sections are blacklisted from being
  modified through the HTTP API. These sections can still be modified through
  the standard ``local.ini`` or ``local.d/*.ini`` files.

* :ghissue:`916`: ``couchjs`` now disables ``eval()`` and the ``Function()``
  constructor by default. To restore the original behaviour, add the
  ``--eval`` flag to the definition of the javascript query server in your
  ``local.ini`` file.

.. _release/2.1.2:

Version 2.1.2
=============

Security
--------
* :ref:`CVE 2018-8007 <cve/2018-8007>`

.. _release/2.1.1:

Version 2.1.1
=============

Security
--------
* :ref:`CVE 2017-12635 <cve/2017-12635>`
* :ref:`CVE 2017-12636 <cve/2017-12636>`

General
-------

* :ghissue:`617`: CouchDB now supports compilation and running under Erlang/OTP
  20.x.

* :ghissue:`756`: The ``couch_peruser`` functionality is now *really* fixed.
  Really.

* :ghissue:`827`: The cookie domain for AuthSession cookies, used in a
  proxy authentication configuration, can now be customized via the ini file.

* :ghissue:`858`: It is now possible to modify shard maps for system databases.

* :ghissue:`732`: Due to an Erlang bug (ERL-343_), invalid paths can be
  returned if volumes are mounted containing whitespace in their name. This
  problem surfaced primarily on macOS (Time Machine volumes). CouchDB now
  works around this bug in unpatched versions of Erlang by skipping the free
  space check performed by the compaction daemon. Erlang itself will
  correctly perform free space checks in version 21.0.

* :ghissue:`824`: The current node's local interface can now be accessed at
  ``/_node/_local/{endpoint}`` as well as at
  ``/_node/<nodename>@<hostname>/{endpoint}``.

* The Dockerfile in the source repository has been retired. For a current
  Dockerfile, see the `couchdb-docker repository`.

* Fauxton now uses a version of React with a BSD license.

.. _ERL-343: https://bugs.erlang.org/browse/ERL-343
.. _couchdb-docker repository: https://github.com/apache/couchdb-docker

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

* :ghissue:`835`: CouchDB now no longer decompresses documents just to
  determine their uncompressed size. In tests, this has lead to improvements
  between 10-40% in both CPU and wall-clock time for database compaction.

* The design document cache (``ddoc_cache``) has been rewritten to improve
  performance.

Mango
-----

* :ghissue:`808`: Mango now supports
  :ref:`partial indexes <find/partial_indexes>`. Partial indexes allow
  documents to be filtered at indexing time, potentially offering
  significant performance improvements for query selectors that don't map
  cleanly to a range query on an index.

* :ghissue:`740`: Mango queries can now be paginated. Each query response
  includes a bookmark.  The bookmark can be provided on a subsequent query to
  continue from a specific key.

* :ghissue:`768`: Mango ``_find`` accepts an ``execution_stats``
  parameter. If present, a new object is included in the response which
  contains information about the query executed. The object contains the
  count of total keys examined (0 for json indexes), total documents
  examined (when ``include_docs=true`` is used), and the total quorum
  documents examined (when fabric doc lookups are used).

* :ghissue:`816` and :ghissue:`866`: Mango now requires that all of the fields
  in a candidate index must exist in a query's selector. Previously, this check
  was incorrect, and indexes that might only contain a subset of valid
  documents might be selected by the query planner if no explicit index was
  specified at query time. Further, if a sort field is specified at query time,
  that field needs to exist (but could be null) in the results returned.

Other
-----

The 2.1.1 release also includes the following minor improvements:

  * :ghissue:`635`: Stop couch_index processes on ddoc update
  * :ghissue:`721`: Save migrated replicator checkpoint documents immediately
  * :ghissue:`688`: Reuse http-based replication checkpoints when upgrading
    to https
  * :ghissue:`729`: Recommend the use only of ``-name`` and not ``-sname`` in
    `vm.args` for compatibility.
  * :ghissue:`738`: Allow replicator application to always update replicator
    docs.
  * :ghissue:`605`: Add ``Prefer: return=minimal`` header options from
    RFC7240 to reduce the number of headers in the response.
  * :ghissue:`744`: Allow a 503 response to be returned to clients (with
    metric support)
  * :ghissue:`746`: Log additional information on crashes from rexi
  * :ghissue:`752`: Allow Mango $in queries without requiring the index to
    use an array
  * (multiple) Additional debugging utilities have been added.
  * (multiple) Hot code upgrades from 2.0 -> 2.1.1 are now possible.
  * (multiple) Improvements to the test suite have been made.
  * :ghissue:`765`: Mango ``_explain`` now includes view parameters as requested
    by the user.
  * :ghissue:`653`: `_show` and `_list` should now work for admin-only
    databases such as ``_users``.
  * :ghissue:`807`: Mango index selection should occur only once.
  * :ghissue:`804`: Unhandled Mango errors are now logged.
  * :ghissue:`659`: Improve accuracy of the ``max_document_size`` check.
  * :ghissue:`817`: Invalid Base64 in inline attachments is now caught.
  * :ghissue:`825`: Replication IDs no longer need to be URL encoded when
    using the ``_scheduler/jobs/<job_id>`` endpoint.
  * :ghissue:`838`: Do not buffer rexi messages to disconnected nodes.
  * :ghissue:`830`: The stats collection interval is now configurable in
    an ini file, not in the application context. The default value is 10,
    and the setting is reloaded every 600 seconds.
  * :ghissue:`812`: The ``/{db}`` endpoint now includes a ``cluster`` block
    with the database's ``q``, ``n``, and default ``w`` and ``r`` values.
    This supplements the existing ``/{db}/_shards`` and ``/{db}/_shards/{id}``
    detailed information on sharding and quorum.
  * :ghissue:`810`: The replicator scheduler crashed counter gauge more
    reliably detects replication crashes by reducing the default number
    of retries from 10 to 5 (reducing the duration from 4 mins to 8 secs).
  * :issue:`3288`: Tolerate mixed clusters for the upcoming pluggable
    storage engine work.
  * :ghissue:`839`: Mango python tests now support Python 3 as well as 2.
  * :ghissue:`845`: A convenience ``remsh`` script has been added to support
    live debugging of running systems.
  * :ghissue:`846`: Replicator logging is now less verbose and more informative
    when replication terminates unexpectedly.
  * :ghissue:`797`: Reduce overflow errors are now returned to the client,
    allowing views with a single bad reduce to build while not exhausting the
    server's RAM usage.
  * :ghissue:`881`: Mango now allows match on documents where the indexed
    value is an object if a range query is issued. Previously, query results
    might change in the presence of an index, and operators/selectors which
    explicitly depend on a full index scan (such as ``$exists``) would not
    return a complete result set.
  * :ghissue:`883`: Erlang time module compatibility has been improved for
    releases of Erlang newer than 18.0.
  * :ghissue:`933`: 410 is now returned when attempting to make a temporary
    view request.
  * :ghissue:`934`: The replicator now has a configurable delay before
    retrying to retrieve a document after receiving a ``missing_doc`` error.
  * :ghissue:`936`: jiffy now deduplicates JSON keys.

.. _release/2.1.0:

Version 2.1.0
=============

* The Mango ``_find`` endpoint supports a new combination operator,
  ``$allMatch``, which matches and returns all documents that contain an
  array field with all its elements matching all the specified query
  criteria.

* New scheduling replicator. The core of the new replicator is a
  scheduler which allows running a large number of replication
  jobs by switching between them, stopping some and starting others
  periodically. Jobs which fail are backed off exponentially. There is
  also an improved inspection and querying API: ``_scheduler/jobs`` and
  ``_scheduler/docs``:

  * ``_scheduler/jobs`` : This endpoint shows active replication
    jobs. These are jobs managed by the scheduler. Some of them might
    be running, some might be waiting to run, or backed off
    (penalized) because they crashed too many times. Semantically this
    is somewhat equivalent to ``_active_tasks`` but focuses only on
    replications. Jobs which have completed or which were never
    created because of malformed replication documents will not be
    shown here as they are not managed by the scheduler.
    ``_replicate`` replications, started form _replicate endpoint not
    from a document in a ``_replicator`` db, will also show up here.

  * ``_scheduler/docs`` : This endpoint is an improvement on having to go
    back and read replication documents to query their state. It
    represents the state of all the replications started from
    documents in _replicator db. Unlike ``_scheduler/jobs`` it will also
    show jobs which have failed or have completed.

  By default, scheduling replicator will not update documents with
  transient states like ``triggered`` or ``error`` anymore, instead
  ``_scheduler/docs`` API should be used to query replication document
  states.

Other scheduling replicator improvements
-----------------------------------------

  * Network resource usage and performance was improved by
    implementing a shared connection pool. This should help in cases
    of a large number of connections to the same sources or
    target. Previously connection pools were shared only within a
    single replication job.

  * Improved request rate limit handling. Replicator requests will
    auto-discover rate limit capacity on targets and sources based on
    a proven Additive Increase / Multiplicative Decrease feedback
    control algorithm.

  * Improved performance by having exponential backoff for all
    replication jobs failures.  Previously there were some scenarios
    were failure led to continuous repeated retries, consuming CPU and
    disk resources in the process.

  * Improved recovery from long but temporary network
    failure. Currently if replications jobs fail to start 10 times in
    a row, they will not be retried anymore. This is sometimes
    desirable, but in some cases, for example, after a sustained DNS
    failure which eventually recovers, replications reach their retry
    limit, stop retrying and never recover. Previously it required
    user intervention to continue. Scheduling replicator will never
    give up retrying a valid scheduled replication job and so it
    should recover automatically.

  * Better handling of filtered replications. Failing user filter code
    fetches from the source will not block replicator manager and
    stall other replications. Failing filter fetches will also be
    backed off exponentially. Another improvement is when filter code
    changes on the source, a running replication will detect that and
    restart itself with a new replication ID automatically.

The 2.1.0 release also includes the following minor improvements:

  * :issue:`1946`: Hibernate couch_stream after each write (up to 70% reduction
    in memory usage during replication of DBs with large attachments)
  * :issue:`2964`: Investigate switching replicator manager change feeds to
    using "normal" instead of "longpoll"
  * :issue:`2988`: (mango) Allow query selector as changes and replication
    filter
  * :issue:`2992`: Add additional support for document size
  * :issue:`3046`: Improve reduce function overflow protection
  * :issue:`3061`: Use vectored reads to search for buried headers in .couch
    files. "On a modern linux system with SSD, we see improvements up to 15x."
  * :issue:`3063`: "stale=ok" option replaced with new "stable" and "update"
    options.
  * :issue:`3180`: Add features list in the welcome message
  * :issue:`3203`: Make auth handlers configurable (in ini files)
  * :issue:`3234`: Track open shard timeouts with a counter instead of logging
  * :issue:`3242`: Make get view group info timeout in couch_indexer
    configurable
  * :issue:`3249`: Add config to disable index all fields (text indexes)
  * :issue:`3251`: Remove hot loop usage of filename:rootname/1
  * :issue:`3284`: 8Kb read-ahead in couch_file causes extra IO and binary
    memory usage
  * :issue:`3298`: Optimize writing btree nodes
  * :issue:`3302`: (Improve) Attachment replication over low bandwidth network
    connections
  * :issue:`3307`: Limit calls to maybe_add_sys_db_callbacks to once per db
    open
  * :issue:`3318`: bypass couch_httpd_vhost if there are none
  * :issue:`3323`: Idle dbs cause excessive overhead
  * :issue:`3324`: Introduce couch_replicator_scheduler
  * :issue:`3337`: End-point _local_docs doesn't conform to query params of
    _all_docs
  * :issue:`3358`: (mango) Use efficient set storage for field names
  * :issue:`3425`: Make _doc_ids _changes filter fast-path limit configurable
  * :ghissue:`457`: TeX/LaTeX/texinfo removed from default docs build chain
  * :ghissue:`469`: (mango) Choose index based on fields match
  * :ghissue:`483`: couchup database migration tool
  * :ghissue:`582`: Add X-Frame-Options support to help protect against
    clickjacking
  * :ghissue:`593`: Allow bind address of 127.0.0.1 in ``_cluster_setup`` for
    single nodes
  * :ghissue:`624`: Enable compaction daemon by default
  * :ghissue:`626`: Allow enable node decom using string "true"
  * (mango) Configurable default limit, defaults to 25.
  * (mango) _design documents ignored when querying _all_docs
  * (mango) add $allMatch selector
  * Add local.d/default.d directories by default and document
  * Improved INSTALL.* text files

.. _release/2.1.x/fixes:

Fixed Issues
============

The 2.1.0 release includes fixes for the following issues:

* :issue:`1447`: X-Couch-Update-NewRev header is missed if custom headers are
  specified in response of _update handler (missed in 2.0 merge)
* :issue:`2731`: Authentication DB was not considered a system DB
* :issue:`3010`: (Superseded fix for replication exponential backoff)
* :issue:`3090`: Error when handling empty "Access-Control-Request-Headers"
  header
* :issue:`3100`: Fix documentation on require_valid_user
* :issue:`3109`: 500 when include_docs=true for linked documents
* :issue:`3113`: fabric:open_revs can return {ok, []}
* :issue:`3149`: Exception written to the log if db deleted while there is a
  change feed running
* :issue:`3150`: Update all shards with stale=update_after
* :issue:`3158`: Fix a crash when connection closes for _update
* :issue:`3162`: Default ssl settings cause a crash
* :issue:`3164`: Request fails when using
  _changes?feed=eventsource&heartbeat=30000
* :issue:`3168`: Replicator doesn't handle well writing documents to a target
  db which has a small max_document_size
* :issue:`3173`: Views return corrupt data for text fields containing non-BMP
  characters
* :issue:`3174`: max_document_size setting can by bypassed by issuing
  multipart/related requests
* :issue:`3178`: Fabric does not send message when filtering lots of documents
* :issue:`3181`: function_clause error when adding attachment to doc in _users
  db
* :issue:`3184`: couch_mrview_compactor:recompact/1 does not handle errors in
  spawned process
* :issue:`3193`: fabric:open_revs returns multiple results when one of the
  shards has stem_interactive_updates=false
* :issue:`3199`: Replicator VDU function doesn't account for an already
  malformed document in replicator db
* :issue:`3202`: (mango) do not allow empty field names
* :issue:`3220`: Handle timeout in _revs_diff
* :issue:`3222`: (Fix) HTTP code 500 instead of 400 for invalid key during
  document creation
* :issue:`3231`: Allow fixing users' documents (type and roles)
* :issue:`3232`: user context not passed down in fabric_view_all_docs
* :issue:`3238`: os_process_limit documentation wrong
* :issue:`3241`: race condition in couch_server if delete msg for a db is
  received before open_result msg
* :issue:`3245`: Make couchjs -S option take effect again
* :issue:`3252`: Include main-coffee.js in release artifact (broken
  CoffeeScript view server)
* :issue:`3255`: Conflicts introduced by recreating docs with attachments
* :issue:`3259`: Don't trap exits in couch_file
* :issue:`3264`: POST to _all_docs does not respect conflicts=true
* :issue:`3269`: view response can 'hang' with filter and limit specified
* :issue:`3271`: Replications crash with 'kaboom' exit
* :issue:`3274`: eof in couch_file can be incorrect after error
* :issue:`3277`: Replication manager crashes when it finds _replicator db
  shards which are not part of a mem3 db
* :issue:`3286`: Validation function throwing unexpected json crashes with
  function_clause
* :issue:`3289`: handle error clause when calling fabric:open_revs
* :issue:`3291`: Excessively long document IDs prevent replicator from making
  progress
* :issue:`3293`: Allow limiting length of document ID (for CouchDB proper)
* :issue:`3305`: (mango) don't crash with invalid input to built in reducer
  function
* :issue:`3362`: DELETE attachment on non-existing document creates the
  document, rather than returning 404
* :issue:`3364`: Don't crash compactor when compacting process fails.
* :issue:`3367`: Require server admin user for db/_compact and db_view_cleanup
  endpoints
* :issue:`3376`: Fix mem3_shards under load
* :issue:`3378`: Fix mango full text detection
* :issue:`3379`: Fix couch_auth_cache reinitialization logic
* :issue:`3400`: Notify couch_index_processes on all shards when ddoc updated
* :issue:`3402`: race condition in mem3 startup
* :ghissue:`511`: (mango)  Return false for empty list
* :ghissue:`595`: Return 409 to PUT attachment with non-existent rev
* :ghissue:`623`: Ensure replicator _active_tasks entry reports recent pending
  changes value
* :ghissue:`627`: Pass UserCtx to fabric's all_docs from mango query
* :ghissue:`631`: fix couchdb_os_proc_pool eunit timeouts
* :ghissue:`644`: Make couch_event_sup:stop/1 synchronous
* :ghissue:`645`: Pass db open options to fabric_view_map for _view and _list
  queries on _users DB
* :ghissue:`648`: Fix couch_replicator_changes_reader:process_change
* :ghissue:`649`: Avoid a race when restarting an index updater
* :ghissue:`667`: Prevent a terrible race condition
* :ghissue:`677`: Make replication filter fetch error for _replicate return a
  404
* Fix CORS ``max_age`` configuration parameter via Access-Control-Max-Age
* Chunk missing revisions before attempting to save on target (improves
  replication for very conflicted, very deep revision tree documents)
* Allow w parameter for attachments
* Return "Bad Request" when count in ``/_uuids`` exceeds max
* Fix crashes when replicator db is deleted
* Skip internal replication if changes already replicated
* Fix encoding issues on ``_update/../doc_id`` and PUT attachments
