Skip to content

Commit

Permalink
rbd: flatten cloned images to freeup snapshot
Browse files Browse the repository at this point in the history
flatten cloned images to remove the link
with the snapshot as the parent snapshot can
be removed from the trash.

Signed-off-by: Madhu Rajanna <madhupr007@gmail.com>
  • Loading branch information
Madhu-1 committed Jul 2, 2020
1 parent f4cf1a6 commit d10f953
Show file tree
Hide file tree
Showing 2 changed files with 49 additions and 3 deletions.
16 changes: 16 additions & 0 deletions internal/rbd/controllerserver.go
Original file line number Diff line number Diff line change
Expand Up @@ -699,7 +699,23 @@ func (cs *ControllerServer) CreateSnapshot(ctx context.Context, req *csi.CreateS
},
}, nil
}
var snaps []snapshotInfo
// check the number of snapshots on image
snaps, err = rbdVol.listSnapshots(ctx, cr)
if err != nil {
if _, ok := err.(ErrImageNotFound); ok {
return nil, status.Error(codes.InvalidArgument, err.Error())
}
return nil, status.Error(codes.Internal, err.Error())
}

if len(snaps) > int(maxSnapshotsOnImage) {
err = flattenClonedRbdImages(ctx, snaps, rbdVol.Pool, rbdVol.Monitors, cr)
if err != nil {
return nil, status.Error(codes.Internal, err.Error())
}
return nil, status.Errorf(codes.ResourceExhausted, "rbd image %s has %d snapshots", rbdVol, len(snaps))
}
err = reserveSnap(ctx, rbdSnap, rbdVol, cr)
if err != nil {
return nil, status.Error(codes.Internal, err.Error())
Expand Down
36 changes: 33 additions & 3 deletions internal/rbd/rbd_util.go
Original file line number Diff line number Diff line change
Expand Up @@ -429,12 +429,42 @@ func (rv *rbdVolume) getCloneDepth(ctx context.Context) (uint, error) {
}
}

func (rv *rbdVolume) flattenRbdImage(ctx context.Context, cr *util.Credentials, forceFlatten bool) error {
depth, err := rv.getCloneDepth(ctx)
func flattenClonedRbdImages(ctx context.Context, snaps []snapshotInfo, pool, monitors string, cr *util.Credentials) error {
rv := &rbdVolume{
Monitors: monitors,
Pool: pool,
}
defer rv.Destroy()
err := rv.Connect(cr)
if err != nil {
klog.Errorf(util.Log(ctx, "failed to open connection %s; err %v"), rv, err)
return err
}
klog.Infof(util.Log(ctx, "clone depth is (%d), configured softlimit (%d) and hardlimit (%d) for %s"), depth, rbdSoftMaxCloneDepth, rbdHardMaxCloneDepth, rv)
for _, s := range snaps {
if s.Namespace.Type == "trash" {
rv.RbdImageName = s.Namespace.OriginalName
err = rv.flattenRbdImage(ctx, cr, true)
if err != nil {
klog.Errorf(util.Log(ctx, "failed to flatten %s; err %v"), rv, err)
continue
}
}
}
return nil
}

func (rv *rbdVolume) flattenRbdImage(ctx context.Context, cr *util.Credentials, forceFlatten bool) error {
var depth uint
var err error

// skip clone depth check if request is for force flatten
if !forceFlatten {
depth, err = rv.getCloneDepth(ctx)
if err != nil {
return err
}
klog.Infof(util.Log(ctx, "clone depth is (%d), configured softlimit (%d) and hardlimit (%d) for %s"), depth, rbdSoftMaxCloneDepth, rbdHardMaxCloneDepth, rv)
}

if forceFlatten || (depth >= rbdHardMaxCloneDepth) || (depth >= rbdSoftMaxCloneDepth) {
args := []string{"flatten", rv.Pool + "/" + rv.RbdImageName, "--id", cr.ID, "--keyfile=" + cr.KeyFile, "-m", rv.Monitors}
Expand Down

0 comments on commit d10f953

Please sign in to comment.