From b872914a6e54509b15e48ae2343ec4b4d29cc3c4 Mon Sep 17 00:00:00 2001 From: Niels de Vos Date: Fri, 17 Nov 2023 10:31:38 +0100 Subject: [PATCH] rbd: set/get correct ImageID in more places In some places the ImageID is used as the ID of the parent. That is very confusing and prone to errors. Instead, fetch the right ImageID where possible, and set ParentID for referencing to parent images. Signed-off-by: Niels de Vos --- internal/rbd/controllerserver.go | 1 + internal/rbd/rbd_util.go | 17 +++++++++++++++++ internal/rbd/snapshot.go | 2 ++ 3 files changed, 20 insertions(+) diff --git a/internal/rbd/controllerserver.go b/internal/rbd/controllerserver.go index e3796b661..9037e1c23 100644 --- a/internal/rbd/controllerserver.go +++ b/internal/rbd/controllerserver.go @@ -1173,6 +1173,7 @@ func (cs *ControllerServer) CreateSnapshot( // Update the metadata on snapshot not on the original image rbdVol.RbdImageName = rbdSnap.RbdSnapName + rbdVol.ImageID = vol.ImageID rbdVol.ClusterName = cs.ClusterName defer func() { diff --git a/internal/rbd/rbd_util.go b/internal/rbd/rbd_util.go index f273d40ab..2dbb7d5fe 100644 --- a/internal/rbd/rbd_util.go +++ b/internal/rbd/rbd_util.go @@ -114,6 +114,8 @@ type rbdImage struct { NamePrefix string // ParentName represents the parent image name of the image. ParentName string + // ParentID represents the parent image ID of the image. + ParentID string // Parent Pool is the pool that contains the parent image. ParentPool string // Cluster name @@ -711,6 +713,7 @@ func (ri *rbdImage) getCloneDepth(ctx context.Context) (uint, error) { vol.Pool = ri.Pool vol.Monitors = ri.Monitors vol.RbdImageName = ri.RbdImageName + vol.ImageID = ri.ImageID vol.RadosNamespace = ri.RadosNamespace vol.conn = ri.conn.Copy() @@ -743,6 +746,7 @@ func (ri *rbdImage) getCloneDepth(ctx context.Context) (uint, error) { depth++ } vol.RbdImageName = vol.ParentName + vol.ImageID = vol.ParentID vol.Pool = vol.ParentPool } } @@ -882,6 +886,9 @@ func (ri *rbdImage) getParentName() (string, error) { return "", err } + ri.ParentName = parentInfo.Image.ImageName + ri.ParentID = parentInfo.Image.ImageID + return parentInfo.Image.ImageName, nil } @@ -1595,6 +1602,11 @@ func (ri *rbdImage) getImageInfo() error { // TODO: can rv.VolSize not be a uint64? Or initialize it to -1? ri.VolSize = int64(imageInfo.Size) + ri.ImageID, err = image.GetId() + if err != nil { + return err + } + features, err := image.GetFeatures() if err != nil { return err @@ -1608,11 +1620,13 @@ func (ri *rbdImage) getImageInfo() error { // the parent is an error or not. if errors.Is(err, librbd.ErrNotFound) { ri.ParentName = "" + ri.ParentID = "" } else { return err } } else { ri.ParentName = parentInfo.Image.ImageName + ri.ParentID = parentInfo.Image.ImageID ri.ParentPool = parentInfo.Image.PoolName } // Get image creation time @@ -1643,6 +1657,7 @@ func (ri *rbdImage) getParent() (*rbdImage, error) { parentImage.Pool = ri.ParentPool parentImage.RadosNamespace = ri.RadosNamespace parentImage.RbdImageName = ri.ParentName + parentImage.ImageID = ri.ParentID err = parentImage.getImageInfo() if err != nil { @@ -1699,6 +1714,7 @@ type rbdImageMetadataStash struct { Pool string `json:"pool"` RadosNamespace string `json:"radosNamespace"` ImageName string `json:"image"` + ImageID string `json:"imageID"` UnmapOptions string `json:"unmapOptions"` NbdAccess bool `json:"accessType"` Encrypted bool `json:"encrypted"` @@ -1728,6 +1744,7 @@ func stashRBDImageMetadata(volOptions *rbdVolume, metaDataPath string) error { Pool: volOptions.Pool, RadosNamespace: volOptions.RadosNamespace, ImageName: volOptions.RbdImageName, + ImageID: volOptions.ImageID, Encrypted: volOptions.isBlockEncrypted(), UnmapOptions: volOptions.UnmapOptions, } diff --git a/internal/rbd/snapshot.go b/internal/rbd/snapshot.go index 92823e40e..85e5c08b0 100644 --- a/internal/rbd/snapshot.go +++ b/internal/rbd/snapshot.go @@ -107,6 +107,8 @@ func generateVolFromSnap(rbdSnap *rbdSnapshot) *rbdVolume { vol.JournalPool = rbdSnap.JournalPool vol.RadosNamespace = rbdSnap.RadosNamespace vol.RbdImageName = rbdSnap.RbdSnapName + vol.ParentName = rbdSnap.ParentName + vol.ParentID = rbdSnap.ParentID // /!\ WARNING /!\ //