Skip to content

Commit 3d522ce

Browse files
committed
feat(backingimage): backing image clone and encryption support
ref: longhorn/longhorn 7051 Signed-off-by: Jack Lin <[email protected]>
1 parent 9a58400 commit 3d522ce

File tree

17 files changed

+331
-32
lines changed

17 files changed

+331
-32
lines changed

controller/backing_image_controller.go

+28
Original file line numberDiff line numberDiff line change
@@ -401,6 +401,20 @@ func (bic *BackingImageController) handleBackingImageDataSource(bi *longhorn.Bac
401401
if err != nil {
402402
return err
403403
}
404+
405+
// For cloning, we choose the same node and disk as the source backing image
406+
if bi.Spec.SourceType == longhorn.BackingImageDataSourceTypeClone {
407+
sourceBackingImageName := bi.Spec.SourceParameters[longhorn.DataSourceTypeCloneParameterBackingImage]
408+
sourceBackingImage, err := bic.ds.GetBackingImageRO(sourceBackingImageName)
409+
if err != nil {
410+
return fmt.Errorf("failed to get source backing image %v during cloning", sourceBackingImageName)
411+
}
412+
readyNode, readyDiskName, err = bic.ds.GetOneBackingImageReadyNodeDisk(sourceBackingImage)
413+
if err != nil {
414+
return fmt.Errorf("failed to find one ready source backing image %v during cloning", sourceBackingImageName)
415+
}
416+
}
417+
404418
foundReadyDisk = true
405419
readyNodeID = readyNode.Name
406420
readyDiskUUID = readyNode.Status.DiskStatus[readyDiskName].DiskUUID
@@ -532,6 +546,20 @@ func (bic *BackingImageController) handleBackingImageDataSource(bi *longhorn.Bac
532546
if err != nil {
533547
return err
534548
}
549+
550+
// For cloning, we choose the same node and disk as the source backing image
551+
if bi.Spec.SourceType == longhorn.BackingImageDataSourceTypeClone {
552+
sourceBackingImageName := bi.Spec.SourceParameters[longhorn.DataSourceTypeCloneParameterBackingImage]
553+
sourceBackingImage, err := bic.ds.GetBackingImageRO(sourceBackingImageName)
554+
if err != nil {
555+
return fmt.Errorf("failed to get source backing image %v during cloning", sourceBackingImageName)
556+
}
557+
readyNode, readyDiskName, err = bic.ds.GetOneBackingImageReadyNodeDisk(sourceBackingImage)
558+
if err != nil {
559+
return fmt.Errorf("failed to find one ready source backing image %v during cloning", sourceBackingImageName)
560+
}
561+
}
562+
535563
bids.Spec.NodeID = readyNode.Name
536564
bids.Spec.DiskUUID = readyNode.Status.DiskStatus[readyDiskName].DiskUUID
537565
bids.Spec.DiskPath = readyNode.Spec.Disks[readyDiskName].Path

controller/backing_image_data_source_controller.go

+74-3
Original file line numberDiff line numberDiff line change
@@ -405,6 +405,19 @@ func (c *BackingImageDataSourceController) syncBackingImage(bids *longhorn.Backi
405405
}
406406
}
407407

408+
// Only copy the secret to spec if it is to encrypt other backing image
409+
// because we use spec secret to check if it is encrypted.
410+
if bi.Spec.SourceType == longhorn.BackingImageDataSourceTypeClone &&
411+
bimtypes.EncryptionType(bi.Spec.SourceParameters[longhorn.DataSourceTypeCloneParameterEncryption]) == bimtypes.EncryptionTypeEncrypt {
412+
413+
if bi.Spec.SourceParameters[longhorn.DataSourceTypeCloneParameterSecret] != "" {
414+
bi.Spec.Secret = bi.Spec.SourceParameters[longhorn.DataSourceTypeCloneParameterSecret]
415+
}
416+
if bi.Spec.SourceParameters[longhorn.DataSourceTypeCloneParameterSecretNamespace] != "" {
417+
bi.Spec.SecretNamespace = bi.Spec.SourceParameters[longhorn.DataSourceTypeCloneParameterSecretNamespace]
418+
}
419+
}
420+
408421
return nil
409422
}
410423

