From 23c69f46abb7174f715fc8b526a70aed47ce2d14 Mon Sep 17 00:00:00 2001 From: Scott Seago Date: Fri, 8 Jul 2022 14:58:33 -0400 Subject: [PATCH] Item action progress monitoring design This design combines the requirements for the previously-merged Upload Progress Monitoring design with the requirements for the (not submitted but discussed in meetings and slack) proposed asynchronous item action plugins into one integrated proposal. Signed-off-by: Scott Seago --- design/AsyncActionFSM.graffle | Bin 0 -> 28721 bytes design/AsyncActionFSM.png | Bin 0 -> 76790 bytes design/general-progress-monitoring.md | 515 ++++++++++++++++++++++++++ 3 files changed, 515 insertions(+) create mode 100644 design/AsyncActionFSM.graffle create mode 100644 design/AsyncActionFSM.png create mode 100644 design/general-progress-monitoring.md diff --git a/design/AsyncActionFSM.graffle b/design/AsyncActionFSM.graffle new file mode 100644 index 0000000000000000000000000000000000000000..7e8e7ed210910de1adae3f1f506fc81ff5c20eff GIT binary patch literal 28721 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 literal 0 HcmV?d00001 diff --git a/design/general-progress-monitoring.md b/design/general-progress-monitoring.md new file mode 100644 index 0000000000..43731c08dc --- /dev/null +++ b/design/general-progress-monitoring.md @@ -0,0 +1,515 @@ +# Plugin Progress Monitoring + +This is intended as a replacement for the previously-approved Upload Progress Monitoring design +([Upload Progress Monitoring](upload-progress.md)) in order to expand the supported use cases beyond +snapshot uploads to include what was previously called Async Backup/Restore Item Actions. This +updated design should handle the combined set of use cases for those previously separate designs. + +Volume snapshotter plug-in are used by Velero to take snapshots of persistent volume contents. +Depending on the underlying storage system, those snapshots may be available to use immediately, +they may be uploaded to stable storage internally by the plug-in or they may need to be uploaded after +the snapshot has been taken. We would like for Velero to continue on to the next part of the backup as quickly +as possible but we would also like the backup to not be marked as complete until it is a usable backup. We'd also +eventually like to bring the control of upload under the control of Velero and allow the user to make decisions +about the ultimate destination of backup data independent of the storage system they're using. + +We would also like any internal or third party Backup or Restore Item Action to have the option of +making use of this same ability to run some external process without blocking the current backup or +restore operation. Beyond Volume Snapshotters, this is also needed for data mover operations on both +backup and restore, and potentially useful for other third party operations -- for example +in-cluster registry image backup or restore could make use of this feature in a third party plugin). + +### Glossary +- BIA: BackupItemAction +- RIA: RestoreItemAction + +## Examples +- AWS - AWS snapshots return quickly, but are then uploaded in the background and cannot be used until EBS moves +the data into S3 internally. + +- vSphere - The vSphere plugin takes a local snapshot and then the vSphere plugin uploads the data to S3. The local +snapshot is usable before the upload completes. + +- Restic - Does not go through the volume snapshot path. Restic backups will block Velero progress +until completed. However, with the more generalized approach in the revised design, restic/kopia +backup and restore *could* make use of this framework if their actions are refactored as +Backup/RestoreItemActions. + +- Data Movers + - Data movers are asynchronous processes executed inside backup/restore item actions that applies to a specific kubernetes resources. A common use case for data mover is to backup/restore PVCs whose data we want to move to some form of backup storage outside of using velero kopia/restic implementations. + - Workflow + - User takes velero backup of PVC A + - BIA plugin applies to PVCs with compatible storage driver + - BIA plugin triggers data mover + - Most common use case would be for the plugin action to create a new CR which would + trigger an external controller action + - Another possible use case would be for the plugin to run its own async action in a + goroutine, although this would be less resilient to plugin container restarts. + - BIA plugin returns + - Velero backup process continues + - Main velero backup process monitors running BIA threads via gRPC to determine if process is done and healthy + + +## Primary changes from the original Upload Progress Monitoring design + +The most fundamental change here is that rather than proposing a new special-purpose +SnapshotItemAction, the existing BackupItemAction plugin will be modified to accommodate an optional +snapshot (or other item operation) ID return. The primary reasons for this change are as follows: + +1. The intended scope has moved beyond snapshot processing, so it makes sense to support +asynchronous operations in other backup or restore item actions. + +2. We expect to have plugin API versioning implemented in Velero 1.10, making it feasible to +implement changes in the existing plugin APIs now. + +3. We will need this feature on both backup and restore, meaning that if we took the "new plugin +type" approach, we'd need two new plugin types. + +4. Other than the snapshot/operation ID return, the rest of the plugin processing is identical to +Backup/RestoreItemActions. With separate plugin types, we'd have to repeat all of that logic +(including dealing with additional items, etc.) twice. + +The other major change is that we will be applying this to both backups and restores, although the +Volume Snapshotter use case only needs this on backup. This means that everything we're doing around +backup phase and workflow will also need to be done for restore. + +Then there are various minor changes around terminology to make things more generic. Instead of +"snapshotID", we'll have "operationID" (which for volume snapshotters will be a snapshot +ID). + +## Goals + +- Enable monitoring of backup/restore item action operations that continue after snapshotting and other operations have completed +- Keep non-usable backups and restores (upload/persistence has not finished, etc.) from appearing as completed +- Make use of plugin API versioning functionality to manage changes to Backup/RestoreItemAction interfaces +- Enable vendors to plug their own data movers into velero using BIA/RIA plugins + +## Non-goals +- Today, Velero is unable to recover from an in progress backup when the velero server crashes (pod is deleted). This has an impact on running asynchronous processes, but it’s not something we intend to solve in this design. + +## Models + +### Internal configuration and management +In this model, movement of the snapshot to stable storage is under the control of the snapshot +plug-in. Decisions about where and when the snapshot gets moved to stable storage are not +directly controlled by Velero. This is the model for the current VolumeSnapshot plugins. + +### Velero controlled management +In this model, the snapshot is moved to external storage under the control of Velero. This +enables Velero to move data between storage systems. This also allows backup partners to use +Velero to snapshot data and then move the data into their backup repository. + +## Backup and Restore phases + +Velero currently has backup/restore phases "InProgress" and "Completed". A backup moves to the +Completed phase when all of the volume snapshots have completed and the Kubernetes metadata has been +written into the object store. However, the actual data movement may be happening in the background +after the backup has been marked "Completed". The backup is not actually a stable backup until the +data has been persisted properly. In some cases (e.g. AWS) the backup cannot be restored from until +the snapshots have been persisted. + +Once the snapshots have been taken, however, it is possible for additional backups or restores (as +long as they don't use not-yet-completed backups) to be made without interference. Waiting until +all data has been moved before starting the next backup will slow the progress of the system without +adding any actual benefit to the user. + +A new backup/restore phase, "WaitingForPluginOperations" will be introduced. When a backup or +restore has entered this phase, Velero is free to start another backup/restore. The backup/restore +will remain in the "WaitingForPluginOperations" phase until all BIA/RIA operations have completed +(for example, for a volume snapshotter, until all data has been successfully moved to persistent +storage). The backup/restore will not fail once it reaches this phase. If the backup is deleted +(cancelled), the plug-ins will attempt to delete the snapshots and stop the data movement - this may +not be possible with all storage systems. + +### State progression + +![image](AsyncActionFSM.png) +### New +When a backup/restore request is initially created, it is in the "New" phase. + +The next state is either "InProgress" or "FailedValidation" + +### FailedValidation +If the backup/restore request is incorrectly formed, it goes to the "FailedValidation" phase and +terminates + +### InProgress +When work on the backup/restore begins, it moves to the "InProgress" phase. It remains in the +"InProgress" phase until all pre/post execution hooks have been executed, all snapshots have been +taken and the Kubernetes metadata and backup/restore info is safely written to the object store +plug-in. + +In the current implementation, Restic backups will move data during the "InProgress" phase. In the +future, it may be possible to combine a snapshot with a Restic (or equivalent) backup which would +allow for data movement to be handled in the "WaitingForPluginOperations" phase, + +The next phase is either "Completed", "WaitingForPluginOperations", "Failed" or "PartiallyFailed". +Backups/restores which would have a final phase of "Completed" or "PartiallyFailed" may move to the +"WaitingForPluginOperations" or "WaitingForPluginOperationsPartialFailure" state. A backup/restore +which will be marked "Failed" will go directly to the "Failed" phase. Uploads may continue in the +background for snapshots that were taken by a "Failed" backup/restore, but no progress will not be +monitored or updated. If there are any operations in progress when a backup is moved to the "Failed" +phase (although with the current workflow, that shouldn't happen), Cancel() should be called on +these operations. When a "Failed" backup is deleted, all snapshots will be deleted and at that point +any uploads still in progress should be aborted. + +### WaitingForPluginOperations (new) +The "WaitingForPluginOperations" phase signifies that the main part of the backup/restore, including +snapshotting has completed successfully and uploading and any other asynchronous BIA/RIA plugin +operations are continuing. In the event of an error during this phase, the phase will change to +WaitingForPluginOperationsPartialFailure. On success, the phase changes to Completed. Backups +cannot be restored from when they are in the WaitingForPluginOperations state. + +### WaitingForPluginOperationsPartialFailure (new) +The "WaitingForPluginOperationsPartialFailure" phase signifies that the main part of the +backup/restore, including snapshotting has completed, but there were partial failures either during +the main part or during any async operations, including snapshot uploads. Backups cannot be +restored from when they are in the WaitingForPluginOperationsPartialFailure state. + +### Failed +When a backup/restore has had fatal errors it is marked as "Failed" Backups in this state cannot be +restored from. + +### Completed +The "Completed" phase signifies that the backup/restore has completed, all data has been transferred +to stable storage (or restored to the cluster) and any backup in this state is ready to be used in a +restore. When the Completed phase has been reached for a backup it is safe to remove any of the +items that were backed up. + +### PartiallyFailed +The "PartiallyFailed" phase signifies that the backup/restore has completed and at least part of the +backup/restore is usable. Restoration from a PartiallyFailed backup will not result in a complete +restoration but pieces may be available. + +## Workflow + +When a Backup or Restore Action is executed, any BackupItemAction, RestoreItemAction, or +VolumeSnapshot plugins will return operation IDs (snapshot IDs or other plugin-specific +identifiers). The plugin should be able to provide status on the progress for the snapshot and +handle cancellation of the operation/upload if the snapshot is deleted. If the plugin is restarted, +the operation ID should remain valid. + +When all snapshots have been taken and Kubernetes resources have been persisted to the ObjectStorePlugin +the backup will either have fatal errors or will be at least partially usable. + +If the backup/restore has fatal errors it will move to the "Failed" state and finish. If a +backup/restore fails, the upload or other operation will not be cancelled but it will not be +monitored either. For backups in any phase, all snapshots will be deleted when the backup is +deleted. Plugins will cancel any data movement or other operations and remove snapshots and other +associated resources when the VolumeSnapshotter DeleteSnapshot method or DeleteItemAction Execute +method is called. + +Velero will poll the plugins for status on the operations when the backup/restore exits the +"InProgress" phase and has no fatal errors. + +If any operations are not complete, the backup/restore will move to either WaitingForPluginOperations +or WaitingForPluginOperationsPartialFailure or Failed. + +Post-snapshot and other operations may take a long time and Velero and its plugins may be restarted +during this time. Once a backup/restore has moved into the WaitingForPluginOperations or +WaitingForPluginOperationsPartialFailure phase, another backup/restore may be started. + +While in the WaitingForPluginOperations or WaitingForPluginOperationsPartialFailure phase, the +snapshots and item actions will be periodically polled. When all of the snapshots and item actions +have reported success, the backup/restore will move to the Completed or PartiallyFailed phase, +depending on whether the backup/restore was in the WaitingForPluginOperations or +WaitingForPluginOperationsPartialFailure phase. + +The Backup resources will not be written to object storage until the backup has entered a final phase: +Completed, Failed or PartialFailure + +## Reconciliation of InProgress backups + +InProgress backups will not have a `velero-backup.json` present in the object store. During +reconciliation, backups which do not have a `velero-backup.json` object in the object store will be +ignored. + +## Plug-in API changes + +### OperationProgress struct + + type OperationProgress struct { + Completed bool // True when the operation has completed, either successfully or with a failure + Err string // Set when the operation has failed + Completed, Total int64 // Quantity completed so far and the total quanity associated with the operaation in operationUnits + // For data mover and volume snapshotter use cases, this would be in bytes + // On successful completion, completed and total should be the same. + OperationUnits string // Units represented by completed and total -- for data mover and item + // snapshotters, this will usually be bytes. + Description string // Optional description of operation progress + Started, Updated time.Time // When the upload was started and when the last update was seen. Not all + // systems retain when the upload was begun, return Time 0 (time.Unix(0, 0)) + // if unknown. + } + +### VolumeSnapshotter changes + +Two new methods will be added to the VolumeSnapshotter interface: + + Progress(snapshotID string) (OperationProgress, error) + Cancel(snapshotID string) (error) + +Open question: Does VolumeSnapshotter need Cancel, or is that only needed for BIA/RIA? + +Progress will report the current status of a snapshot upload. This should be callable at +any time after the snapshot has been taken. In the event a plug-in is restarted, if the operationID +(snapshot ID) continues to be valid it should be possible to retrieve the progress. + +`error` is set if there is an issue retrieving progress. If the snapshot is has encountered an +error during the upload, the error should be returned in OperationProgress and error should be nil. + +### BackupItemAction and RestoreItemAction plug-in changes + +Currently CSI snapshots and the Velero Plug-in for vSphere are implemented as BackupItemAction +plugins. While the majority of BackupItemAction plugins do not take snapshots or upload data, this +functionality is useful for any longstanding plugin operation managed by an external +process/controller so we will modify BackupItemAction and RestoreItemAction to optionally return an +operationID in addition to the modified item. + +Velero can attempt to cancel an operation by calling the Cancel API call on the BIA/RIA. The plugin +can then take any appropriate action as needed. Cancel will be called on backup deletion, and +possibly upon reaching timeouts, if timeout support is included in this feature. Cancel is not +intended to be used to delete/remove the results of completed actions. + +_AsyncOperationsNotSupportedError_ should only be returned (by either Cancel or by Progress) if the +Backup/RestoreItemAction plugin should not be handling the item. If the Backup/RestoreItemAction +plugin should handle the item but, for example, the item/snapshot ID cannot be found to report +progress, Progress or Cancel will return an InvalidOperationIDError error rather than a populated +OperationProgress struct. If the item action does not start an asynchronous operation, then +operationID will be empty. + +Two new methods will be added to the BackupItemAction interface, and the Execute() return signature +will be modified: + + // Execute allows the ItemAction to perform arbitrary logic with the item being backed up, + // including mutating the item itself prior to backup. The item (unmodified or modified) + // should be returned, an optional operationID, along with an optional slice of ResourceIdentifiers + // specifying additional related items that should be backed up. If operationID is specified + // then velero will wait for this operation to complete before the backup is marked Completed. + Execute(item runtime.Unstructured, backup *api.Backup) (runtime.Unstructured, operationID string, + []ResourceIdentifier, error) + + // Progress + Progress(input *BackupItemActionProgressInput) (OperationProgress, error) + // Cancel + Cancel(input *BackupItemActionProgressInput) error + + // BackupItemActionProgressInput contains the input parameters for the BackupItemAction's Progress function. + type BackupItemActionProgressInput struct { + // Item is the item that was stored in the backup + Item runtime.Unstructured + // OperationID is the operation ID returned by BackupItemAction Execute + operationID string + // Backup is the representation of the backup resource processed by Velero. + Backup *velerov1api.Backup + } + +Two new methods will be added to the RestoreItemAction interface, and the +RestoreItemActionExecuteOutput struct will be modified: + + // Execute allows the ItemAction to perform arbitrary logic with the item being restored, + // including mutating the item itself prior to restore. The item (unmodified or modified) + // should be returned, an optional OperationID, along with an optional slice of ResourceIdentifiers + // specifying additional related items that should be restored, a warning (which will be + // logged but will not prevent the item from being restored) or error (which will be logged + // and will prevent the item from being restored) if applicable. If OperationID is specified + // then velero will wait for this operation to complete before the restore is marked Completed. + Execute(input *RestoreItemActionExecuteInput) (*RestoreItemActionExecuteOutput, error) + + + // Progress + Progress(input *RestoreItemActionProgressInput) (OperationProgress, error) + + // Cancel + Cancel(input *RestoreItemActionProgressInput) error + + // RestoreItemActionExecuteOutput contains the output variables for the ItemAction's Execution function. + type RestoreItemActionExecuteOutput struct { + // UpdatedItem is the item being restored mutated by ItemAction. + UpdatedItem runtime.Unstructured + + // AdditionalItems is a list of additional related items that should + // be restored. + AdditionalItems []ResourceIdentifier + + // SkipRestore tells velero to stop executing further actions + // on this item, and skip the restore step. When this field's + // value is true, AdditionalItems will be ignored. + SkipRestore bool + + // OperationID is an identifier which indicates an ongoing asynchronous action which Velero will + // continue to monitor after restoring this item. If left blank, then there is no ongoing operation + OperationID string + } + + // RestoreItemActionProgressInput contains the input parameters for the RestoreItemAction's Progress function. + type RestoreItemActionProgressInput struct { + // Item is the item that was stored in the restore + Item runtime.Unstructured + // OperationID is the operation ID returned by RestoreItemAction Execute + operationID string + // Restore is the representation of the restore resource processed by Velero. + Restore *velerov1api.Restore + } + +## Changes in Velero backup format + +No changes to the existing format are introduced by this change. As part of the backup workflow changes, a +`-itemoperations.json.gz` file will be added that contains the items and operation IDs +(snapshotIDs) returned by VolumeSnapshotter and BackupItemAction plugins. Also, the creation of the +`velero-backup.json` object will not occur until the backup moves to one of the terminal phases +(_Completed_, _PartiallyFailed_, or _Failed_). Reconciliation should ignore backups that do not +have a `velero-backup.json` object. + +The Backup/RestoreItemAction plugin identifier as well as the ItemID and OperationID will be stored +in the `-itemoperations.json.gz`. When checking for progress, this info will be used +to select the appropriate Backup/RestoreItemAction plugin to query for progress. Here's an example +of what a record for a datamover plugin might look like: +``` + { + "itemOperation": { + "plugin": "velero.io/datamover-backup", + "itemID": "", + "operationID": "" + } + } +``` + +The cluster that is creating the backup will have the Backup resource present and will be able to +manage the backup before the backup completes. + +If the Backup resource is removed (e.g. Velero is uninstalled) before a backup completes and writes +its `velero-backup.json` object, the other objects in the object store for the backup will be +effectively orphaned. This can currently happen but the current window is much smaller. + +### `-itemoperations.json.gz` +The itemoperations file is similar to the existing `-itemsnapshots.json.gz` Each snapshot taken via +BackupItemAction will have a JSON record in the file. Exact format TBD. + +This file will be uploaded to object storage at the end of processing all of the items in the +backup, before the phase moves away from `InProgress`. + +## Changes to Velero restores + +A `-itemoperations.json.gz` file will be added that contains the items and operation +IDs returned by RestoreItemActions. The format will be the same as the +`-itemoperations.json.gz` generated for backups. + +This file will be uploaded to object storage at the end of processing all of the items in the +restore, before the phase moves away from `InProgress`. + +## CSI snapshots + +For systems such as EBS, a snapshot is not available until the storage system has transferred the +snapshot to stable storage. CSI snapshots expose the _readyToUse_ state that, in the case of EBS, +indicates that the snapshot has been transferred to durable storage and is ready to be used. The +CSI BackupItemAction.Progress method will poll that field and when completed, return completion. + +## vSphere plug-in + +The vSphere Plug-in for Velero uploads snapshots to S3 in the background. This is also a +BackupItemAction plug-in, it will check the status of the Upload records for the snapshot and return +progress. + +## Backup workflow changes + +The backup workflow remains the same until we get to the point where the `velero-backup.json` object +is written. At this point, we will queue the backup to a finalization go-routine. The next backup +may then begin. The finalization routine will run across all of the +VolumeSnapshotter/BackupItemAction operations and call the _Progress_ method on each of them. + +If all snapshot and backup item operations have finished (either successfully or failed), the backup +will be completed and the backup will move to the appropriate terminal phase and upload the +`velero-backup.json` object to the object store and the backup will be complete. + +If any of the snapshots or backup items are still being processed, the phase of the backup will be +set to the appropriate phase (_WaitingForPluginOperations_ or +_WaitingForPluginOperationsPartialFailure_). In the event of any of the progress checks return an +error, the phase will move to _WaitingForPluginOperationsPartialFailure_. The backup will then be +requeued and will be rechecked again after some time has passed. + +## Restore workflow changes + +The restore workflow remains the same until velero would currently move the backup into one of the +terminal states. At this point, we will queue the restore to a finalization go-routine. The next +restore may then begin. The finalization routine will run across all of the RestoreItemAction +operations and call the _Progress_ method on each of them. + +If all restore item operations have finished (either successfully or failed), the restore will be +completed and the restore will move to the appropriate terminal phase and the restore will be +complete. + +If any of the restore items are still being processed, the phase of the restore will be set to the +appropriate phase (_WaitingForPluginOperations_ or _WaitingForPluginOperationsPartialFailure_). In +the event of any of the progress checks return an error, the phase will move to +_WaitingForPluginOperationsPartialFailure_. The restore will then be requeued and will be rechecked +again after some time has passed. + +## Restart workflow + +On restart, the Velero server will scan all Backup/Restore resources. Any Backup/Restore resources +which are in the _InProgress_ phase will be moved to the _Failed_ phase. Any Backup/Restore +resources in the _WaitingForPluginOperations_ or _WaitingForPluginOperationsPartialFailure_ phase +will be treated as if they have been requeued and progress checked and the backup/restore will be +requeued or moved to a terminal phase as appropriate. + +## Notes on already-merged code which may need updating + +Since this design is modifying a previously-approved design, there is some preparation work based on +the earlier upload progress monitoring design that may need modification as a result of these +updates. Here is a list of some of these items: + +1. Consts for the "Uploading" and "UploadingPartialFailure" phases have already been defined. These + will need to be removed when the "WaitingForPluginOperations" and + "WaitingForPluginOperationsPartialFailure" phases are defined. + - https://github.com/vmware-tanzu/velero/pull/3805 +1. Remove the ItemSnapshotter plugin APIs (and related code) since the revised design will reuse + VolumeSnapshotter and BackupItemAction plugins. + - https://github.com/vmware-tanzu/velero/pull/4077 + - https://github.com/vmware-tanzu/velero/pull/4417 +1. UploadProgressFeatureFlag shouldn't be needed anymore. The current design won't really need a + feature flag here -- the new features will be added to V2 of the VolumeSnapshotter, + BackupItemAction, and RestoreItemAction plugins, and it will only be used if there are plugins which + return operation IDs. + - https://github.com/vmware-tanzu/velero/pull/4416 +1. Adds -itemsnapshots.gz file to backup (when provided) -- this is still part of the + revised design, so it should stay. + - https://github.com/vmware-tanzu/velero/pull/4429 +1. Upload Progress Monitoring and Item Snapshotter basic support: This PR is not yet merged, so + nothing will need to be reverted. While the implementation here will be useful in informing the + implementation of the new design, several things have changed in the design proposal since the PR + was written. + - https://github.com/vmware-tanzu/velero/pull/4467 + +# Implementation tasks + +VolumeSnapshotter new plugin APIs +BackupItemAction new plugin APIs +RestoreItemAction new plugin APIs +New backup phases +New restore phases +Defer uploading `velero-backup.json` +AWS EBS plug-in Progress implementation +Operation monitoring +Implementation of `-itemoperations.json.gz` file +Implementation of `-itemoperations.json.gz` file +Restart logic +Change in reconciliation logic to ignore backups/restores that have not completed +CSI plug-in BackupItemAction Progress implementation +vSphere plug-in BackupItemAction Progress implementation (vSphere plug-in team) + + +# Open Questions + +1. Do we need a Cancel operation for VolumeSnapshotter? + - From feedback, I'm thinking we probably don't need it. The only real purpose of Cancel + here is to tell the plugin that Velero won't be waiting anymore, so if there are any + required custom cancellation actions, now would be a good time to perform them. For snapshot + uploads that are already in proress, there's not really anything else to cancel. +2. Should we actually write the backup *before* moving to the WaitingForPluginOperations or + WaitingForPluginOperationsPartialFailure phase rather than waiting until all operations + have completed? The operations in question won't affect what gets written to object storage + for the backup, and since we've already written the list of operations we're waiting for to + object storage, writing the backup now would make the process resilient to Velero restart if + it happens during WaitingForPluginOperations or WaitingForPluginOperationsPartialFailure +