Interoperability / {up/down}grade

Stakeholders

Identify developer(s), component validation engineer(s) & reviewer(s).

Introduction

This feature aims at building an infrastructure to manage pool format changes when upgrading DAOS to a new version (major, minor or bug fix). It does not cover the control plane and is limited to all pool/container/object metadata and data (including placement). Pools are considered here as independent entities that can be upgraded independently.

This feature is targeted at DAOS 2.2 to should provide an upgrade path from 2.0.x to 2.2.x and upward.

Requirements & Use Cases

Describe the key functionality, use cases and assumptions. This should include what is in-scope and out-of-scope.

SRS ticket is available here: https://daosio.atlassian.net/browse/SRS-365

The administrator should be able to upgrade to a new DAOS version while preserving its data. The existing pools and containers should be accessible after the upgrade with the same level of functionality as before the upgrade. New features available at the pool, container or object level won’t be automatically enabled on existing pools. New containers can be created in the pool, but won’t use the new features. At that point, the admin can decide to downgrade to the previous version.

Once satisfied with the new version, the admin can upgrade each pool individually to enable the new features/formats. The pool being upgraded won’t be accessible at the time of the upgrade (openers will be revoked and no new open request will be allowed during the upgrade). Upon completion of the upgrade, all pool is migrated to the new layout version and is available to users again.

Design Overview

Each DAOS version is associated with a layout version. For simplicity, this layout version is associated with the pool and cover all containers/objects in this pool. While this layout version might be bumped by one increment between releases, it might aggregate several independent layout changes including (non-exhaustive list):

  • new properties added to the pool/container

  • change in object/dkey placement (will require a lot of data movement)

  • new VOS/RDB format

  • new pool map format

The current layout version for a pool should be shown via pool properties. It is an integer number that is not directly related to the DAOS version number. A pool can be upgraded to the latest supported version via “dmg pool upgrade”. A pool is inaccessible during the upgrade. The upgrade can complete promptly if the layout changes were minor (e.g. adding new properties like in the case of 2.0 to 2.2) or be long running (e.g. placement changes). The dmg pool upgrade returns immediately and status is reported asynchronously via another pool property (similar to the container state property). The pool status can be reused for catastrophic recovery too and should probably be a bit flag if we want to record multiple state in the future.

If the system fails or is shutdown during the an pool upgrade, the process will be automatically resumed once the engine(s) are restarted. The status of the pool will be marked as upgrade in progress.

A pool upgrade can be initiated only if it is in a stable state where no rebuild/reintegration/extension operation is in progress. An error will be reported to the admin that should retry later.

For each version, we would need a list of actions that need to be performed in order to move to the next version. For instance:

  • V1

    • Action[0]: add new property for pool

  • V2

    • Action[0]: add new property for container

    • Action[1]: upgrade key distribution hash

  • V3

    • Action[0]: Change durable format of DTX

    • Action[1]: optimize B+tree in VOS

  • V4

    • Action[0]: Change durable format of object

    • Action[1]: Fixed a bug of placement algorithm

    • Action[2]: Add new property for container

When a pool is upgraded, the service can check and run required actions for this pool, e.g. pool-A(V3) only requires the last 3 actions for V4, pool-B(V2) has to run all actions of V3 and V4. Some of these actions might depend on data migration services (similar to rebalance of server addition).

For action that require data migration, we may ask in the future to have a certain percentage of free space before triggering the upgrade. The upgrade operation will fail to start if this requirement isn’t met and it will be up to the admin to free up space or extend the pool before attempting the upgrade again.

Please note that the container has a layout version property that is intended to be used by the middleware and is not interpreted by DAOS internally. This feature tracks the versioning at the pool level with new properties to be introduced.

User Interface

Primary interface will be via dmg pool upgrade.

$ dmg pool get-prop mypool
[…]
Pool version: 1
Pool status: Online

$ dmg pool upgrade mypool
Upgrading mypool from version 1 to version 2

$ dmg pool get-prop mypool
[…]
Pool version: 1
Pool status: Upgrading

$ dmg pool get-prop mypool
[…]
Pool version: 2
Pool status: Online

Some metrics might be exported in the future to monitor the progress of the upgrade.

Impacts

Any performance impact?
Any API changes? If so, internal or external API? Any changes required to middleware? Any interop requirements?Any VOS/config layout changes? How will migration will be supported?Any extra parameters required in the config file?Any wire protocol change? How will interop be supported?Any impact on the rebuild protocol?Any impact on aggregation?Any impact on security?

Quality

How the feature will be tested? Unit tests, functional tests and system tests need to be covered.
Describe the extra soak/performance tests that should be added.

A bunch of functional tests need to be integrated into the CI:

  • verify that data integrity is preserved after an upgrade

  • verify that an upgrade is effective (new properties are added in the case of 2.2)

  • verify that a pool cannot be accessed while an upgrade is in progress

  • verify that an interrupted upgrade (e.g. system shutdown or failure) is resumed upon restart

  • verify that a new container created in a pool with a old version does not enable the new features

In addition to this, end-to-end upgrade/downgrade tests should be developed.

Project Milestones

Description of the different milestones delivering incremental functionality.
Describe what will work/not work and what will be validated.
Targeted date for each milestone.

  • Milestone 1:

    • define the infrastructure to initiate a pool upgrade including

      • dmg interface

      • versioning scheme with new associated pool properties

      • revoke open handle and check that no rebuild/reint/extend in progress

      • restart after shutdown/failure

    • new container created in a pool with a old version should not enable the new features.

    • manage upgrade from 2.0 to 2.2

      • add new pool/container properties added between 2.0 and 2.2

    • downgrading the DAOS software of an upgraded pool report a proper RAS error.

  • Milestone 2:

    • address use case for data migration between 2.2 and 2.4 with the EC placement change.

    • add metrics to report progress