mirror of
https://github.com/ceph/ceph-csi.git
synced 2024-12-18 11:00:25 +00:00
rbd: flatten temp cloned images
If the snapshots on the parent image exceeds maxSnapshotsOnImage count, we need to flatten all the temporary cloned images to over come the krbd issue of maximum number of snapshots on an image. Signed-off-by: Madhu Rajanna <madhupr007@gmail.com>
This commit is contained in:
parent
2fe1ee5287
commit
8fc9146056
@ -227,15 +227,11 @@ func (cs *ControllerServer) CreateVolume(ctx context.Context, req *csi.CreateVol
|
|||||||
return buildCreateVolumeResponse(ctx, req, rbdVol)
|
return buildCreateVolumeResponse(ctx, req, rbdVol)
|
||||||
}
|
}
|
||||||
|
|
||||||
if parentVol != nil {
|
err = flattenParentImage(ctx, parentVol, cr)
|
||||||
// flatten the image or its parent before the reservation to avoid
|
|
||||||
// stale entries in post creation if we return ABORT error and the
|
|
||||||
// delete volume is not called
|
|
||||||
err = parentVol.flattenCloneImage(ctx)
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, getGRPCErrorForCreateVolume(err)
|
return nil, err
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
err = reserveVol(ctx, rbdVol, rbdSnap, cr)
|
err = reserveVol(ctx, rbdVol, rbdSnap, cr)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, status.Error(codes.Internal, err.Error())
|
return nil, status.Error(codes.Internal, err.Error())
|
||||||
@ -282,6 +278,50 @@ func (cs *ControllerServer) CreateVolume(ctx context.Context, req *csi.CreateVol
|
|||||||
return &csi.CreateVolumeResponse{Volume: volume}, nil
|
return &csi.CreateVolumeResponse{Volume: volume}, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func flattenParentImage(ctx context.Context, rbdVol *rbdVolume, cr *util.Credentials) error {
|
||||||
|
if rbdVol != nil {
|
||||||
|
// flatten the image or its parent before the reservation to avoid
|
||||||
|
// stale entries in post creation if we return ABORT error and the
|
||||||
|
// delete volume is not called
|
||||||
|
err := rbdVol.flattenCloneImage(ctx)
|
||||||
|
if err != nil {
|
||||||
|
return getGRPCErrorForCreateVolume(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
// flatten cloned images if the snapshot count on the parent image
|
||||||
|
// exceeds maxSnapshotsOnImage
|
||||||
|
err = flattenTemporaryClonedImages(ctx, rbdVol, cr)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// check snapshots on the rbd image, as we have limit from krbd that
|
||||||
|
// an image cannot have more than 510 snapshot at a given point of time.
|
||||||
|
// If the snapshots are more than the `maxSnapshotsOnImage` Add a task to
|
||||||
|
// flatten all the temporary cloned images.
|
||||||
|
func flattenTemporaryClonedImages(ctx context.Context, rbdVol *rbdVolume, cr *util.Credentials) error {
|
||||||
|
snaps, err := rbdVol.listSnapshots(ctx, cr)
|
||||||
|
if err != nil {
|
||||||
|
var einf ErrImageNotFound
|
||||||
|
if errors.As(err, &einf) {
|
||||||
|
return status.Error(codes.InvalidArgument, err.Error())
|
||||||
|
}
|
||||||
|
return status.Error(codes.Internal, err.Error())
|
||||||
|
}
|
||||||
|
|
||||||
|
if len(snaps) > int(maxSnapshotsOnImage) {
|
||||||
|
err = flattenClonedRbdImages(ctx, snaps, rbdVol.Pool, rbdVol.Monitors, cr)
|
||||||
|
if err != nil {
|
||||||
|
return status.Error(codes.Internal, err.Error())
|
||||||
|
}
|
||||||
|
return status.Errorf(codes.ResourceExhausted, "rbd image %s has %d snapshots", rbdVol, len(snaps))
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
// checkFlatten ensures that that the image chain depth is not reached
|
// checkFlatten ensures that that the image chain depth is not reached
|
||||||
// hardlimit or softlimit. if the softlimit is reached it adds a task and
|
// hardlimit or softlimit. if the softlimit is reached it adds a task and
|
||||||
// return success,the hardlimit is reached it starts a task to flatten the
|
// return success,the hardlimit is reached it starts a task to flatten the
|
||||||
|
Loading…
Reference in New Issue
Block a user