@@ -669,7 +682,11 @@ func (c *BackingImageDataSourceController) generateBackingImageDataSourcePodMani
669682
"--source-type", string(bids.Spec.SourceType),
670683
}
671684

672-
if err := c.prepareRunningParameters(bids); err != nil {
685+
bids.Status.RunningParameters = bids.Spec.Parameters
686+
if err := c.prepareRunningParametersForClone(bids); err != nil {
687+
return nil, err
688+
}
689+
if err := c.prepareRunningParametersForExport(bids); err != nil {
673690
return nil, err
674691
}
675692
for key, value := range bids.Status.RunningParameters {
@@ -679,6 +696,23 @@ func (c *BackingImageDataSourceController) generateBackingImageDataSourcePodMani
679696
cmd = append(cmd, "--checksum", bids.Spec.Checksum)
680697
}
681698

699+
if bids.Spec.SourceType == longhorn.BackingImageDataSourceTypeClone &&
700+
bids.Spec.Parameters[longhorn.DataSourceTypeCloneParameterSecretNamespace] != "" &&
701+
bids.Spec.Parameters[longhorn.DataSourceTypeCloneParameterSecret] != "" {
702+
703+
credential, err := c.ds.GetEncryptionSecret(
704+
bids.Spec.Parameters[longhorn.DataSourceTypeCloneParameterSecretNamespace],
705+
bids.Spec.Parameters[longhorn.DataSourceTypeCloneParameterSecret],
706+
)
707+
if err != nil {
708+
return nil, err
709+
}
710+
711+
for key, value := range credential {
712+
cmd = append(cmd, "--credential", fmt.Sprintf("%s=%s", key, value))
713+
}
714+
}
715+
682716
if bids.Spec.SourceType == longhorn.BackingImageDataSourceTypeRestore {
683717
var credential map[string]string
684718
backupTarget, err := c.ds.GetBackupTargetRO(types.DefaultBackupTargetName)
@@ -745,6 +779,14 @@ func (c *BackingImageDataSourceController) generateBackingImageDataSourcePodMani
745779
Name: "disk-path",
746780
MountPath: bimtypes.DiskPathInContainer,
747781
},
782+
{
783+
Name: "host-dev",
784+
MountPath: "/dev",
785+
},
786+
{
787+
Name: "host-proc",
788+
MountPath: "/host/proc", // we use this to enter the host namespace
789+
},
748790
},
749791
Env: []corev1.EnvVar{
750792
{
@@ -770,6 +812,22 @@ func (c *BackingImageDataSourceController) generateBackingImageDataSourcePodMani
770812
},
771813
},
772814
},
815+
{
816+
Name: "host-dev",
817+
VolumeSource: corev1.VolumeSource{
818+
HostPath: &corev1.HostPathVolumeSource{
819+
Path: "/dev",
820+
},
821+
},
822+
},
823+
{
824+
Name: "host-proc",
825+
VolumeSource: corev1.VolumeSource{
826+
HostPath: &corev1.HostPathVolumeSource{
827+
Path: "/proc",
828+
},
829+
},
830+
},
773831
},
774832
NodeName: bids.Spec.NodeID,
775833
RestartPolicy: corev1.RestartPolicyNever,
@@ -802,8 +860,21 @@ func (c *BackingImageDataSourceController) generateBackingImageDataSourcePodMani
802860
return podSpec, nil
803861
}
804862

