cache volume for data download

Signed-off-by: Lyndon-Li <lyonghui@vmware.com>
This commit is contained in:
Lyndon-Li
2025-11-04 16:59:52 +08:00
parent 597cee545a
commit 7dbe2b4358
3 changed files with 38 additions and 1 deletions

View File

@@ -60,6 +60,7 @@ import (
"github.com/vmware-tanzu/velero/pkg/exposer" "github.com/vmware-tanzu/velero/pkg/exposer"
"github.com/vmware-tanzu/velero/pkg/metrics" "github.com/vmware-tanzu/velero/pkg/metrics"
"github.com/vmware-tanzu/velero/pkg/nodeagent" "github.com/vmware-tanzu/velero/pkg/nodeagent"
repository "github.com/vmware-tanzu/velero/pkg/repository/manager"
velerotypes "github.com/vmware-tanzu/velero/pkg/types" velerotypes "github.com/vmware-tanzu/velero/pkg/types"
"github.com/vmware-tanzu/velero/pkg/util/filesystem" "github.com/vmware-tanzu/velero/pkg/util/filesystem"
"github.com/vmware-tanzu/velero/pkg/util/kube" "github.com/vmware-tanzu/velero/pkg/util/kube"
@@ -144,6 +145,7 @@ type nodeAgentServer struct {
dataPathConfigs *velerotypes.NodeAgentConfigs dataPathConfigs *velerotypes.NodeAgentConfigs
backupRepoConfigs map[string]string backupRepoConfigs map[string]string
vgdpCounter *exposer.VgdpCounter vgdpCounter *exposer.VgdpCounter
repoConfigMgr repository.ConfigManager
} }
func newNodeAgentServer(logger logrus.FieldLogger, factory client.Factory, config nodeAgentServerConfig) (*nodeAgentServer, error) { func newNodeAgentServer(logger logrus.FieldLogger, factory client.Factory, config nodeAgentServerConfig) (*nodeAgentServer, error) {
@@ -237,6 +239,7 @@ func newNodeAgentServer(logger logrus.FieldLogger, factory client.Factory, confi
namespace: factory.Namespace(), namespace: factory.Namespace(),
nodeName: nodeName, nodeName: nodeName,
metricsAddress: config.metricsAddress, metricsAddress: config.metricsAddress,
repoConfigMgr: repository.NewConfigManager(logger),
} }
// the cache isn't initialized yet when "validatePodVolumesHostPath" is called, the client returned by the manager cannot // the cache isn't initialized yet when "validatePodVolumesHostPath" is called, the client returned by the manager cannot
@@ -386,6 +389,12 @@ func (s *nodeAgentServer) run() {
s.logger.Infof("Using customized restorePVC config %v", restorePVCConfig) s.logger.Infof("Using customized restorePVC config %v", restorePVCConfig)
} }
var cachePVCConfig *velerotypes.CachePVC
if s.dataPathConfigs != nil && s.dataPathConfigs.CachePVCConfig != nil {
cachePVCConfig = s.dataPathConfigs.CachePVCConfig
s.logger.Infof("Using customized cachePVC config %v", cachePVCConfig)
}
dataDownloadReconciler := controller.NewDataDownloadReconciler( dataDownloadReconciler := controller.NewDataDownloadReconciler(
s.mgr.GetClient(), s.mgr.GetClient(),
s.mgr, s.mgr,
@@ -394,12 +403,15 @@ func (s *nodeAgentServer) run() {
s.vgdpCounter, s.vgdpCounter,
loadAffinity, loadAffinity,
restorePVCConfig, restorePVCConfig,
s.backupRepoConfigs,
cachePVCConfig,
podResources, podResources,
s.nodeName, s.nodeName,
s.config.dataMoverPrepareTimeout, s.config.dataMoverPrepareTimeout,
s.logger, s.logger,
s.metrics, s.metrics,
dataMovePriorityClass, dataMovePriorityClass,
s.repoConfigMgr,
) )
if err := dataDownloadReconciler.SetupWithManager(s.mgr); err != nil { if err := dataDownloadReconciler.SetupWithManager(s.mgr); err != nil {

View File

@@ -49,6 +49,7 @@ import (
"github.com/vmware-tanzu/velero/pkg/exposer" "github.com/vmware-tanzu/velero/pkg/exposer"
"github.com/vmware-tanzu/velero/pkg/metrics" "github.com/vmware-tanzu/velero/pkg/metrics"
"github.com/vmware-tanzu/velero/pkg/nodeagent" "github.com/vmware-tanzu/velero/pkg/nodeagent"
repository "github.com/vmware-tanzu/velero/pkg/repository/manager"
velerotypes "github.com/vmware-tanzu/velero/pkg/types" velerotypes "github.com/vmware-tanzu/velero/pkg/types"
"github.com/vmware-tanzu/velero/pkg/uploader" "github.com/vmware-tanzu/velero/pkg/uploader"
"github.com/vmware-tanzu/velero/pkg/util" "github.com/vmware-tanzu/velero/pkg/util"
@@ -68,11 +69,14 @@ type DataDownloadReconciler struct {
vgdpCounter *exposer.VgdpCounter vgdpCounter *exposer.VgdpCounter
loadAffinity []*kube.LoadAffinity loadAffinity []*kube.LoadAffinity
restorePVCConfig velerotypes.RestorePVC restorePVCConfig velerotypes.RestorePVC
backupRepoConfigs map[string]string
cacheVolumeConfigs *velerotypes.CachePVC
podResources corev1api.ResourceRequirements podResources corev1api.ResourceRequirements
preparingTimeout time.Duration preparingTimeout time.Duration
metrics *metrics.ServerMetrics metrics *metrics.ServerMetrics
cancelledDataDownload map[string]time.Time cancelledDataDownload map[string]time.Time
dataMovePriorityClass string dataMovePriorityClass string
repoConfigMgr repository.ConfigManager
} }
func NewDataDownloadReconciler( func NewDataDownloadReconciler(
@@ -83,12 +87,15 @@ func NewDataDownloadReconciler(
counter *exposer.VgdpCounter, counter *exposer.VgdpCounter,
loadAffinity []*kube.LoadAffinity, loadAffinity []*kube.LoadAffinity,
restorePVCConfig velerotypes.RestorePVC, restorePVCConfig velerotypes.RestorePVC,
backupRepoConfigs map[string]string,
cacheVolumeConfigs *velerotypes.CachePVC,
podResources corev1api.ResourceRequirements, podResources corev1api.ResourceRequirements,
nodeName string, nodeName string,
preparingTimeout time.Duration, preparingTimeout time.Duration,
logger logrus.FieldLogger, logger logrus.FieldLogger,
metrics *metrics.ServerMetrics, metrics *metrics.ServerMetrics,
dataMovePriorityClass string, dataMovePriorityClass string,
repoConfigMgr repository.ConfigManager,
) *DataDownloadReconciler { ) *DataDownloadReconciler {
return &DataDownloadReconciler{ return &DataDownloadReconciler{
client: client, client: client,
@@ -99,6 +106,8 @@ func NewDataDownloadReconciler(
nodeName: nodeName, nodeName: nodeName,
restoreExposer: exposer.NewGenericRestoreExposer(kubeClient, logger), restoreExposer: exposer.NewGenericRestoreExposer(kubeClient, logger),
restorePVCConfig: restorePVCConfig, restorePVCConfig: restorePVCConfig,
backupRepoConfigs: backupRepoConfigs,
cacheVolumeConfigs: cacheVolumeConfigs,
dataPathMgr: dataPathMgr, dataPathMgr: dataPathMgr,
vgdpCounter: counter, vgdpCounter: counter,
loadAffinity: loadAffinity, loadAffinity: loadAffinity,
@@ -107,6 +116,7 @@ func NewDataDownloadReconciler(
metrics: metrics, metrics: metrics,
cancelledDataDownload: make(map[string]time.Time), cancelledDataDownload: make(map[string]time.Time),
dataMovePriorityClass: dataMovePriorityClass, dataMovePriorityClass: dataMovePriorityClass,
repoConfigMgr: repoConfigMgr,
} }
} }
@@ -882,6 +892,19 @@ func (r *DataDownloadReconciler) setupExposeParam(dd *velerov2alpha1api.DataDown
} }
} }
var cacheVolume *exposer.CacheConfigs
if r.cacheVolumeConfigs != nil {
if limit, err := r.repoConfigMgr.ClientSideCacheLimit(velerov1api.BackupRepositoryTypeKopia, r.backupRepoConfigs); err != nil {
log.WithError(err).Warnf("Failed to get client side cache limit for repo type %s from configs %v", velerov1api.BackupRepositoryTypeKopia, r.backupRepoConfigs)
} else {
cacheVolume = &exposer.CacheConfigs{
Limit: limit,
StorageClass: r.cacheVolumeConfigs.StorageClass,
ResidentThreshold: r.cacheVolumeConfigs.ResidentThreshold,
}
}
}
return exposer.GenericRestoreExposeParam{ return exposer.GenericRestoreExposeParam{
TargetPVCName: dd.Spec.TargetVolume.PVC, TargetPVCName: dd.Spec.TargetVolume.PVC,
TargetNamespace: dd.Spec.TargetVolume.Namespace, TargetNamespace: dd.Spec.TargetVolume.Namespace,
@@ -895,6 +918,8 @@ func (r *DataDownloadReconciler) setupExposeParam(dd *velerov2alpha1api.DataDown
RestorePVCConfig: r.restorePVCConfig, RestorePVCConfig: r.restorePVCConfig,
LoadAffinity: r.loadAffinity, LoadAffinity: r.loadAffinity,
PriorityClassName: r.dataMovePriorityClass, PriorityClassName: r.dataMovePriorityClass,
RestoreSize: dd.Spec.SnapshotSize,
CacheVolume: cacheVolume,
}, nil }, nil
} }

View File

@@ -129,7 +129,7 @@ func initDataDownloadReconcilerWithError(t *testing.T, objects []any, needError
dataPathMgr := datapath.NewManager(1) dataPathMgr := datapath.NewManager(1)
return NewDataDownloadReconciler(&fakeClient, nil, fakeKubeClient, dataPathMgr, nil, nil, velerotypes.RestorePVC{}, corev1api.ResourceRequirements{}, "test-node", time.Minute*5, velerotest.NewLogger(), metrics.NewServerMetrics(), ""), nil return NewDataDownloadReconciler(&fakeClient, nil, fakeKubeClient, dataPathMgr, nil, nil, velerotypes.RestorePVC{}, nil, nil, corev1api.ResourceRequirements{}, "test-node", time.Minute*5, velerotest.NewLogger(), metrics.NewServerMetrics(), "", nil), nil
} }
func TestDataDownloadReconcile(t *testing.T) { func TestDataDownloadReconcile(t *testing.T) {