diff --git a/internal/cephfs/fsjournal.go b/internal/cephfs/fsjournal.go index 97d60cd51..549326551 100644 --- a/internal/cephfs/fsjournal.go +++ b/internal/cephfs/fsjournal.go @@ -54,8 +54,14 @@ func checkVolExists(ctx context.Context, volOptions *volumeOptions, secret map[s } defer cr.DeleteCredentials() - imageData, err := volJournal.CheckReservation(ctx, volOptions.Monitors, cr, - volOptions.MetadataPool, volOptions.RequestName, volOptions.NamePrefix, "", "") + j, err := volJournal.Connect(volOptions.Monitors, cr) + if err != nil { + return nil, err + } + defer j.Destroy() + + imageData, err := j.CheckReservation( + ctx, volOptions.MetadataPool, volOptions.RequestName, volOptions.NamePrefix, "", "") if err != nil { return nil, err } @@ -68,7 +74,7 @@ func checkVolExists(ctx context.Context, volOptions *volumeOptions, secret map[s _, err = getVolumeRootPathCeph(ctx, volOptions, cr, volumeID(vid.FsSubvolName)) if err != nil { if _, ok := err.(ErrVolumeNotFound); ok { - err = volJournal.UndoReservation(ctx, volOptions.Monitors, cr, volOptions.MetadataPool, + err = j.UndoReservation(ctx, volOptions.MetadataPool, volOptions.MetadataPool, vid.FsSubvolName, volOptions.RequestName) return nil, err } @@ -102,7 +108,13 @@ func undoVolReservation(ctx context.Context, volOptions *volumeOptions, vid volu } defer cr.DeleteCredentials() - err = volJournal.UndoReservation(ctx, volOptions.Monitors, cr, volOptions.MetadataPool, + j, err := volJournal.Connect(volOptions.Monitors, cr) + if err != nil { + return err + } + defer j.Destroy() + + err = j.UndoReservation(ctx, volOptions.MetadataPool, volOptions.MetadataPool, vid.FsSubvolName, volOptions.RequestName) return err @@ -142,8 +154,16 @@ func reserveVol(ctx context.Context, volOptions *volumeOptions, secret map[strin return nil, err } - imageUUID, vid.FsSubvolName, err = volJournal.ReserveName(ctx, volOptions.Monitors, cr, volOptions.MetadataPool, util.InvalidPoolID, - volOptions.MetadataPool, util.InvalidPoolID, volOptions.RequestName, volOptions.NamePrefix, "", "") + j, err := volJournal.Connect(volOptions.Monitors, cr) + if err != nil { + return nil, err + } + defer j.Destroy() + + imageUUID, vid.FsSubvolName, err = j.ReserveName( + ctx, volOptions.MetadataPool, util.InvalidPoolID, + volOptions.MetadataPool, util.InvalidPoolID, volOptions.RequestName, + volOptions.NamePrefix, "", "") if err != nil { return nil, err } diff --git a/internal/cephfs/volumeoptions.go b/internal/cephfs/volumeoptions.go index d9eb3a455..1a24a616c 100644 --- a/internal/cephfs/volumeoptions.go +++ b/internal/cephfs/volumeoptions.go @@ -261,8 +261,14 @@ func newVolumeOptionsFromVolID(ctx context.Context, volID string, volOpt, secret return nil, nil, err } - imageAttributes, err := volJournal.GetImageAttributes(ctx, volOptions.Monitors, cr, - volOptions.MetadataPool, vi.ObjectUUID, false) + j, err := volJournal.Connect(volOptions.Monitors, cr) + if err != nil { + return nil, nil, err + } + defer j.Destroy() + + imageAttributes, err := j.GetImageAttributes( + ctx, volOptions.MetadataPool, vi.ObjectUUID, false) if err != nil { return nil, nil, err } diff --git a/internal/journal/voljournal.go b/internal/journal/voljournal.go index 3c530fc6e..2f2581ff0 100644 --- a/internal/journal/voljournal.go +++ b/internal/journal/voljournal.go @@ -204,6 +204,25 @@ type ImageData struct { ImageAttributes *ImageAttributes } +// Connection represents a real or virtual connection to a ceph cluster +// that can make changes to the journal(s). +type Connection struct { + config *CSIJournal + // connection metadata + monitors string + cr *util.Credentials +} + +// Connect establishes a new connection to a ceph cluster for journal metadata. +func (cj *CSIJournal) Connect(monitors string, cr *util.Credentials) (*Connection, error) { + conn := &Connection{ + config: cj, + monitors: monitors, + cr: cr, + } + return conn, nil +} + /* CheckReservation checks if given request name contains a valid reservation - If there is a valid reservation, then the corresponding UUID for the volume/snapshot is returned @@ -219,13 +238,14 @@ Return values: there was no reservation found - error: non-nil in case of any errors */ -func (cj *CSIJournal) CheckReservation(ctx context.Context, monitors string, cr *util.Credentials, +func (conn *Connection) CheckReservation(ctx context.Context, journalPool, reqName, namePrefix, parentName, kmsConfig string) (*ImageData, error) { var ( snapSource bool objUUID string savedImagePool string savedImagePoolID int64 = util.InvalidPoolID + cj = conn.config ) if parentName != "" { @@ -237,7 +257,7 @@ func (cj *CSIJournal) CheckReservation(ctx context.Context, monitors string, cr } // check if request name is already part of the directory omap - objUUIDAndPool, err := util.GetOMapValue(ctx, monitors, cr, journalPool, cj.namespace, cj.csiDirectory, + objUUIDAndPool, err := util.GetOMapValue(ctx, conn.monitors, conn.cr, journalPool, cj.namespace, cj.csiDirectory, cj.csiNameKeyPrefix+reqName) if err != nil { // error should specifically be not found, for volume to be absent, any other error @@ -265,22 +285,22 @@ func (cj *CSIJournal) CheckReservation(ctx context.Context, monitors string, cr } savedImagePoolID = int64(binary.BigEndian.Uint64(buf64)) - savedImagePool, err = util.GetPoolName(ctx, monitors, cr, savedImagePoolID) + savedImagePool, err = util.GetPoolName(ctx, conn.monitors, conn.cr, savedImagePoolID) if err != nil { if _, ok := err.(util.ErrPoolNotFound); ok { - err = cj.UndoReservation(ctx, monitors, cr, journalPool, "", "", reqName) + err = conn.UndoReservation(ctx, journalPool, "", "", reqName) } return nil, err } } - savedImageAttributes, err := cj.GetImageAttributes(ctx, monitors, cr, savedImagePool, + savedImageAttributes, err := conn.GetImageAttributes(ctx, savedImagePool, objUUID, snapSource) if err != nil { // error should specifically be not found, for image to be absent, any other error // is not conclusive, and we should not proceed if _, ok := err.(util.ErrKeyNotFound); ok { - err = cj.UndoReservation(ctx, monitors, cr, journalPool, savedImagePool, + err = conn.UndoReservation(ctx, journalPool, savedImagePool, cj.GetNameForUUID(namePrefix, objUUID, snapSource), reqName) } return nil, err @@ -344,10 +364,11 @@ Input arguments: - volJournalPool: Pool name that holds the image/subvolume and the per-image journal (may be different if image is created in a topology constrained pool) */ -func (cj *CSIJournal) UndoReservation(ctx context.Context, monitors string, cr *util.Credentials, +func (conn *Connection) UndoReservation(ctx context.Context, csiJournalPool, volJournalPool, volName, reqName string) error { // delete volume UUID omap (first, inverse of create order) + cj := conn.config if volName != "" { if len(volName) < 36 { return fmt.Errorf("unable to parse UUID from %s, too short", volName) @@ -358,7 +379,7 @@ func (cj *CSIJournal) UndoReservation(ctx context.Context, monitors string, cr * return fmt.Errorf("failed parsing UUID in %s", volName) } - err := util.RemoveObject(ctx, monitors, cr, volJournalPool, cj.namespace, cj.cephUUIDDirectoryPrefix+imageUUID) + err := util.RemoveObject(ctx, conn.monitors, conn.cr, volJournalPool, cj.namespace, cj.cephUUIDDirectoryPrefix+imageUUID) if err != nil { if _, ok := err.(util.ErrObjectNotFound); !ok { klog.Errorf(util.Log(ctx, "failed removing oMap %s (%s)"), cj.cephUUIDDirectoryPrefix+imageUUID, err) @@ -368,7 +389,7 @@ func (cj *CSIJournal) UndoReservation(ctx context.Context, monitors string, cr * } // delete the request name key (last, inverse of create order) - err := util.RemoveOMapKey(ctx, monitors, cr, csiJournalPool, cj.namespace, cj.csiDirectory, + err := util.RemoveOMapKey(ctx, conn.monitors, conn.cr, csiJournalPool, cj.namespace, cj.csiDirectory, cj.csiNameKeyPrefix+reqName) if err != nil { klog.Errorf(util.Log(ctx, "failed removing oMap key %s (%s)"), cj.csiNameKeyPrefix+reqName, err) @@ -433,7 +454,7 @@ Return values: - string: Contains the image name that was reserved for the passed in reqName - error: non-nil in case of any errors */ -func (cj *CSIJournal) ReserveName(ctx context.Context, monitors string, cr *util.Credentials, +func (conn *Connection) ReserveName(ctx context.Context, journalPool string, journalPoolID int64, imagePool string, imagePoolID int64, reqName, namePrefix, parentName, kmsConf string) (string, string, error) { @@ -441,6 +462,7 @@ func (cj *CSIJournal) ReserveName(ctx context.Context, monitors string, cr *util var ( snapSource bool nameKeyVal string + cj = conn.config ) if parentName != "" { @@ -455,7 +477,7 @@ func (cj *CSIJournal) ReserveName(ctx context.Context, monitors string, cr *util // NOTE: If any service loss occurs post creation of the UUID directory, and before // setting the request name key (csiNameKey) to point back to the UUID directory, the // UUID directory key will be leaked - volUUID, err := reserveOMapName(ctx, monitors, cr, imagePool, cj.namespace, cj.cephUUIDDirectoryPrefix) + volUUID, err := reserveOMapName(ctx, conn.monitors, conn.cr, imagePool, cj.namespace, cj.cephUUIDDirectoryPrefix) if err != nil { return "", "", err } @@ -473,7 +495,7 @@ func (cj *CSIJournal) ReserveName(ctx context.Context, monitors string, cr *util nameKeyVal = volUUID } - err = util.SetOMapKeyValue(ctx, monitors, cr, journalPool, cj.namespace, cj.csiDirectory, + err = util.SetOMapKeyValue(ctx, conn.monitors, conn.cr, journalPool, cj.namespace, cj.csiDirectory, cj.csiNameKeyPrefix+reqName, nameKeyVal) if err != nil { return "", "", err @@ -481,7 +503,7 @@ func (cj *CSIJournal) ReserveName(ctx context.Context, monitors string, cr *util defer func() { if err != nil { klog.Warningf(util.Log(ctx, "reservation failed for volume: %s"), reqName) - errDefer := cj.UndoReservation(ctx, monitors, cr, imagePool, journalPool, imageName, reqName) + errDefer := conn.UndoReservation(ctx, imagePool, journalPool, imageName, reqName) if errDefer != nil { klog.Warningf(util.Log(ctx, "failed undoing reservation of volume: %s (%v)"), reqName, errDefer) } @@ -492,14 +514,14 @@ func (cj *CSIJournal) ReserveName(ctx context.Context, monitors string, cr *util // and also CSI journal pool, when only the VolumeID is passed in (e.g DeleteVolume/DeleteSnapshot, // VolID during CreateSnapshot). // Update UUID directory to store CSI request name - err = util.SetOMapKeyValue(ctx, monitors, cr, imagePool, cj.namespace, cj.cephUUIDDirectoryPrefix+volUUID, + err = util.SetOMapKeyValue(ctx, conn.monitors, conn.cr, imagePool, cj.namespace, cj.cephUUIDDirectoryPrefix+volUUID, cj.csiNameKey, reqName) if err != nil { return "", "", err } // Update UUID directory to store image name - err = util.SetOMapKeyValue(ctx, monitors, cr, imagePool, cj.namespace, cj.cephUUIDDirectoryPrefix+volUUID, + err = util.SetOMapKeyValue(ctx, conn.monitors, conn.cr, imagePool, cj.namespace, cj.cephUUIDDirectoryPrefix+volUUID, cj.csiImageKey, imageName) if err != nil { return "", "", err @@ -507,7 +529,7 @@ func (cj *CSIJournal) ReserveName(ctx context.Context, monitors string, cr *util // Update UUID directory to store encryption values if kmsConf != "" { - err = util.SetOMapKeyValue(ctx, monitors, cr, imagePool, cj.namespace, cj.cephUUIDDirectoryPrefix+volUUID, + err = util.SetOMapKeyValue(ctx, conn.monitors, conn.cr, imagePool, cj.namespace, cj.cephUUIDDirectoryPrefix+volUUID, cj.encryptKMSKey, kmsConf) if err != nil { return "", "", err @@ -520,7 +542,7 @@ func (cj *CSIJournal) ReserveName(ctx context.Context, monitors string, cr *util journalPoolIDStr := hex.EncodeToString(buf64) // Update UUID directory to store CSI journal pool name (prefer ID instead of name to be pool rename proof) - err = util.SetOMapKeyValue(ctx, monitors, cr, imagePool, cj.namespace, cj.cephUUIDDirectoryPrefix+volUUID, + err = util.SetOMapKeyValue(ctx, conn.monitors, conn.cr, imagePool, cj.namespace, cj.cephUUIDDirectoryPrefix+volUUID, cj.csiJournalPool, journalPoolIDStr) if err != nil { return "", "", err @@ -529,7 +551,7 @@ func (cj *CSIJournal) ReserveName(ctx context.Context, monitors string, cr *util if snapSource { // Update UUID directory to store source volume UUID in case of snapshots - err = util.SetOMapKeyValue(ctx, monitors, cr, imagePool, cj.namespace, cj.cephUUIDDirectoryPrefix+volUUID, + err = util.SetOMapKeyValue(ctx, conn.monitors, conn.cr, imagePool, cj.namespace, cj.cephUUIDDirectoryPrefix+volUUID, cj.cephSnapSourceKey, parentName) if err != nil { return "", "", err @@ -549,10 +571,11 @@ type ImageAttributes struct { } // GetImageAttributes fetches all keys and their values, from a UUID directory, returning ImageAttributes structure -func (cj *CSIJournal) GetImageAttributes(ctx context.Context, monitors string, cr *util.Credentials, pool, objectUUID string, snapSource bool) (*ImageAttributes, error) { +func (conn *Connection) GetImageAttributes(ctx context.Context, pool, objectUUID string, snapSource bool) (*ImageAttributes, error) { var ( err error imageAttributes *ImageAttributes = &ImageAttributes{} + cj = conn.config ) if snapSource && cj.cephSnapSourceKey == "" { @@ -561,7 +584,7 @@ func (cj *CSIJournal) GetImageAttributes(ctx context.Context, monitors string, c } // TODO: fetch all omap vals in one call, than make multiple listomapvals - imageAttributes.RequestName, err = util.GetOMapValue(ctx, monitors, cr, pool, cj.namespace, + imageAttributes.RequestName, err = util.GetOMapValue(ctx, conn.monitors, conn.cr, pool, cj.namespace, cj.cephUUIDDirectoryPrefix+objectUUID, cj.csiNameKey) if err != nil { return nil, err @@ -569,7 +592,7 @@ func (cj *CSIJournal) GetImageAttributes(ctx context.Context, monitors string, c // image key was added at some point, so not all volumes will have this key set // when ceph-csi was upgraded - imageAttributes.ImageName, err = util.GetOMapValue(ctx, monitors, cr, pool, cj.namespace, + imageAttributes.ImageName, err = util.GetOMapValue(ctx, conn.monitors, conn.cr, pool, cj.namespace, cj.cephUUIDDirectoryPrefix+objectUUID, cj.csiImageKey) if err != nil { // if the key was not found, assume the default key + UUID @@ -587,7 +610,7 @@ func (cj *CSIJournal) GetImageAttributes(ctx context.Context, monitors string, c } } - imageAttributes.KmsID, err = util.GetOMapValue(ctx, monitors, cr, pool, cj.namespace, + imageAttributes.KmsID, err = util.GetOMapValue(ctx, conn.monitors, conn.cr, pool, cj.namespace, cj.cephUUIDDirectoryPrefix+objectUUID, cj.encryptKMSKey) if err != nil { // ErrKeyNotFound means no encryption KMS was used @@ -599,7 +622,7 @@ func (cj *CSIJournal) GetImageAttributes(ctx context.Context, monitors string, c } } - journalPoolIDStr, err := util.GetOMapValue(ctx, monitors, cr, pool, cj.namespace, + journalPoolIDStr, err := util.GetOMapValue(ctx, conn.monitors, conn.cr, pool, cj.namespace, cj.cephUUIDDirectoryPrefix+objectUUID, cj.csiJournalPool) if err != nil { if _, ok := err.(util.ErrKeyNotFound); !ok { @@ -616,7 +639,7 @@ func (cj *CSIJournal) GetImageAttributes(ctx context.Context, monitors string, c } if snapSource { - imageAttributes.SourceName, err = util.GetOMapValue(ctx, monitors, cr, pool, cj.namespace, + imageAttributes.SourceName, err = util.GetOMapValue(ctx, conn.monitors, conn.cr, pool, cj.namespace, cj.cephUUIDDirectoryPrefix+objectUUID, cj.cephSnapSourceKey) if err != nil { return nil, err @@ -625,3 +648,10 @@ func (cj *CSIJournal) GetImageAttributes(ctx context.Context, monitors string, c return imageAttributes, nil } + +// Destroy frees any resources and invalidates the journal connection. +func (conn *Connection) Destroy() { + // invalidate cluster connection metadata + conn.monitors = "" + conn.cr = nil +} diff --git a/internal/rbd/nodeserver.go b/internal/rbd/nodeserver.go index 663a9c6e0..3240112fe 100644 --- a/internal/rbd/nodeserver.go +++ b/internal/rbd/nodeserver.go @@ -153,8 +153,17 @@ func (ns *NodeServer) NodeStageVolume(ctx context.Context, req *csi.NodeStageVol return nil, status.Error(codes.Internal, err.Error()) } - imageAttributes, err = volJournal.GetImageAttributes(ctx, volOptions.Monitors, cr, - volOptions.Pool, vi.ObjectUUID, false) + j, err2 := volJournal.Connect(volOptions.Monitors, cr) + if err2 != nil { + klog.Errorf( + util.Log(ctx, "failed to establish cluster connection: %v"), + err2) + return nil, status.Error(codes.Internal, err.Error()) + } + defer j.Destroy() + + imageAttributes, err = j.GetImageAttributes( + ctx, volOptions.Pool, vi.ObjectUUID, false) if err != nil { err = fmt.Errorf("error fetching image attributes for volume ID (%s) (%s)", err, volID) return nil, status.Error(codes.Internal, err.Error()) diff --git a/internal/rbd/rbd_journal.go b/internal/rbd/rbd_journal.go index ac6e48ce6..913cadf14 100644 --- a/internal/rbd/rbd_journal.go +++ b/internal/rbd/rbd_journal.go @@ -114,7 +114,13 @@ func checkSnapExists(ctx context.Context, rbdSnap *rbdSnapshot, cr *util.Credent return false, err } - snapData, err := snapJournal.CheckReservation(ctx, rbdSnap.Monitors, cr, rbdSnap.JournalPool, + j, err := snapJournal.Connect(rbdSnap.Monitors, cr) + if err != nil { + return false, err + } + defer j.Destroy() + + snapData, err := j.CheckReservation(ctx, rbdSnap.JournalPool, rbdSnap.RequestName, rbdSnap.NamePrefix, rbdSnap.RbdImageName, "") if err != nil { return false, err @@ -135,7 +141,7 @@ func checkSnapExists(ctx context.Context, rbdSnap *rbdSnapshot, cr *util.Credent err = updateSnapWithImageInfo(ctx, rbdSnap, cr) if err != nil { if _, ok := err.(ErrSnapNotFound); ok { - err = snapJournal.UndoReservation(ctx, rbdSnap.Monitors, cr, rbdSnap.JournalPool, + err = j.UndoReservation(ctx, rbdSnap.JournalPool, rbdSnap.Pool, rbdSnap.RbdSnapName, rbdSnap.RequestName) return false, err } @@ -174,8 +180,14 @@ func (rv *rbdVolume) Exists(ctx context.Context) (bool, error) { kmsID = rv.KMS.GetID() } - imageData, err := volJournal.CheckReservation(ctx, rv.Monitors, rv.conn.Creds, rv.JournalPool, - rv.RequestName, rv.NamePrefix, "", kmsID) + j, err := volJournal.Connect(rv.Monitors, rv.conn.Creds) + if err != nil { + return false, err + } + defer j.Destroy() + + imageData, err := j.CheckReservation( + ctx, rv.JournalPool, rv.RequestName, rv.NamePrefix, "", kmsID) if err != nil { return false, err } @@ -205,7 +217,7 @@ func (rv *rbdVolume) Exists(ctx context.Context) (bool, error) { err = updateVolWithImageInfo(ctx, rv, rv.conn.Creds) if err != nil { if _, ok := err.(ErrImageNotFound); ok { - err = volJournal.UndoReservation(ctx, rv.Monitors, rv.conn.Creds, rv.JournalPool, rv.Pool, + err = j.UndoReservation(ctx, rv.JournalPool, rv.Pool, rv.RbdImageName, rv.RequestName) return false, err } @@ -246,8 +258,15 @@ func reserveSnap(ctx context.Context, rbdSnap *rbdSnapshot, cr *util.Credentials return err } - snapUUID, rbdSnap.RbdSnapName, err = snapJournal.ReserveName(ctx, rbdSnap.Monitors, cr, rbdSnap.JournalPool, journalPoolID, - rbdSnap.Pool, imagePoolID, rbdSnap.RequestName, rbdSnap.NamePrefix, rbdSnap.RbdImageName, "") + j, err := snapJournal.Connect(rbdSnap.Monitors, cr) + if err != nil { + return err + } + defer j.Destroy() + + snapUUID, rbdSnap.RbdSnapName, err = j.ReserveName( + ctx, rbdSnap.JournalPool, journalPoolID, rbdSnap.Pool, imagePoolID, + rbdSnap.RequestName, rbdSnap.NamePrefix, rbdSnap.RbdImageName, "") if err != nil { return err } @@ -318,8 +337,15 @@ func reserveVol(ctx context.Context, rbdVol *rbdVolume, rbdSnap *rbdSnapshot, cr kmsID = rbdVol.KMS.GetID() } - imageUUID, rbdVol.RbdImageName, err = volJournal.ReserveName(ctx, rbdVol.Monitors, cr, rbdVol.JournalPool, journalPoolID, - rbdVol.Pool, imagePoolID, rbdVol.RequestName, rbdVol.NamePrefix, "", kmsID) + j, err := volJournal.Connect(rbdVol.Monitors, cr) + if err != nil { + return err + } + defer j.Destroy() + + imageUUID, rbdVol.RbdImageName, err = j.ReserveName( + ctx, rbdVol.JournalPool, journalPoolID, rbdVol.Pool, imagePoolID, + rbdVol.RequestName, rbdVol.NamePrefix, "", kmsID) if err != nil { return err } @@ -338,15 +364,28 @@ func reserveVol(ctx context.Context, rbdVol *rbdVolume, rbdSnap *rbdSnapshot, cr // undoSnapReservation is a helper routine to undo a name reservation for rbdSnapshot func undoSnapReservation(ctx context.Context, rbdSnap *rbdSnapshot, cr *util.Credentials) error { - err := snapJournal.UndoReservation(ctx, rbdSnap.Monitors, cr, rbdSnap.JournalPool, rbdSnap.Pool, - rbdSnap.RbdSnapName, rbdSnap.RequestName) + j, err := snapJournal.Connect(rbdSnap.Monitors, cr) + if err != nil { + return err + } + defer j.Destroy() + + err = j.UndoReservation( + ctx, rbdSnap.JournalPool, rbdSnap.Pool, rbdSnap.RbdSnapName, + rbdSnap.RequestName) return err } // undoVolReservation is a helper routine to undo a name reservation for rbdVolume func undoVolReservation(ctx context.Context, rbdVol *rbdVolume, cr *util.Credentials) error { - err := volJournal.UndoReservation(ctx, rbdVol.Monitors, cr, rbdVol.JournalPool, rbdVol.Pool, + j, err := volJournal.Connect(rbdVol.Monitors, cr) + if err != nil { + return err + } + defer j.Destroy() + + err = j.UndoReservation(ctx, rbdVol.JournalPool, rbdVol.Pool, rbdVol.RbdImageName, rbdVol.RequestName) return err diff --git a/internal/rbd/rbd_util.go b/internal/rbd/rbd_util.go index e200a64f8..37291c4e4 100644 --- a/internal/rbd/rbd_util.go +++ b/internal/rbd/rbd_util.go @@ -391,8 +391,14 @@ func genSnapFromSnapID(ctx context.Context, rbdSnap *rbdSnapshot, snapshotID str } rbdSnap.JournalPool = rbdSnap.Pool - imageAttributes, err := snapJournal.GetImageAttributes(ctx, rbdSnap.Monitors, - cr, rbdSnap.Pool, vi.ObjectUUID, true) + j, err := snapJournal.Connect(rbdSnap.Monitors, cr) + if err != nil { + return err + } + defer j.Destroy() + + imageAttributes, err := j.GetImageAttributes( + ctx, rbdSnap.Pool, vi.ObjectUUID, true) if err != nil { return err } @@ -453,8 +459,14 @@ func genVolFromVolID(ctx context.Context, volumeID string, cr *util.Credentials, } rbdVol.JournalPool = rbdVol.Pool - imageAttributes, err := volJournal.GetImageAttributes(ctx, rbdVol.Monitors, cr, - rbdVol.Pool, vi.ObjectUUID, false) + j, err := volJournal.Connect(rbdVol.Monitors, cr) + if err != nil { + return nil, err + } + defer j.Destroy() + + imageAttributes, err := j.GetImageAttributes( + ctx, rbdVol.Pool, vi.ObjectUUID, false) if err != nil { return nil, err }