From 5c40f1ef332300b3af9db2ab1e7b9f52caa37c66 Mon Sep 17 00:00:00 2001 From: Yati Padia Date: Thu, 2 Jun 2022 16:31:43 +0530 Subject: [PATCH] rbd: remove the clone in case of failure This commit removes the clone incase unsetAllMetadata or copyEncryptionConfig or expand fails for createVolumeFromSnapshot and CreateSnapshot. It also removes the clone in case of any failure in createCloneFromImage. issue: #3103 Signed-off-by: Yati Padia --- internal/rbd/clone.go | 10 ++++++++++ internal/rbd/controllerserver.go | 21 +++++++++++++++++++++ 2 files changed, 31 insertions(+) diff --git a/internal/rbd/clone.go b/internal/rbd/clone.go index 41efa2584..a0faa468b 100644 --- a/internal/rbd/clone.go +++ b/internal/rbd/clone.go @@ -138,6 +138,16 @@ func (rv *rbdVolume) createCloneFromImage(ctx context.Context, parentVol *rbdVol return err } + defer func() { + if err != nil { + log.DebugLog(ctx, "Removing clone image %q", rv) + errDefer := rv.deleteImage(ctx) + if errDefer != nil { + log.ErrorLog(ctx, "failed to delete clone image %q: %v", rv, errDefer) + } + } + }() + err = rv.getImageID() if err != nil { log.ErrorLog(ctx, "failed to get volume id %s: %v", rv, err) diff --git a/internal/rbd/controllerserver.go b/internal/rbd/controllerserver.go index b6a8f7e6a..c94790553 100644 --- a/internal/rbd/controllerserver.go +++ b/internal/rbd/controllerserver.go @@ -644,6 +644,17 @@ func (cs *ControllerServer) createVolumeFromSnapshot( return err } + + defer func() { + if err != nil { + log.DebugLog(ctx, "Removing clone image %q", rbdVol) + errDefer := rbdVol.deleteImage(ctx) + if errDefer != nil { + log.ErrorLog(ctx, "failed to delete clone image %q: %v", rbdVol, errDefer) + } + } + }() + err = rbdVol.unsetAllMetadata(k8s.GetSnapshotMetadataKeys()) if err != nil { log.ErrorLog(ctx, "failed to unset snapshot metadata on rbd image %q: %v", rbdVol, err) @@ -1142,6 +1153,16 @@ func (cs *ControllerServer) CreateSnapshot( rbdVol.RbdImageName = rbdSnap.RbdSnapName rbdVol.ClusterName = cs.ClusterName + defer func() { + if err != nil { + log.DebugLog(ctx, "Removing clone image %q", rbdVol) + errDefer := rbdVol.deleteImage(ctx) + if errDefer != nil { + log.ErrorLog(ctx, "failed to delete clone image %q: %v", rbdVol, errDefer) + } + } + }() + err = rbdVol.unsetAllMetadata(k8s.GetVolumeMetadataKeys()) if err != nil { return nil, status.Error(codes.Internal, err.Error())