805-
func (c *BackingImageDataSourceController) prepareRunningParameters(bids *longhorn.BackingImageDataSource) error {
806-
bids.Status.RunningParameters = bids.Spec.Parameters
863+
func (c *BackingImageDataSourceController) prepareRunningParametersForClone(bids *longhorn.BackingImageDataSource) error {
864+
if bids.Spec.SourceType != longhorn.BackingImageDataSourceTypeClone {
865+
return nil
866+
}
867+
868+
sourceBackingImageName := bids.Spec.Parameters[longhorn.DataSourceTypeCloneParameterBackingImage]
869+
sourceBackingImage, err := c.ds.GetBackingImageRO(sourceBackingImageName)
870+
if err != nil {
871+
return err
872+
}
873+
bids.Status.RunningParameters[longhorn.DataSourceTypeCloneParameterBackingImageUUID] = sourceBackingImage.Status.UUID
874+
return nil
875+
}
876+
877+
func (c *BackingImageDataSourceController) prepareRunningParametersForExport(bids *longhorn.BackingImageDataSource) error {
807878
if bids.Spec.SourceType != longhorn.BackingImageDataSourceTypeExportFromVolume {
808879
return nil
809880
}

controller/share_manager_controller.go

+7-8
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,6 @@ import (
2525
clientset "k8s.io/client-go/kubernetes"
2626
v1core "k8s.io/client-go/kubernetes/typed/core/v1"
2727

28-
"github.com/longhorn/longhorn-manager/csi"
2928
"github.com/longhorn/longhorn-manager/csi/crypto"
3029
"github.com/longhorn/longhorn-manager/datastore"
3130
"github.com/longhorn/longhorn-manager/engineapi"
@@ -906,16 +905,16 @@ func (c *ShareManagerController) createShareManagerPod(sm *longhorn.ShareManager
906905
return nil, err
907906
}
908907

909-
cryptoKey = string(secret.Data[csi.CryptoKeyValue])
908+
cryptoKey = string(secret.Data[types.CryptoKeyValue])
910909
if len(cryptoKey) == 0 {
911-
return nil, fmt.Errorf("missing %v in secret for encrypted RWX volume %v", csi.CryptoKeyValue, volume.Name)
910+
return nil, fmt.Errorf("missing %v in secret for encrypted RWX volume %v", types.CryptoKeyValue, volume.Name)
912911
}
913912
cryptoParams = crypto.NewEncryptParams(
914-
string(secret.Data[csi.CryptoKeyProvider]),
915-
string(secret.Data[csi.CryptoKeyCipher]),
916-
string(secret.Data[csi.CryptoKeyHash]),
917-
string(secret.Data[csi.CryptoKeySize]),
918-
string(secret.Data[csi.CryptoPBKDF]))
913+
string(secret.Data[types.CryptoKeyProvider]),
914+
string(secret.Data[types.CryptoKeyCipher]),
915+
string(secret.Data[types.CryptoKeyHash]),
916+
string(secret.Data[types.CryptoKeySize]),
917+
string(secret.Data[types.CryptoPBKDF]))
919918
}
920919

921920
manifest := c.createPodManifest(sm, annotations, tolerations, affinity, imagePullPolicy, nil, registrySecret,

csi/node_server.go

+5-14
Original file line numberDiff line numberDiff line change
@@ -31,15 +31,6 @@ import (
3131
)
3232

3333
const (
34-
// CryptoKeyProvider specifies how the CryptoKeyValue is retrieved
35-
// We currently only support passphrase retrieval via direct secret values
36-
CryptoKeyProvider = "CRYPTO_KEY_PROVIDER"
37-
CryptoKeyValue = "CRYPTO_KEY_VALUE"
38-
CryptoKeyCipher = "CRYPTO_KEY_CIPHER"
39-
CryptoKeyHash = "CRYPTO_KEY_HASH"
40-
CryptoKeySize = "CRYPTO_KEY_SIZE"
41-
CryptoPBKDF = "CRYPTO_PBKDF"
42-
4334
defaultFsType = "ext4"
4435
)
4536

@@ -463,8 +454,8 @@ func (ns *NodeServer) NodeStageVolume(ctx context.Context, req *csi.NodeStageVol
463454

464455
if volume.Encrypted {
465456
secrets := req.GetSecrets()
466-
keyProvider := secrets[CryptoKeyProvider]
467-
passphrase := secrets[CryptoKeyValue]
457+
keyProvider := secrets[types.CryptoKeyProvider]
458+
passphrase := secrets[types.CryptoKeyValue]
468459
if keyProvider != "" && keyProvider != "secret" {
469460
return nil, status.Errorf(codes.InvalidArgument, "unsupported key provider %v for encrypted volume %v", keyProvider, volumeID)
470461
}
@@ -477,7 +468,7 @@ func (ns *NodeServer) NodeStageVolume(ctx context.Context, req *csi.NodeStageVol
477468
return nil, status.Errorf(codes.InvalidArgument, "unsupported disk encryption format %v", diskFormat)
478469
}
479470

480-
cryptoParams := crypto.NewEncryptParams(keyProvider, secrets[CryptoKeyCipher], secrets[CryptoKeyHash], secrets[CryptoKeySize], secrets[CryptoPBKDF])
471+
cryptoParams := crypto.NewEncryptParams(keyProvider, secrets[types.CryptoKeyCipher], secrets[types.CryptoKeyHash], secrets[types.CryptoKeySize], secrets[types.CryptoPBKDF])
481472

482473
// initial setup of longhorn device for crypto
483474
if diskFormat == "" {
@@ -742,8 +733,8 @@ func (ns *NodeServer) NodeExpandVolume(ctx context.Context, req *csi.NodeExpandV
742733
log.Infof("Skip encrypto device resizing for volume %v node expansion since the secret empty, maybe the related feature gate is not enabled", volumeID)
743734
return devicePath, nil
744735
}
745-
keyProvider := secrets[CryptoKeyProvider]
746-
passphrase := secrets[CryptoKeyValue]
736+
keyProvider := secrets[types.CryptoKeyProvider]
737+
passphrase := secrets[types.CryptoKeyValue]
747738
if keyProvider != "" && keyProvider != "secret" {
748739
return "", status.Errorf(codes.InvalidArgument, "unsupported key provider %v for encrypted volume %v", keyProvider, volumeID)
749740
}

datastore/longhorn.go

+36
Original file line numberDiff line numberDiff line change
@@ -656,6 +656,24 @@ func (s *DataStore) ListSettings() (map[types.SettingName]*longhorn.Setting, err
656656
return itemMap, nil
657657
}
658658

659+
func (s *DataStore) GetEncryptionSecret(secretNamespace, secretName string) (map[string]string, error) {
660+
secret, err := s.GetSecretRO(secretNamespace, secretName)
661+
if err != nil {
662+
return nil, err
663+
}
664+
credentialSecret := make(map[string]string)
665+
if secret.Data == nil {
666+
return credentialSecret, nil
667+
}
668+
credentialSecret[types.CryptoKeyProvider] = string(secret.Data[types.CryptoKeyProvider])
669+
credentialSecret[types.CryptoKeyValue] = string(secret.Data[types.CryptoKeyValue])
670+
credentialSecret[types.CryptoKeyCipher] = string(secret.Data[types.CryptoKeyCipher])
671+
credentialSecret[types.CryptoKeyHash] = string(secret.Data[types.CryptoKeyHash])
672+
credentialSecret[types.CryptoKeySize] = string(secret.Data[types.CryptoKeySize])
673+
credentialSecret[types.CryptoPBKDF] = string(secret.Data[types.CryptoPBKDF])
674+
return credentialSecret, nil
675+
}
676+
659677
// GetCredentialFromSecret gets the Secret of the given name and namespace
660678
// Returns a new credential object or error
661679
func (s *DataStore) GetCredentialFromSecret(secretName string) (map[string]string, error) {
@@ -5124,3 +5142,21 @@ func (s *DataStore) GetFreezeFilesystemForSnapshotSetting(e *longhorn.Engine) (b
51245142

51255143
return s.GetSettingAsBool(types.SettingNameFreezeFilesystemForSnapshot)
51265144
}
5145+
5146+
func (s *DataStore) GetOneBackingImageReadyNodeDisk(backingImage *longhorn.BackingImage) (*longhorn.Node, string, error) {
5147+
for diskUUID := range backingImage.Spec.Disks {
5148+
bimMap, err := s.ListBackingImageManagersByDiskUUID(diskUUID)
5149+
if err != nil {
5150+
return nil, "", errors.Wrapf(err, "failed to get backing image manager by disk uuid %v", diskUUID)
5151+
}
5152+
for _, bim := range bimMap {
5153+
if bim.DeletionTimestamp == nil {
5154+
if info, exists := bim.Status.BackingImageFileMap[backingImage.Name]; exists && info.State == longhorn.BackingImageStateReady {
5155+
return s.GetReadyDiskNode(bim.Spec.DiskUUID)
5156+
}
5157+
}
5158+
}
5159+
}
5160+
5161+
return nil, "", fmt.Errorf("failed to find one ready backing image %v", backingImage.Name)
5162+
}

go.mod

+2
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@ module github.com/longhorn/longhorn-manager
22

33
go 1.22.2
44

5+
replace github.com/longhorn/backing-image-manager v1.7.0-dev.0.20240608041220-73575e3dfe5c => github.com/chanyilin/backing-image-manager v1.4.0-rc1.0.20240612074004-a9a5fd8a5409
6+
57
// Replace directives are required for dependencies in this section because:
68
// - This module imports k8s.io/kubernetes.
79
// - The development for all of these dependencies is done at kubernetes/staging and then synced to other repos.

go.sum

+2-2
Original file line numberDiff line numberDiff line change
@@ -826,6 +826,8 @@ github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XL
826826
github.com/cespare/xxhash/v2 v2.1.2/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=
827827
github.com/cespare/xxhash/v2 v2.2.0 h1:DC2CZ1Ep5Y4k3ZQ899DldepgrayRUGE6BBZ/cd9Cj44=
828828
github.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=
829+
github.com/chanyilin/backing-image-manager v1.4.0-rc1.0.20240612074004-a9a5fd8a5409 h1:VxA3K/wopLkovJmEmlOsSOS1GY+pmpBljBPSXokmN3s=
830+
github.com/chanyilin/backing-image-manager v1.4.0-rc1.0.20240612074004-a9a5fd8a5409/go.mod h1:yDR3uDm83YSnm+mmV0wWObqIBzdzGBzaG0pDgr6k97c=
829831
github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI=
830832
github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI=
831833
github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU=
@@ -1217,8 +1219,6 @@ github.com/kubernetes-csi/csi-lib-utils v0.6.1 h1:+AZ58SRSRWh2vmMoWAAGcv7x6fIyBM
12171219
github.com/kubernetes-csi/csi-lib-utils v0.6.1/go.mod h1:GVmlUmxZ+SUjVLXicRFjqWUUvWez0g0Y78zNV9t7KfQ=
12181220
github.com/liggitt/tabwriter v0.0.0-20181228230101-89fcab3d43de h1:9TO3cAIGXtEhnIaL+V+BEER86oLrvS+kWobKpbJuye0=
12191221
github.com/liggitt/tabwriter v0.0.0-20181228230101-89fcab3d43de/go.mod h1:zAbeS9B/r2mtpb6U+EI2rYA5OAXxsYw6wTamcNW+zcE=
1220-
github.com/longhorn/backing-image-manager v1.7.0-dev.0.20240608041220-73575e3dfe5c h1:Mv7EZL2Pjn8WryeehDrMYTCjkQHW7cBNfUIRf+iBR78=
1221-
github.com/longhorn/backing-image-manager v1.7.0-dev.0.20240608041220-73575e3dfe5c/go.mod h1:n4gokpvajg2NOz39tE1JQAmbT/72Z69i5tEQNoXHs/o=
12221222
github.com/longhorn/backupstore v0.0.0-20240603134532-5ec9a300bef4 h1:FI2oBT6397aaQfspA3tDlYjkDaqhtXnwID4dMgVic0g=
12231223
github.com/longhorn/backupstore v0.0.0-20240603134532-5ec9a300bef4/go.mod h1:n210xpMUVrSn/W4Za/9BZhyXLCTVfAOq5lNdLrRSyz8=
12241224
github.com/longhorn/go-common-libs v0.0.0-20240609144924-f37bf784b1df h1:wMPNmYTo0ijbGZEff+P8iJen6Q57HRKqwJq0Ij9FQQI=

k8s/crds.yaml

+6
Original file line numberDiff line numberDiff line change
@@ -125,6 +125,7 @@ spec:
125125
- upload
126126
- export-from-volume
127127
- restore
128+
- clone
128129
type: string
129130
uuid:
130131
type: string
@@ -445,6 +446,10 @@ spec:
445446
additionalProperties:
446447
type: string
447448
type: object
449+
secret:
450+
type: string
451+
secretNamespace:
452+
type: string
448453
sourceParameters:
449454
additionalProperties:
450455
type: string
@@ -455,6 +460,7 @@ spec:
455460
- upload
456461
- export-from-volume
457462
- restore
463+
- clone
458464
type: string
459465
type: object
460466
status:

k8s/pkg/apis/longhorn/v1beta2/backingimage.go

+4
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,10 @@ type BackingImageSpec struct {
4646
SourceType BackingImageDataSourceType `json:"sourceType"`
4747
// +optional
4848
SourceParameters map[string]string `json:"sourceParameters"`
49+
// +optional
50+
Secret string `json:"secret"`
51+
// +optional
52+
SecretNamespace string `json:"secretNamespace"`
4953
}
5054

5155
// BackingImageStatus defines the observed state of the Longhorn backing image status

k8s/pkg/apis/longhorn/v1beta2/backingimagedatasource.go

+7-1
Original file line numberDiff line numberDiff line change
@@ -8,14 +8,15 @@ const (
88
DataSourceTypeExportParameterVolumeName = "volume-name"
99
)
1010

11-
// +kubebuilder:validation:Enum=download;upload;export-from-volume;restore
11+
// +kubebuilder:validation:Enum=download;upload;export-from-volume;restore;clone
1212
type BackingImageDataSourceType string
1313

1414
const (
1515
BackingImageDataSourceTypeDownload = BackingImageDataSourceType("download")
1616
BackingImageDataSourceTypeUpload = BackingImageDataSourceType("upload")
1717
BackingImageDataSourceTypeExportFromVolume = BackingImageDataSourceType("export-from-volume")
1818
BackingImageDataSourceTypeRestore = BackingImageDataSourceType("restore")
19+
BackingImageDataSourceTypeClone = BackingImageDataSourceType("clone")
1920

2021
DataSourceTypeExportFromVolumeParameterVolumeName = "volume-name"
2122
DataSourceTypeExportFromVolumeParameterVolumeSize = "volume-size"
@@ -24,6 +25,11 @@ const (
2425
DataSourceTypeExportFromVolumeParameterFileSyncHTTPClientTimeout = "file-sync-http-client-timeout"
2526
DataSourceTypeRestoreParameterBackupURL = "backup-url"
2627
DataSourceTypeRestoreParameterConcurrentLimit = "concurrent-limit"
28+
DataSourceTypeCloneParameterBackingImage = "backing-image"
29+
DataSourceTypeCloneParameterBackingImageUUID = "backing-image-uuid"
30+
DataSourceTypeCloneParameterEncryption = "encryption"
31+
DataSourceTypeCloneParameterSecret = "secret"
32+
DataSourceTypeCloneParameterSecretNamespace = "secret-namespace"
2733
)
2834

2935
// BackingImageDataSourceSpec defines the desired state of the Longhorn backing image data source

types/types.go

+11
Original file line numberDiff line numberDiff line change
@@ -259,6 +259,17 @@ const (
259259
InstanceManagerSuffixChecksumLength = 32
260260
)
261261

262+
const (
263+
// CryptoKeyProvider specifies how the CryptoKeyValue is retrieved
264+
// We currently only support passphrase retrieval via direct secret values
265+
CryptoKeyProvider = "CRYPTO_KEY_PROVIDER"
266+
CryptoKeyValue = "CRYPTO_KEY_VALUE"
267+
CryptoKeyCipher = "CRYPTO_KEY_CIPHER"
268+
CryptoKeyHash = "CRYPTO_KEY_HASH"
269+
CryptoKeySize = "CRYPTO_KEY_SIZE"
270+
CryptoPBKDF = "CRYPTO_PBKDF"
271+
)
272+
262273
// SettingsRelatedToVolume should match the items in datastore.GetLabelsForVolumesFollowsGlobalSettings
263274
//
264275
// TODO: May need to add the data locality check

0 commit comments

Comments
 (0)