---
features:
  - Add checksum to object extended attributes.

  - |
    Let clients request heartbeats during SLO PUTs by including
    the query parameter ``heartbeat=on``.

    With heartbeating turned on, the proxy will start its response
    immediately with 202 Accepted then send a single whitespace
    character periodically until the request completes. At that
    point, a final summary chunk will be sent which includes a
    "Response Status" key indicating success or failure and (if
    successful) an "Etag" key indicating the Etag of the resulting
    SLO.

  - |
    Added support for retrieving the encryption root secret from an
    external key management system. In practice, this is currently limited
    to Barbican.

  - |
    Move listing formatting out to a new proxy middleware named
    ``listing_formats``. ``listing_formats`` should be just right of the
    first proxy-logging middleware, and left of most other
    middlewares. If it is not already present, it will be
    automatically inserted for you.

    Note: if you have a custom middleware that makes account or
    container listings, it will only receive listings in JSON format.

  - |
    Log deprecation warning for ``allow_versions`` in the container
    server config. Configure the ``versioned_writes`` middleware in
    the proxy server instead. This option will be ignored in a
    future release.

  - |
    Replaced ``replication_one_per_device`` by custom count defined by
    ``replication_concurrency_per_device``. The original config value
    is deprecated, but continues to function for now. If both values
    are defined, the old ``replication_one_per_device`` is ignored.

  - |
    Fixed a rare issue where multiple backend timeouts could result
    in bad data being returned to the client.

  - Cleaned up logged tracebacks when talking to memcached servers.

  - |
    Account and container replication stats logs now include
    ``remote_merges``, the number of times a whole database was sent
    to another node.

  - |
    Respond 400 Bad Request when Accept headers fail to parse
    instead of returning 406 Not Acceptable.

  - |
    The ``domain_remap`` middleware now supports the
    ``mangle_client_paths`` option. Its default "false" value changes
    ``domain_remap`` parsing to stop stripping the ``path_root`` value
    from URL paths. If users depend on this path mangling, operators
    should set ``mangle_client_paths`` to "True" before upgrading.

  - |
    Remove ``swift-temp-url`` script. The functionality has been in
    swiftclient for a long time and this script has been deprecated
    since 2.10.0.

  - |
    Removed all ``post_as_copy`` related code and configs. The option
    has been deprecated since 2.13.0.

  - |
    Fixed XML responses (eg on bulk extractions and SLO upload
    failures) to be more correct. The enclosing "delete" tag was
    removed where it doesn't make sense and replaced with "extract"
    or "upload" depending on the context.

  - |
    Static Large Object (SLO) manifest may now (again) have zero-byte
    last segments.

  - |
    Fixed an issue where background consistency daemon child
    processes would deadlock waiting on the same file descriptor.

  - |
    Removed a race condition where a POST to an SLO could modify the
    X-Static-Large-Object metadata.

  - |
    Accept a trade off of dispersion for balance in the ring builder
    that will result in getting to balanced rings much more quickly
    in some cases.

  - |
    Fixed using ``swift-ring-builder set_weight`` with more than one
    device.

  - |
    When requesting objects, return 404 if a tombstone is found and
    is newer than any data found. Previous behavior was to return
    stale data.
other:
  - Various other minor bug fixes and improvements.
