From f7f662678a42ac19ab9f36f1a1aa96318a81b449 Mon Sep 17 00:00:00 2001 From: Madhu Rajanna Date: Wed, 15 Dec 2021 12:00:41 +0530 Subject: [PATCH] rbd: consider ErrImageNotFound during DeleteSnapshot added a check to consider ErrImageNotFound error during DeleteSnapshot operation, if the error is ErrImageNotFound we need to ensure that image is removed from the trash and also the rados OMAP data is removed. Signed-off-by: Madhu Rajanna --- internal/rbd/controllerserver.go | 70 +++++++++++++++++++++++--------- 1 file changed, 50 insertions(+), 20 deletions(-) diff --git a/internal/rbd/controllerserver.go b/internal/rbd/controllerserver.go index 64c6175cf..10acab35e 100644 --- a/internal/rbd/controllerserver.go +++ b/internal/rbd/controllerserver.go @@ -1327,6 +1327,17 @@ func (cs *ControllerServer) DeleteSnapshot( return &csi.DeleteSnapshotResponse{}, nil } + // if the error is ErrImageNotFound, We need to cleanup the image from + // trash and remove the metadata in OMAP. + if errors.Is(err, ErrImageNotFound) { + err = cleanUpImageAndSnapReservation(ctx, rbdSnap, cr) + if err != nil { + return nil, status.Error(codes.Internal, err.Error()) + } + + return &csi.DeleteSnapshotResponse{}, nil + } + return nil, status.Error(codes.Internal, err.Error()) } @@ -1350,28 +1361,14 @@ func (cs *ControllerServer) DeleteSnapshot( } defer rbdVol.Destroy() - err = rbdVol.getImageInfo() + rbdVol.ImageID = rbdSnap.ImageID + // update parent name to delete the snapshot + rbdSnap.RbdImageName = rbdVol.RbdImageName + err = cleanUpSnapshot(ctx, rbdVol, rbdSnap, rbdVol, cr) if err != nil { - if errors.Is(err, ErrImageNotFound) { - err = rbdVol.ensureImageCleanup(ctx) - if err != nil { - return nil, status.Error(codes.Internal, err.Error()) - } - } else { - log.ErrorLog(ctx, "failed to delete rbd image: %s/%s with error: %v", rbdVol.Pool, rbdVol.VolName, err) + log.ErrorLog(ctx, "failed to delete image: %v", err) - return nil, status.Error(codes.Internal, err.Error()) - } - } else { - rbdVol.ImageID = rbdSnap.ImageID - // update parent name to delete the snapshot - rbdSnap.RbdImageName = rbdVol.RbdImageName - err = cleanUpSnapshot(ctx, rbdVol, rbdSnap, rbdVol, cr) - if err != nil { - log.ErrorLog(ctx, "failed to delete image: %v", err) - - return nil, status.Error(codes.Internal, err.Error()) - } + return nil, status.Error(codes.Internal, err.Error()) } err = undoSnapReservation(ctx, rbdSnap, cr) if err != nil { @@ -1384,6 +1381,39 @@ func (cs *ControllerServer) DeleteSnapshot( return &csi.DeleteSnapshotResponse{}, nil } +// cleanUpImageAndSnapReservation cleans up the image from the trash and +// snapshot reservation in rados OMAP. +func cleanUpImageAndSnapReservation(ctx context.Context, rbdSnap *rbdSnapshot, cr *util.Credentials) error { + rbdVol := generateVolFromSnap(rbdSnap) + err := rbdVol.Connect(cr) + if err != nil { + return status.Error(codes.Internal, err.Error()) + } + defer rbdVol.Destroy() + + err = rbdVol.openIoctx() + if err != nil { + return status.Error(codes.Internal, err.Error()) + } + + // cleanup the image from trash if the error is image not found. + err = rbdVol.ensureImageCleanup(ctx) + if err != nil { + log.ErrorLog(ctx, "failed to delete rbd image: %q with error: %v", rbdVol.Pool, rbdVol.VolName, err) + + return status.Error(codes.Internal, err.Error()) + } + err = undoSnapReservation(ctx, rbdSnap, cr) + if err != nil { + log.ErrorLog(ctx, "failed to remove reservation for snapname (%s) with backing snap %q", + rbdSnap.RequestName, rbdSnap, err) + + return status.Error(codes.Internal, err.Error()) + } + + return nil +} + // ControllerExpandVolume expand RBD Volumes on demand based on resizer request. func (cs *ControllerServer) ControllerExpandVolume( ctx context.Context,