Merge pull request #335 from red-hat-storage/sync_ds--devel

Syncing latest changes from devel for ceph-csi
This commit is contained in:
openshift-merge-bot[bot] 2024-07-10 07:20:09 +00:00 committed by GitHub
commit 80c56bc413
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
12 changed files with 92 additions and 56 deletions

View File

@ -245,7 +245,7 @@ func ReserveVolumeGroup(
defer j.Destroy() defer j.Destroy()
groupUUID, vgsi.FsVolumeGroupSnapshotName, err = j.ReserveName( groupUUID, vgsi.FsVolumeGroupSnapshotName, err = j.ReserveName(
ctx, volOptions.MetadataPool, util.InvalidPoolID, volOptions.RequestName, volOptions.NamePrefix) ctx, volOptions.MetadataPool, volOptions.RequestName, volOptions.NamePrefix)
if err != nil { if err != nil {
return nil, err return nil, err
} }

View File

@ -68,7 +68,7 @@ func (rscs *ReclaimSpaceControllerServer) ControllerReclaimSpace(
if err != nil { if err != nil {
return nil, status.Errorf(codes.Aborted, "failed to find volume with ID %q: %s", volumeID, err.Error()) return nil, status.Errorf(codes.Aborted, "failed to find volume with ID %q: %s", volumeID, err.Error())
} }
defer rbdVol.Destroy() defer rbdVol.Destroy(ctx)
err = rbdVol.Sparsify() err = rbdVol.Sparsify()
if errors.Is(err, rbdutil.ErrImageInUse) { if errors.Is(err, rbdutil.ErrImageInUse) {

View File

@ -273,7 +273,7 @@ func (rs *ReplicationServer) EnableVolumeReplication(ctx context.Context,
rbdVol, err := corerbd.GenVolFromVolID(ctx, volumeID, cr, req.GetSecrets()) rbdVol, err := corerbd.GenVolFromVolID(ctx, volumeID, cr, req.GetSecrets())
defer func() { defer func() {
if rbdVol != nil { if rbdVol != nil {
rbdVol.Destroy() rbdVol.Destroy(ctx)
} }
}() }()
if err != nil { if err != nil {
@ -350,7 +350,7 @@ func (rs *ReplicationServer) DisableVolumeReplication(ctx context.Context,
rbdVol, err := corerbd.GenVolFromVolID(ctx, volumeID, cr, req.GetSecrets()) rbdVol, err := corerbd.GenVolFromVolID(ctx, volumeID, cr, req.GetSecrets())
defer func() { defer func() {
if rbdVol != nil { if rbdVol != nil {
rbdVol.Destroy() rbdVol.Destroy(ctx)
} }
}() }()
if err != nil { if err != nil {
@ -425,7 +425,7 @@ func (rs *ReplicationServer) PromoteVolume(ctx context.Context,
rbdVol, err := corerbd.GenVolFromVolID(ctx, volumeID, cr, req.GetSecrets()) rbdVol, err := corerbd.GenVolFromVolID(ctx, volumeID, cr, req.GetSecrets())
defer func() { defer func() {
if rbdVol != nil { if rbdVol != nil {
rbdVol.Destroy() rbdVol.Destroy(ctx)
} }
}() }()
if err != nil { if err != nil {
@ -525,7 +525,7 @@ func (rs *ReplicationServer) DemoteVolume(ctx context.Context,
rbdVol, err := corerbd.GenVolFromVolID(ctx, volumeID, cr, req.GetSecrets()) rbdVol, err := corerbd.GenVolFromVolID(ctx, volumeID, cr, req.GetSecrets())
defer func() { defer func() {
if rbdVol != nil { if rbdVol != nil {
rbdVol.Destroy() rbdVol.Destroy(ctx)
} }
}() }()
if err != nil { if err != nil {
@ -642,7 +642,7 @@ func (rs *ReplicationServer) ResyncVolume(ctx context.Context,
rbdVol, err := corerbd.GenVolFromVolID(ctx, volumeID, cr, req.GetSecrets()) rbdVol, err := corerbd.GenVolFromVolID(ctx, volumeID, cr, req.GetSecrets())
defer func() { defer func() {
if rbdVol != nil { if rbdVol != nil {
rbdVol.Destroy() rbdVol.Destroy(ctx)
} }
}() }()
if err != nil { if err != nil {
@ -856,7 +856,7 @@ func (rs *ReplicationServer) GetVolumeReplicationInfo(ctx context.Context,
rbdVol, err := corerbd.GenVolFromVolID(ctx, volumeID, cr, req.GetSecrets()) rbdVol, err := corerbd.GenVolFromVolID(ctx, volumeID, cr, req.GetSecrets())
defer func() { defer func() {
if rbdVol != nil { if rbdVol != nil {
rbdVol.Destroy() rbdVol.Destroy(ctx)
} }
}() }()
if err != nil { if err != nil {

View File

@ -51,8 +51,7 @@ type VolumeGroupJournal interface {
objectUUID string) (*VolumeGroupAttributes, error) objectUUID string) (*VolumeGroupAttributes, error)
ReserveName( ReserveName(
ctx context.Context, ctx context.Context,
journalPool string, journalPool,
journalPoolID int64,
reqName, reqName,
namePrefix string) (string, string, error) namePrefix string) (string, string, error)
// AddVolumesMapping adds a volumeMap map which contains volumeID's and its // AddVolumesMapping adds a volumeMap map which contains volumeID's and its
@ -296,7 +295,6 @@ held, to prevent parallel operations from modifying the state of the omaps for t
Input arguments: Input arguments:
- journalPool: Pool where the CSI journal is stored - journalPool: Pool where the CSI journal is stored
- journalPoolID: pool ID of the journalPool
- reqName: Name of the volumeGroupSnapshot request received - reqName: Name of the volumeGroupSnapshot request received
- namePrefix: Prefix to use when generating the volumeGroupName name (suffix is an auto-generated UUID) - namePrefix: Prefix to use when generating the volumeGroupName name (suffix is an auto-generated UUID)
@ -306,8 +304,7 @@ Return values:
- error: non-nil in case of any errors - error: non-nil in case of any errors
*/ */
func (vgjc *VolumeGroupJournalConnection) ReserveName(ctx context.Context, func (vgjc *VolumeGroupJournalConnection) ReserveName(ctx context.Context,
journalPool string, journalPoolID int64, journalPool, reqName, namePrefix string,
reqName, namePrefix string,
) (string, string, error) { ) (string, string, error) {
cj := vgjc.config cj := vgjc.config

View File

@ -46,10 +46,10 @@ import (
func (rv *rbdVolume) checkCloneImage(ctx context.Context, parentVol *rbdVolume) (bool, error) { func (rv *rbdVolume) checkCloneImage(ctx context.Context, parentVol *rbdVolume) (bool, error) {
// generate temp cloned volume // generate temp cloned volume
tempClone := rv.generateTempClone() tempClone := rv.generateTempClone()
defer tempClone.Destroy() defer tempClone.Destroy(ctx)
snap := &rbdSnapshot{} snap := &rbdSnapshot{}
defer snap.Destroy() defer snap.Destroy(ctx)
snap.RbdSnapName = rv.RbdImageName snap.RbdSnapName = rv.RbdImageName
snap.Pool = rv.Pool snap.Pool = rv.Pool
@ -141,7 +141,7 @@ func (rv *rbdVolume) createCloneFromImage(ctx context.Context, parentVol *rbdVol
defer func() { defer func() {
if err != nil { if err != nil {
log.DebugLog(ctx, "Removing clone image %q", rv) log.DebugLog(ctx, "Removing clone image %q", rv)
errDefer := rv.deleteImage(ctx) errDefer := rv.Delete(ctx)
if errDefer != nil { if errDefer != nil {
log.ErrorLog(ctx, "failed to delete clone image %q: %v", rv, errDefer) log.ErrorLog(ctx, "failed to delete clone image %q: %v", rv, errDefer)
} }
@ -183,7 +183,7 @@ func (rv *rbdVolume) doSnapClone(ctx context.Context, parentVol *rbdVolume) erro
// generate temp cloned volume // generate temp cloned volume
tempClone := rv.generateTempClone() tempClone := rv.generateTempClone()
defer tempClone.Destroy() defer tempClone.Destroy(ctx)
// snapshot name is same as temporary cloned image, This helps to // snapshot name is same as temporary cloned image, This helps to
// flatten the temporary cloned images as we cannot have more than 510 // flatten the temporary cloned images as we cannot have more than 510

View File

@ -335,7 +335,7 @@ func (cs *ControllerServer) CreateVolume(
if err != nil { if err != nil {
return nil, err return nil, err
} }
defer rbdVol.Destroy() defer rbdVol.Destroy(ctx)
// Existence and conflict checks // Existence and conflict checks
if acquired := cs.VolumeLocks.TryAcquire(req.GetName()); !acquired { if acquired := cs.VolumeLocks.TryAcquire(req.GetName()); !acquired {
log.ErrorLog(ctx, util.VolumeOperationAlreadyExistsFmt, req.GetName()) log.ErrorLog(ctx, util.VolumeOperationAlreadyExistsFmt, req.GetName())
@ -349,10 +349,10 @@ func (cs *ControllerServer) CreateVolume(
return nil, err return nil, err
} }
if parentVol != nil { if parentVol != nil {
defer parentVol.Destroy() defer parentVol.Destroy(ctx)
} }
if rbdSnap != nil { if rbdSnap != nil {
defer rbdSnap.Destroy() defer rbdSnap.Destroy(ctx)
} }
err = updateTopologyConstraints(rbdVol, rbdSnap) err = updateTopologyConstraints(rbdVol, rbdSnap)
@ -403,7 +403,7 @@ func (cs *ControllerServer) CreateVolume(
metadata := k8s.GetVolumeMetadata(req.GetParameters()) metadata := k8s.GetVolumeMetadata(req.GetParameters())
err = rbdVol.setAllMetadata(metadata) err = rbdVol.setAllMetadata(metadata)
if err != nil { if err != nil {
if deleteErr := rbdVol.deleteImage(ctx); deleteErr != nil { if deleteErr := rbdVol.Delete(ctx); deleteErr != nil {
log.ErrorLog(ctx, "failed to delete rbd image: %s with error: %v", rbdVol, deleteErr) log.ErrorLog(ctx, "failed to delete rbd image: %s with error: %v", rbdVol, deleteErr)
} }
@ -465,7 +465,7 @@ func flattenParentImage(
// in case of any error call Destroy for cleanup. // in case of any error call Destroy for cleanup.
defer func() { defer func() {
if err != nil { if err != nil {
rbdSnap.Destroy() rbdSnap.Destroy(ctx)
} }
}() }()
@ -621,7 +621,7 @@ func checkFlatten(ctx context.Context, rbdVol *rbdVolume, cr *util.Credentials)
if errors.Is(err, ErrFlattenInProgress) { if errors.Is(err, ErrFlattenInProgress) {
return status.Error(codes.Aborted, err.Error()) return status.Error(codes.Aborted, err.Error())
} }
if errDefer := rbdVol.deleteImage(ctx); errDefer != nil { if errDefer := rbdVol.Delete(ctx); errDefer != nil {
log.ErrorLog(ctx, "failed to delete rbd image: %s with error: %v", rbdVol, errDefer) log.ErrorLog(ctx, "failed to delete rbd image: %s with error: %v", rbdVol, errDefer)
return status.Error(codes.Internal, err.Error()) return status.Error(codes.Internal, err.Error())
@ -661,14 +661,14 @@ func (cs *ControllerServer) createVolumeFromSnapshot(
return status.Error(codes.Internal, err.Error()) return status.Error(codes.Internal, err.Error())
} }
defer rbdSnap.Destroy() defer rbdSnap.Destroy(ctx)
// update parent name(rbd image name in snapshot) // update parent name(rbd image name in snapshot)
rbdSnap.RbdImageName = rbdSnap.RbdSnapName rbdSnap.RbdImageName = rbdSnap.RbdSnapName
parentVol := rbdSnap.toVolume() parentVol := rbdSnap.toVolume()
// as we are operating on single cluster reuse the connection // as we are operating on single cluster reuse the connection
parentVol.conn = rbdVol.conn.Copy() parentVol.conn = rbdVol.conn.Copy()
defer parentVol.Destroy() defer parentVol.Destroy(ctx)
// create clone image and delete snapshot // create clone image and delete snapshot
err = rbdVol.cloneRbdImageFromSnapshot(ctx, rbdSnap, parentVol) err = rbdVol.cloneRbdImageFromSnapshot(ctx, rbdSnap, parentVol)
@ -681,7 +681,7 @@ func (cs *ControllerServer) createVolumeFromSnapshot(
defer func() { defer func() {
if err != nil { if err != nil {
log.DebugLog(ctx, "Removing clone image %q", rbdVol) log.DebugLog(ctx, "Removing clone image %q", rbdVol)
errDefer := rbdVol.deleteImage(ctx) errDefer := rbdVol.Delete(ctx)
if errDefer != nil { if errDefer != nil {
log.ErrorLog(ctx, "failed to delete clone image %q: %v", rbdVol, errDefer) log.ErrorLog(ctx, "failed to delete clone image %q: %v", rbdVol, errDefer)
} }
@ -764,7 +764,7 @@ func (cs *ControllerServer) createBackingImage(
defer func() { defer func() {
if err != nil { if err != nil {
if deleteErr := rbdVol.deleteImage(ctx); deleteErr != nil { if deleteErr := rbdVol.Delete(ctx); deleteErr != nil {
log.ErrorLog(ctx, "failed to delete rbd image: %s with error: %v", rbdVol, deleteErr) log.ErrorLog(ctx, "failed to delete rbd image: %s with error: %v", rbdVol, deleteErr)
} }
} }
@ -944,7 +944,7 @@ func (cs *ControllerServer) DeleteVolume(
rbdVol, err := GenVolFromVolID(ctx, volumeID, cr, req.GetSecrets()) rbdVol, err := GenVolFromVolID(ctx, volumeID, cr, req.GetSecrets())
defer func() { defer func() {
if rbdVol != nil { if rbdVol != nil {
rbdVol.Destroy() rbdVol.Destroy(ctx)
} }
}() }()
if err != nil { if err != nil {
@ -1029,7 +1029,7 @@ func cleanupRBDImage(ctx context.Context,
// Deleting rbd image // Deleting rbd image
log.DebugLog(ctx, "deleting image %s", rbdVol.RbdImageName) log.DebugLog(ctx, "deleting image %s", rbdVol.RbdImageName)
if err = rbdVol.deleteImage(ctx); err != nil { if err = rbdVol.Delete(ctx); err != nil {
log.ErrorLog(ctx, "failed to delete rbd image: %s with error: %v", log.ErrorLog(ctx, "failed to delete rbd image: %s with error: %v",
rbdVol, err) rbdVol, err)
@ -1094,7 +1094,7 @@ func (cs *ControllerServer) CreateSnapshot(
rbdVol, err := GenVolFromVolID(ctx, req.GetSourceVolumeId(), cr, req.GetSecrets()) rbdVol, err := GenVolFromVolID(ctx, req.GetSourceVolumeId(), cr, req.GetSecrets())
defer func() { defer func() {
if rbdVol != nil { if rbdVol != nil {
rbdVol.Destroy() rbdVol.Destroy(ctx)
} }
}() }()
if err != nil { if err != nil {
@ -1188,7 +1188,7 @@ func (cs *ControllerServer) CreateSnapshot(
defer func() { defer func() {
if err != nil { if err != nil {
log.DebugLog(ctx, "Removing clone image %q", rbdVol) log.DebugLog(ctx, "Removing clone image %q", rbdVol)
errDefer := rbdVol.deleteImage(ctx) errDefer := rbdVol.Delete(ctx)
if errDefer != nil { if errDefer != nil {
log.ErrorLog(ctx, "failed to delete clone image %q: %v", rbdVol, errDefer) log.ErrorLog(ctx, "failed to delete clone image %q: %v", rbdVol, errDefer)
} }
@ -1237,7 +1237,7 @@ func cloneFromSnapshot(
return nil, status.Errorf(codes.Internal, err.Error()) return nil, status.Errorf(codes.Internal, err.Error())
} }
defer vol.Destroy() defer vol.Destroy(ctx)
err = rbdVol.copyEncryptionConfig(ctx, &vol.rbdImage, false) err = rbdVol.copyEncryptionConfig(ctx, &vol.rbdImage, false)
if err != nil { if err != nil {
@ -1313,7 +1313,7 @@ func (cs *ControllerServer) doSnapshotClone(
) (*rbdVolume, error) { ) (*rbdVolume, error) {
// generate cloned volume details from snapshot // generate cloned volume details from snapshot
cloneRbd := rbdSnap.toVolume() cloneRbd := rbdSnap.toVolume()
defer cloneRbd.Destroy() defer cloneRbd.Destroy(ctx)
// add image feature for cloneRbd // add image feature for cloneRbd
f := []string{librbd.FeatureNameLayering, librbd.FeatureNameDeepFlatten} f := []string{librbd.FeatureNameLayering, librbd.FeatureNameDeepFlatten}
cloneRbd.ImageFeatureSet = librbd.FeatureSetFromNames(f) cloneRbd.ImageFeatureSet = librbd.FeatureSetFromNames(f)
@ -1460,7 +1460,7 @@ func (cs *ControllerServer) DeleteSnapshot(
return nil, status.Error(codes.Internal, err.Error()) return nil, status.Error(codes.Internal, err.Error())
} }
defer rbdSnap.Destroy() defer rbdSnap.Destroy(ctx)
// safeguard against parallel create or delete requests against the same // safeguard against parallel create or delete requests against the same
// name // name
@ -1480,7 +1480,7 @@ func (cs *ControllerServer) DeleteSnapshot(
if err != nil { if err != nil {
return nil, status.Error(codes.Internal, err.Error()) return nil, status.Error(codes.Internal, err.Error())
} }
defer rbdVol.Destroy() defer rbdVol.Destroy(ctx)
rbdVol.ImageID = rbdSnap.ImageID rbdVol.ImageID = rbdSnap.ImageID
// update parent name to delete the snapshot // update parent name to delete the snapshot
@ -1510,7 +1510,7 @@ func cleanUpImageAndSnapReservation(ctx context.Context, rbdSnap *rbdSnapshot, c
if err != nil { if err != nil {
return status.Error(codes.Internal, err.Error()) return status.Error(codes.Internal, err.Error())
} }
defer rbdVol.Destroy() defer rbdVol.Destroy(ctx)
err = rbdVol.openIoctx() err = rbdVol.openIoctx()
if err != nil { if err != nil {
@ -1584,7 +1584,7 @@ func (cs *ControllerServer) ControllerExpandVolume(
return nil, err return nil, err
} }
defer rbdVol.Destroy() defer rbdVol.Destroy(ctx)
// NodeExpansion is needed for PersistentVolumes with, // NodeExpansion is needed for PersistentVolumes with,
// 1. Filesystem VolumeMode with & without Encryption and // 1. Filesystem VolumeMode with & without Encryption and

View File

@ -81,8 +81,8 @@ func deleteMigratedVolume(ctx context.Context, parsedMigHandle *migrationVolID,
if err != nil { if err != nil {
return err return err
} }
defer rv.Destroy() defer rv.Destroy(ctx)
err = rv.deleteImage(ctx) err = rv.Delete(ctx)
if err != nil { if err != nil {
log.ErrorLog(ctx, "failed to delete rbd image: %s, err: %v", rv, err) log.ErrorLog(ctx, "failed to delete rbd image: %s, err: %v", rv, err)
} }

View File

@ -198,7 +198,7 @@ func (ns *NodeServer) populateRbdVol(
} else { } else {
rv, err = GenVolFromVolID(ctx, volID, cr, req.GetSecrets()) rv, err = GenVolFromVolID(ctx, volID, cr, req.GetSecrets())
if err != nil { if err != nil {
rv.Destroy() rv.Destroy(ctx)
log.ErrorLog(ctx, "error generating volume %s: %v", volID, err) log.ErrorLog(ctx, "error generating volume %s: %v", volID, err)
return nil, status.Errorf(codes.Internal, "error generating volume %s: %v", volID, err) return nil, status.Errorf(codes.Internal, "error generating volume %s: %v", volID, err)
@ -221,7 +221,7 @@ func (ns *NodeServer) populateRbdVol(
// in case of any error call Destroy for cleanup. // in case of any error call Destroy for cleanup.
defer func() { defer func() {
if err != nil { if err != nil {
rv.Destroy() rv.Destroy(ctx)
} }
}() }()
// get the image details from the ceph cluster. // get the image details from the ceph cluster.
@ -345,7 +345,7 @@ func (ns *NodeServer) NodeStageVolume(
if err != nil { if err != nil {
return nil, err return nil, err
} }
defer rv.Destroy() defer rv.Destroy(ctx)
rv.NetNamespaceFilePath, err = util.GetRBDNetNamespaceFilePath(util.CsiConfigFile, rv.ClusterID) rv.NetNamespaceFilePath, err = util.GetRBDNetNamespaceFilePath(util.CsiConfigFile, rv.ClusterID)
if err != nil { if err != nil {

View File

@ -163,7 +163,7 @@ func checkSnapCloneExists(
} }
vol := rbdSnap.toVolume() vol := rbdSnap.toVolume()
defer vol.Destroy() defer vol.Destroy(ctx)
err = vol.Connect(cr) err = vol.Connect(cr)
if err != nil { if err != nil {
return false, err return false, err

View File

@ -28,6 +28,7 @@ import (
"strings" "strings"
"time" "time"
types "github.com/ceph/ceph-csi/internal/rbd_types"
"github.com/ceph/ceph-csi/internal/util" "github.com/ceph/ceph-csi/internal/util"
"github.com/ceph/ceph-csi/internal/util/log" "github.com/ceph/ceph-csi/internal/util/log"
@ -150,6 +151,9 @@ type rbdImage struct {
ParentInTrash bool ParentInTrash bool
} }
// check that rbdVolume implements the types.Volume interface.
var _ types.Volume = &rbdVolume{}
// rbdVolume represents a CSI volume and its RBD image specifics. // rbdVolume represents a CSI volume and its RBD image specifics.
type rbdVolume struct { type rbdVolume struct {
rbdImage rbdImage
@ -385,7 +389,7 @@ func (ri *rbdImage) Connect(cr *util.Credentials) error {
// Destroy cleans up the rbdVolume and closes the connection to the Ceph // Destroy cleans up the rbdVolume and closes the connection to the Ceph
// cluster in case one was setup. // cluster in case one was setup.
func (ri *rbdImage) Destroy() { func (ri *rbdImage) Destroy(ctx context.Context) {
if ri.ioctx != nil { if ri.ioctx != nil {
ri.ioctx.Destroy() ri.ioctx.Destroy()
} }
@ -418,6 +422,11 @@ func (rs *rbdSnapshot) String() string {
return fmt.Sprintf("%s/%s@%s", rs.Pool, rs.RbdImageName, rs.RbdSnapName) return fmt.Sprintf("%s/%s@%s", rs.Pool, rs.RbdImageName, rs.RbdSnapName)
} }
// GetID returns the CSI volume handle of the image.
func (ri *rbdImage) GetID(ctx context.Context) (string, error) {
return ri.VolID, nil
}
// createImage creates a new ceph image with provision and volume options. // createImage creates a new ceph image with provision and volume options.
func createImage(ctx context.Context, pOpts *rbdVolume, cr *util.Credentials) error { func createImage(ctx context.Context, pOpts *rbdVolume, cr *util.Credentials) error {
volSzMiB := fmt.Sprintf("%dM", util.RoundOffVolSize(pOpts.VolSize)) volSzMiB := fmt.Sprintf("%dM", util.RoundOffVolSize(pOpts.VolSize))
@ -627,8 +636,8 @@ func (ri *rbdImage) ensureImageCleanup(ctx context.Context) error {
return nil return nil
} }
// deleteImage deletes a ceph image with provision and volume options. // Delete deletes a ceph image with provision and volume options.
func (ri *rbdImage) deleteImage(ctx context.Context) error { func (ri *rbdImage) Delete(ctx context.Context) error {
image := ri.RbdImageName image := ri.RbdImageName
log.DebugLog(ctx, "rbd: delete %s using mon %s, pool %s", image, ri.Monitors, ri.Pool) log.DebugLog(ctx, "rbd: delete %s using mon %s, pool %s", image, ri.Monitors, ri.Pool)
@ -706,7 +715,7 @@ func (ri *rbdImage) trashRemoveImage(ctx context.Context) error {
// DeleteTempImage deletes the temporary image created for volume datasource. // DeleteTempImage deletes the temporary image created for volume datasource.
func (rv *rbdVolume) DeleteTempImage(ctx context.Context) error { func (rv *rbdVolume) DeleteTempImage(ctx context.Context) error {
tempClone := rv.generateTempClone() tempClone := rv.generateTempClone()
err := tempClone.deleteImage(ctx) err := tempClone.Delete(ctx)
if err != nil { if err != nil {
if errors.Is(err, ErrImageNotFound) { if errors.Is(err, ErrImageNotFound) {
return tempClone.ensureImageCleanup(ctx) return tempClone.ensureImageCleanup(ctx)
@ -777,7 +786,7 @@ func flattenClonedRbdImages(
rv.Pool = pool rv.Pool = pool
rv.RbdImageName = rbdImageName rv.RbdImageName = rbdImageName
defer rv.Destroy() defer rv.Destroy(ctx)
err := rv.Connect(cr) err := rv.Connect(cr)
if err != nil { if err != nil {
log.ErrorLog(ctx, "failed to open connection %s; err %v", rv, err) log.ErrorLog(ctx, "failed to open connection %s; err %v", rv, err)
@ -1045,7 +1054,7 @@ func genSnapFromSnapID(
} }
defer func() { defer func() {
if err != nil { if err != nil {
rbdSnap.Destroy() rbdSnap.Destroy(ctx)
} }
}() }()
@ -1064,7 +1073,7 @@ func genSnapFromSnapID(
} }
} }
err = updateSnapshotDetails(rbdSnap) err = updateSnapshotDetails(ctx, rbdSnap)
if err != nil { if err != nil {
return rbdSnap, fmt.Errorf("failed to update snapshot details for %q: %w", rbdSnap, err) return rbdSnap, fmt.Errorf("failed to update snapshot details for %q: %w", rbdSnap, err)
} }
@ -1074,13 +1083,13 @@ func genSnapFromSnapID(
// updateSnapshotDetails will copy the details from the rbdVolume to the // updateSnapshotDetails will copy the details from the rbdVolume to the
// rbdSnapshot. example copying size from rbdVolume to rbdSnapshot. // rbdSnapshot. example copying size from rbdVolume to rbdSnapshot.
func updateSnapshotDetails(rbdSnap *rbdSnapshot) error { func updateSnapshotDetails(ctx context.Context, rbdSnap *rbdSnapshot) error {
vol := rbdSnap.toVolume() vol := rbdSnap.toVolume()
err := vol.Connect(rbdSnap.conn.Creds) err := vol.Connect(rbdSnap.conn.Creds)
if err != nil { if err != nil {
return err return err
} }
defer vol.Destroy() defer vol.Destroy(ctx)
err = vol.getImageInfo() err = vol.getImageInfo()
if err != nil { if err != nil {
@ -1685,7 +1694,7 @@ func (ri *rbdImage) flattenParent(ctx context.Context, hardLimit, softLimit uint
if parentImage == nil { if parentImage == nil {
return nil return nil
} }
defer parentImage.Destroy() defer parentImage.Destroy(ctx)
return parentImage.flattenRbdImage(ctx, false, hardLimit, softLimit) return parentImage.flattenRbdImage(ctx, false, hardLimit, softLimit)
} }
@ -2128,7 +2137,7 @@ func genVolFromVolIDWithMigration(
} }
rv, err := GenVolFromVolID(ctx, volID, cr, secrets) rv, err := GenVolFromVolID(ctx, volID, cr, secrets)
if err != nil { if err != nil {
rv.Destroy() rv.Destroy(ctx)
} }
return rv, err return rv, err

View File

@ -56,7 +56,7 @@ func createRBDClone(
errSnap := parentVol.deleteSnapshot(ctx, snap) errSnap := parentVol.deleteSnapshot(ctx, snap)
if errSnap != nil { if errSnap != nil {
log.ErrorLog(ctx, "failed to delete snapshot: %v", errSnap) log.ErrorLog(ctx, "failed to delete snapshot: %v", errSnap)
delErr := cloneRbdVol.deleteImage(ctx) delErr := cloneRbdVol.Delete(ctx)
if delErr != nil { if delErr != nil {
log.ErrorLog(ctx, "failed to delete rbd image: %s with error: %v", cloneRbdVol, delErr) log.ErrorLog(ctx, "failed to delete rbd image: %s with error: %v", cloneRbdVol, delErr)
} }
@ -85,7 +85,7 @@ func cleanUpSnapshot(
} }
if rbdVol != nil { if rbdVol != nil {
err := rbdVol.deleteImage(ctx) err := rbdVol.Delete(ctx)
if err != nil { if err != nil {
if !errors.Is(err, ErrImageNotFound) { if !errors.Is(err, ErrImageNotFound) {
log.ErrorLog(ctx, "failed to delete rbd image %q with error: %v", rbdVol, err) log.ErrorLog(ctx, "failed to delete rbd image %q with error: %v", rbdVol, err)

View File

@ -0,0 +1,30 @@
/*
Copyright 2024 The Ceph-CSI Authors.
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/
package rbd_types
import (
"context"
)
type Volume interface {
// Destroy frees the resources used by the Volume.
Destroy(ctx context.Context)
Delete(ctx context.Context) error
GetID(ctx context.Context) (string, error)
}