.. 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.

.. default-domain:: config
.. highlight:: ini

========================
Compaction Configuration
========================

.. _config/database_compaction:

Database Compaction Options
===========================

.. config:section:: database_compaction :: Database Compaction Options

    .. config:option:: doc_buffer_size :: Documents buffer size

        Specifies the copy buffer's maximum size in bytes::

            [database_compaction]
            doc_buffer_size = 524288

    .. config:option:: checkpoint_after :: Checkpoint trigger

        Triggers a checkpoint after the specified amount of bytes were
        successfully copied to the compacted database::

            [database_compaction]
            checkpoint_after = 5242880

.. _config/compactions:

Compaction Daemon Rules
=======================

.. config:section:: compactions :: Compaction Daemon Rules

    A list of rules to determine when to run automatic compaction. The
    :option:`daemons/compaction_daemon` compacts databases and their respective
    view groups when all the condition parameters are satisfied. Configuration
    can be per-database or global, and it has the following format::

        [compactions]
        database_name = [ {ParamName, ParamValue}, {ParamName, ParamValue}, ... ]
        _default = [ {ParamName, ParamValue}, {ParamName, ParamValue}, ... ]

    For example::

      [compactions]
      _default = [{db_fragmentation, "70%"}, {view_fragmentation, "60%"}, {from, "23:00"}, {to, "04:00"}]

    - ``db_fragmentation``: If the ratio of legacy data, including metadata, to
      current data in the database file size is equal to or greater than this
      value, this condition is satisfied. The percentage is expressed as an
      integer percentage. This value is computed as:

      .. code-block:: none

          (file_size - data_size) / file_size * 100

      The data_size and file_size values can be obtained when
      querying :http:get:`/{db}`.

    - ``view_fragmentation``: If the ratio of legacy data, including metadata,
      to current data in a view index file size is equal to or greater then
      this value, this database compaction condition is satisfied. The
      percentage is expressed as an integer percentage. This value is computed
      as:

      .. code-block:: none

          (file_size - data_size) / file_size * 100

      The data_size and file_size values can be obtained when querying a
      :ref:`view group's information URI <api/ddoc/info>`.

    - ``from`` and ``to``: The period for which a database (and its view group)
      compaction is allowed. The value for these parameters must obey the
      format:

      .. code-block:: none

          HH:MM - HH:MM  (HH in [0..23], MM in [0..59])

    - ``strict_window``: If a compaction is still running after the end of the
      allowed period, it will be canceled if this parameter is set to `true`.
      It defaults to `false` and is meaningful only if the *period* parameter
      is also specified.

    - ``parallel_view_compaction``: If set to `true`, the database and its
      views are compacted in parallel. This is only useful on certain setups,
      like for example when the database and view index directories point to
      different disks. It defaults to `false`.

    Before a compaction is triggered, an estimation of how much free disk space
    is needed is computed. This estimation corresponds to two times the data
    size of the database or view index. When there's not enough free disk space
    to compact a particular database or view index, a warning message is
    logged.

    Examples:

    #.
        ::

            [{db_fragmentation, "70%"}, {view_fragmentation, "60%"}]

       The `foo` database is compacted if its fragmentation is 70% or more. Any
       view index of this database is compacted only if its fragmentation is
       60% or more.

    #.
        ::

            [{db_fragmentation, "70%"}, {view_fragmentation, "60%"}, {from, "00:00"}, {to, "04:00"}]

       Similar to the preceding example but a compaction (database or view
       index) is only triggered if the current time is between midnight and 4
       AM.

    #.
        ::

            [{db_fragmentation, "70%"}, {view_fragmentation, "60%"}, {from, "00:00"}, {to, "04:00"}, {strict_window, true}]

       Similar to the preceding example - a compaction (database or view index)
       is only triggered if the current time is between midnight and 4 AM. If
       at 4 AM the database or one of its views is still compacting, the
       compaction process will be canceled.

    #.
        ::

            [{db_fragmentation, "70%"}, {view_fragmentation, "60%"}, {from, "00:00"}, {to, "04:00"}, {strict_window, true}, {parallel_view_compaction, true}]

       Similar to the preceding example, but a database and its views can be
       compacted in parallel.

.. _config/compaction_daemon:

Configuration of Compaction Daemon
==================================

.. config:section:: compaction_daemon :: Configuration of Compaction Daemon

    .. config:option:: check_interval

        The delay, in seconds, between each check for which database and view
        indexes need to be compacted::

            [compaction_daemon]
            check_interval = 300

    .. config:option:: min_file_size

        If a database or view index file is smaller than this value (in bytes),
        compaction will not happen. Very small files always have high
        fragmentation, so compacting them is inefficient. ::

            [compaction_daemon]
            min_file_size = 131072

.. _config/view_compaction:

Views Compaction Options
========================

.. config:section:: view_compaction :: Views Compaction Options

    .. config:option:: keyvalue_buffer_size :: Key-Values buffer size

        Specifies maximum copy buffer size in bytes used during compaction::

            [view_compaction]
            keyvalue_buffer_size = 2097152
