---
features:
  - |
    S3 API compatibility updates

    - Swift can now cache the S3 secret from Keystone to use for
      subsequent requests. This functionality is disabled by default but
      can be enabled by setting the ``secret_cache_duration`` in the
      ``[filter:s3token]`` section of the proxy server config to a number
      greater than 0.

    - s3api now mimics the AWS S3 behavior of periodically sending
      whitespace characters on a Complete Multipart Upload request to keep
      the connection from timing out. Note that since a request could fail
      after the initial 200 OK response has been sent, it is important to
      check the response body to determine if the request succeeded.

    - s3api now properly handles ``x-amz-metadata-directive`` headers on
      COPY operations.

    - s3api now uses concurrency (default 2) to handle multi-delete
      requests. This allows multi-delete requests to be processed much
      more quickly.

    - s3api now mimics some forms of AWS server-side encryption
      based on whether Swift's at-rest encryption functionality is enabled.
      Note that S3 API users are now able to know more about how the
      cluster is configured than they were previously, ie knowledge of
      encryption at-rest functionality being enabled or not.

    - s3api responses now include a '-' in multipart ETags.

      For new multipart-uploads via the S3 API, the ETag that is
      stored will be calculated in the same way that AWS uses. This
      ETag will be used in GET/HEAD responses, bucket listings, and
      conditional requests via the S3 API. Accessing the same object
      via the Swift API will use the SLO Etag; however, in JSON
      container listings the multipart upload etag will be exposed
      in a new "s3_etag" key. Previously, some S3 clients would complain
      about download corruption when the ETag did not have a '-'.

    - S3 ETag for SLOs now include a '-'.

      Ordinary objects in S3 use the MD5 of the object as the ETag,
      just like Swift. Multipart Uploads follow a different format, notably
      including a dash followed by the number of segments. To that end
      (and for S3 API requests *only*), SLO responses via the S3 API have a
      literal '-N' added on the end of the ETag.

    - The default location is now set to "us-east-1". This is more likely
      to be the default region that a client will try when using v4
      signatures.

      Deployers with clusters that relied on the old implicit default
      location of "US" should explicitly set ``location = US`` in the
      ``[filter:s3api]`` section of proxy-server.conf before upgrading.

    - Add basic support for ?versions bucket listings. We still do not
      have support for toggling S3 bucket versioning, but we can at least
      support getting the latest versions of all objects.

  - |
    Fixed an issue with SSYNC requests to ensure that only one request
    can be running on a partition at a time.

  - |
    Data encryption updates

    - The ``kmip_keymaster`` middleware can now be configured directly in the
      proxy-server config file. The existing behavior of using an external
      config file is still supported.

    - Multiple keymaster middlewares are now supported. This allows
      migration from one key provider to another.

      Note that ``secret_id`` values must remain unique across all keymasters
      in a given pipeline. If they are not unique, the right-most keymaster
      will take precedence.

      When looking for the active root secret, only the right-most
      keymaster is used.

    - Prevent PyKMIP's kmip_protocol logger from logging at DEBUG.
      Previously, some versions of PyKMIP would include all wire
      data when the root logger was configured to log at DEBUG; this
      could expose key material in logs. Only the ``kmip_keymaster`` was
      affected.

  - |
    Fixed an issue where a failed drive could prevent the container sharder
    from making progress.

  - |
    Storage policy definitions in swift.conf can now define the diskfile
    to use to access objects. See the included swift.conf-sample file for
    a description of usage.

  - |
    The EC reconstructor will now attempt to remove empty directories
    immediately, while the inodes are still cached, rather than waiting
    until the next run.

  - |
    Added a ``keep_idle`` config option to configure KEEPIDLE time for TCP
    sockets. The default value is the old constant of 600.

  - |
    Add ``databases_per_second`` to the account-replicator,
    container-replicator, and container-sharder. This prevents them from
    using a full CPU core when they are not IO limited.

  - |
    Allow direct_client users to overwrite the ``X-Timestamp`` header.

  - |
    Various other minor bug fixes and improvements.
