From 4be0051e6999e707307e9208d1eec08311107de9 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 e3796b6611d2..9037e1c23710 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 f273d40ab812..2dbb7d5fe674 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 92823e40ef97..85e5c08b00e8 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 /!\ //