rbd: fix clone problem

This commit fixes a bug in checkCloneImage() which was caused
by checking cloned image before checking on temp-clone image snap
in a subsequent request which lead to stale images. This was solved
by checking temp-clone image snap and flattening temp-clone if
needed.
This commit also fixes comparison bug in flattenCloneImage().

Signed-off-by: Rakshith R <rar@redhat.com>
Signed-off-by: Madhu Rajanna <madhupr007@gmail.com>
This commit is contained in:
Madhu Rajanna 2021-07-12 11:11:46 +05:30 committed by mergify[bot]
parent 916c97b4a8
commit a5a8952716
2 changed files with 15 additions and 28 deletions

View File

@ -52,31 +52,7 @@ func (rv *rbdVolume) checkCloneImage(ctx context.Context, parentVol *rbdVolume)
snap.RbdSnapName = rv.RbdImageName snap.RbdSnapName = rv.RbdImageName
snap.Pool = rv.Pool snap.Pool = rv.Pool
// check if cloned image exists err := tempClone.checkSnapExists(snap)
err := rv.getImageInfo()
if err == nil {
// check if do we have temporary snapshot on temporary cloned image
sErr := tempClone.checkSnapExists(snap)
if sErr != nil {
if errors.Is(err, ErrSnapNotFound) {
return true, nil
}
return false, err
}
err = tempClone.deleteSnapshot(ctx, snap)
if err == nil {
return true, nil
}
return false, err
}
if !errors.Is(err, ErrImageNotFound) {
// return error if its not image not found
return false, err
}
err = tempClone.checkSnapExists(snap)
if err != nil { if err != nil {
switch { switch {
case errors.Is(err, ErrSnapNotFound): case errors.Is(err, ErrSnapNotFound):
@ -92,6 +68,11 @@ func (rv *rbdVolume) checkCloneImage(ctx context.Context, parentVol *rbdVolume)
if err != nil { if err != nil {
return false, err return false, err
} }
// check image needs flatten, if yes add task to flatten the clone
err = rv.flattenRbdImage(ctx, rv.conn.Creds, false, rbdHardMaxCloneDepth, rbdSoftMaxCloneDepth)
if err != nil {
return false, err
}
return true, nil return true, nil
case !errors.Is(err, ErrImageNotFound): case !errors.Is(err, ErrImageNotFound):
@ -116,6 +97,11 @@ func (rv *rbdVolume) checkCloneImage(ctx context.Context, parentVol *rbdVolume)
return false, err return false, err
} }
// check image needs flatten, if yes add task to flatten the clone
err = rv.flattenRbdImage(ctx, rv.conn.Creds, false, rbdHardMaxCloneDepth, rbdSoftMaxCloneDepth)
if err != nil {
return false, err
}
return true, nil return true, nil
} }
@ -162,7 +148,7 @@ func (rv *rbdVolume) createCloneFromImage(ctx context.Context, parentVol *rbdVol
err = rv.doSnapClone(ctx, parentVol) err = rv.doSnapClone(ctx, parentVol)
if err != nil { if err != nil {
return status.Error(codes.Internal, err.Error()) return err
} }
err = rv.getImageID() err = rv.getImageID()
@ -284,10 +270,10 @@ func (rv *rbdVolume) flattenCloneImage(ctx context.Context) error {
softLimit := rbdSoftMaxCloneDepth softLimit := rbdSoftMaxCloneDepth
// choosing 2 so that we don't need to flatten the image in the request. // choosing 2 so that we don't need to flatten the image in the request.
const depthToAvoidFlatten = 2 const depthToAvoidFlatten = 2
if rbdHardMaxCloneDepth < depthToAvoidFlatten { if rbdHardMaxCloneDepth > depthToAvoidFlatten {
hardLimit = rbdHardMaxCloneDepth - depthToAvoidFlatten hardLimit = rbdHardMaxCloneDepth - depthToAvoidFlatten
} }
if rbdSoftMaxCloneDepth < depthToAvoidFlatten { if rbdSoftMaxCloneDepth > depthToAvoidFlatten {
softLimit = rbdSoftMaxCloneDepth - depthToAvoidFlatten softLimit = rbdSoftMaxCloneDepth - depthToAvoidFlatten
} }
err := tempClone.getImageInfo() err := tempClone.getImageInfo()

View File

@ -311,6 +311,7 @@ func (rv *rbdVolume) Exists(ctx context.Context, parentVol *rbdVolume) (bool, er
return false, err return false, err
} }
// TODO: check image needs flattening and completed?
err = rv.repairImageID(ctx, j) err = rv.repairImageID(ctx, j)
if err != nil { if err != nil {