From d0884e7ce72b857a8470ed220afd214c7837d9d0 Mon Sep 17 00:00:00 2001 From: Lyndon-Li Date: Fri, 4 Sep 2026 19:45:12 +0800 Subject: [PATCH] return source size from uploader Signed-off-by: Lyndon-Li --- pkg/uploader/block/snapshot.go | 15 ++++++++------- pkg/uploader/kopia/snapshot.go | 5 +++-- pkg/uploader/provider/block.go | 18 +++++++++--------- pkg/uploader/provider/kopia.go | 18 +++++++++--------- pkg/uploader/provider/provider.go | 2 +- pkg/uploader/types.go | 3 ++- 6 files changed, 32 insertions(+), 29 deletions(-) diff --git a/pkg/uploader/block/snapshot.go b/pkg/uploader/block/snapshot.go index 566ebad4f..720967ed2 100644 --- a/pkg/uploader/block/snapshot.go +++ b/pkg/uploader/block/snapshot.go @@ -79,11 +79,12 @@ func Backup(ctx context.Context, blkUp Uploader, repoWriter udmrepo.BackupRepo, return uploader.SnapshotInfo{}, false, errors.Wrapf(err, "error reset pos of block device %s", source) } - snapID, backupSize, err := snapshotSource(ctx, repoWriter, blkUp, sourceInfo, forceFull, parentSnapshot, cbtSource, cbtService, tags, uploaderCfg, log, "Block Uploader") + snapID, backupSize, snapshotSize, err := snapshotSource(ctx, repoWriter, blkUp, sourceInfo, forceFull, parentSnapshot, cbtSource, cbtService, tags, uploaderCfg, log, "Block Uploader") snapshotInfo := uploader.SnapshotInfo{ ID: snapID, - Size: sourceInfo.size, + SnapshotSize: snapshotSize, IncrementalSize: backupSize, + SourceSize: sourceInfo.size, } return snapshotInfo, false, err @@ -102,7 +103,7 @@ func snapshotSource( uploaderCfg map[string]string, log logrus.FieldLogger, description string, -) (string, int64, error) { +) (string, int64, int64, error) { log.Info("Start to snapshot...") snapshotStartTime := time.Now() @@ -118,7 +119,7 @@ func snapshotSource( snap, backupSize, err := u.Backup(source, parentBackup.parentObject, bitmap.Iterator(), uploaderCfg) if err != nil { - return "", 0, errors.Wrapf(err, "Failed to run uploader backup for si %v", source) + return "", 0, 0, errors.Wrapf(err, "Failed to run uploader backup for si %v", source) } if snap.Tags == nil { @@ -135,16 +136,16 @@ func snapshotSource( snapID, err := rep.SaveSnapshot(ctx, snap) if err != nil { - return "", 0, errors.Wrapf(err, "Failed to save snapshot %v", snap) + return "", 0, 0, errors.Wrapf(err, "Failed to save snapshot %v", snap) } if err = rep.Flush(ctx); err != nil { - return "", 0, errors.Wrapf(err, "Failed to flush repository") + return "", 0, 0, errors.Wrapf(err, "Failed to flush repository") } log.Infof("Created snapshot with root %v and ID %v in %v", snap.RootObject, snapID, time.Since(snapshotStartTime).Truncate(time.Second)) - return string(snapID), backupSize, nil + return string(snapID), backupSize, snap.TotalSize, nil } func getParentBackupInfo(ctx context.Context, rep udmrepo.BackupRepo, forceFull bool, parentSnapshot string, volumeID string, realSource string, snapshotTags map[string]string, log logrus.FieldLogger) parentBackupInfo { diff --git a/pkg/uploader/kopia/snapshot.go b/pkg/uploader/kopia/snapshot.go index fae7a517c..85c92eac8 100644 --- a/pkg/uploader/kopia/snapshot.go +++ b/pkg/uploader/kopia/snapshot.go @@ -191,8 +191,9 @@ func Backup(ctx context.Context, fsUploader SnapshotUploader, repoWriter repo.Re snapID, snapshotSize, err := SnapshotSource(kopiaCtx, repoWriter, fsUploader, sourceInfo, sourceEntry, forceFull, parentSnapshot, tags, uploaderCfg, log, "Kopia Uploader") snapshotInfo := &uploader.SnapshotInfo{ - ID: snapID, - Size: snapshotSize, + ID: snapID, + SnapshotSize: snapshotSize, + SourceSize: snapshotSize, } return snapshotInfo, false, err diff --git a/pkg/uploader/provider/block.go b/pkg/uploader/provider/block.go index 3d51e275b..73c90a798 100644 --- a/pkg/uploader/provider/block.go +++ b/pkg/uploader/provider/block.go @@ -103,13 +103,13 @@ func (bp *blockProvider) RunBackup( cbtParam CBTParam, volMode uploader.PersistentVolumeMode, uploaderCfg map[string]string, - updater uploader.ProgressUpdater) (string, bool, int64, int64, error) { + updater uploader.ProgressUpdater) (string, bool, int64, int64, int64, error) { if updater == nil { - return "", false, 0, 0, errors.New("backup progress updater is invalid") + return "", false, 0, 0, 0, errors.New("backup progress updater is invalid") } if path == "" { - return "", false, 0, 0, errors.New("path is empty") + return "", false, 0, 0, 0, errors.New("path is empty") } log := bp.log.WithFields(logrus.Fields{ @@ -140,23 +140,23 @@ func (bp *blockProvider) RunBackup( // equality check never matches and cancellation gets reported as a failure. if errors.Is(err, block.ErrCanceled) { log.Warn("Block backup is canceled") - return snapshotInfo.ID, false, snapshotInfo.Size, snapshotInfo.IncrementalSize, ErrorCanceled + return snapshotInfo.ID, false, snapshotInfo.SnapshotSize, snapshotInfo.IncrementalSize, snapshotInfo.SourceSize, ErrorCanceled } if err != nil { - return snapshotInfo.ID, false, snapshotInfo.Size, snapshotInfo.IncrementalSize, errors.Wrapf(err, "Failed to run block backup") + return snapshotInfo.ID, false, snapshotInfo.SnapshotSize, snapshotInfo.IncrementalSize, snapshotInfo.SourceSize, errors.Wrapf(err, "Failed to run block backup") } updater.UpdateProgress( &uploader.Progress{ - TotalBytes: snapshotInfo.Size, - BytesDone: snapshotInfo.Size, + TotalBytes: snapshotInfo.SnapshotSize, + BytesDone: snapshotInfo.SnapshotSize, }, ) - log.Infof("Block backup finished, snapshot ID %s, backup size %v, incremental size %v", snapshotInfo.ID, snapshotInfo.Size, snapshotInfo.IncrementalSize) + log.Infof("Block backup finished, snapshot ID %s, backup size %v, incremental size %v, source size %v", snapshotInfo.ID, snapshotInfo.SnapshotSize, snapshotInfo.IncrementalSize, snapshotInfo.SourceSize) - return snapshotInfo.ID, false, snapshotInfo.Size, snapshotInfo.IncrementalSize, nil + return snapshotInfo.ID, false, snapshotInfo.SnapshotSize, snapshotInfo.IncrementalSize, snapshotInfo.SourceSize, nil } func (bp *blockProvider) RunRestore( diff --git a/pkg/uploader/provider/kopia.go b/pkg/uploader/provider/kopia.go index 1cd1ecd45..ac35836f8 100644 --- a/pkg/uploader/provider/kopia.go +++ b/pkg/uploader/provider/kopia.go @@ -121,13 +121,13 @@ func (kp *kopiaProvider) RunBackup( volMode uploader.PersistentVolumeMode, uploaderCfg map[string]string, updater uploader.ProgressUpdater, -) (string, bool, int64, int64, error) { +) (string, bool, int64, int64, int64, error) { if updater == nil { - return "", false, 0, 0, errors.New("Need to initial backup progress updater first") + return "", false, 0, 0, 0, errors.New("Need to initial backup progress updater first") } if path == "" { - return "", false, 0, 0, errors.New("path is empty") + return "", false, 0, 0, 0, errors.New("path is empty") } log := kp.log.WithFields(logrus.Fields{ @@ -177,21 +177,21 @@ func (kp *kopiaProvider) RunBackup( if kpUploader.IsCanceled() { log.Warn("Kopia backup is canceled") - return snapshotID, false, 0, 0, ErrorCanceled + return snapshotID, false, 0, 0, 0, ErrorCanceled } - return snapshotID, false, 0, 0, errors.Wrapf(err, "Failed to run kopia backup") + return snapshotID, false, 0, 0, 0, errors.Wrapf(err, "Failed to run kopia backup") } // which ensure that the statistic data of TotalBytes equal to BytesDone when finished updater.UpdateProgress( &uploader.Progress{ - TotalBytes: snapshotInfo.Size, - BytesDone: snapshotInfo.Size, + TotalBytes: snapshotInfo.SnapshotSize, + BytesDone: snapshotInfo.SnapshotSize, }, ) - log.Debugf("Kopia backup finished, snapshot ID %s, backup size %d", snapshotInfo.ID, snapshotInfo.Size) - return snapshotInfo.ID, false, snapshotInfo.Size, progress.GetIncrementalSize(), nil + log.Debugf("Kopia backup finished, snapshot ID %s, backup size %d", snapshotInfo.ID, snapshotInfo.SnapshotSize) + return snapshotInfo.ID, false, snapshotInfo.SnapshotSize, progress.GetIncrementalSize(), snapshotInfo.SourceSize, nil } func (kp *kopiaProvider) GetPassword(param any) (string, error) { diff --git a/pkg/uploader/provider/provider.go b/pkg/uploader/provider/provider.go index 7f003989d..53a44a4fb 100644 --- a/pkg/uploader/provider/provider.go +++ b/pkg/uploader/provider/provider.go @@ -57,7 +57,7 @@ type Provider interface { cbtParam CBTParam, volMode uploader.PersistentVolumeMode, uploaderCfg map[string]string, - updater uploader.ProgressUpdater) (string, bool, int64, int64, error) + updater uploader.ProgressUpdater) (string, bool, int64, int64, int64, error) // RunRestore which will do restore for one specific volume with given snapshot id and return error // updater is used for updating backup progress which implement by third-party RunRestore( diff --git a/pkg/uploader/types.go b/pkg/uploader/types.go index 9c700193f..9efb62514 100644 --- a/pkg/uploader/types.go +++ b/pkg/uploader/types.go @@ -52,8 +52,9 @@ func ValidateUploaderType(t string) (string, error) { type SnapshotInfo struct { ID string - Size int64 + SnapshotSize int64 IncrementalSize int64 + SourceSize int64 } // Progress which defined two variables to record progress