From 00f1626f7aaf318f4b5fb436e70889abbd05363b Mon Sep 17 00:00:00 2001 From: Lyndon-Li Date: Fri, 24 Jul 2026 13:47:39 +0800 Subject: [PATCH] block uploader restore implementation Signed-off-by: Lyndon-Li --- changelogs/unreleased/10071-Lyndon-Li | 1 + pkg/uploader/block/uploader.go | 8 ++--- pkg/uploader/block/uploader_test.go | 42 +++++++++++++-------------- 3 files changed, 26 insertions(+), 25 deletions(-) create mode 100644 changelogs/unreleased/10071-Lyndon-Li diff --git a/changelogs/unreleased/10071-Lyndon-Li b/changelogs/unreleased/10071-Lyndon-Li new file mode 100644 index 000000000..dd3454a4d --- /dev/null +++ b/changelogs/unreleased/10071-Lyndon-Li @@ -0,0 +1 @@ +Fix issue #9828, add implementation for block uploader restore \ No newline at end of file diff --git a/pkg/uploader/block/uploader.go b/pkg/uploader/block/uploader.go index 7717a7e7e..0378f4f5b 100644 --- a/pkg/uploader/block/uploader.go +++ b/pkg/uploader/block/uploader.go @@ -151,7 +151,7 @@ func (blkup *blockUploader) Restore(snapshot udmrepo.Snapshot, dest destInfo, bi meta, err := blkup.repoWriter.ReadMetadata(blkup.ctx, snapshot.RootObject.ID) if err != nil { - return 0, errors.Wrapf(err, "error readding snapshot metadata for %s", snapshot.Description) + return 0, errors.Wrapf(err, "error reading snapshot metadata for %s", snapshot.Description) } if len(meta.SubObjects) != 1 { @@ -376,7 +376,7 @@ func (blkup *blockUploader) restoreData(reader io.ReadSeeker, dest *os.File, bit offset, valid := bitmap.Next() var buffer []byte - var nextPos uint64 = uint64(0) + var nextPos = uint64(0) for valid { select { case <-blkup.ctx.Done(): @@ -513,13 +513,13 @@ func (blkup *blockUploader) restoreData(reader io.ReadSeeker, dest *os.File, bit return written, nil } -func (bu *blockUploader) flushZeroBlocks(dest *os.File, start int64, length int64, zeroBlock []byte, destPath string) error { +func (blkup *blockUploader) flushZeroBlocks(dest *os.File, start int64, length int64, zeroBlock []byte, destPath string) error { err := blkZeroOut(dest, start, length) if err == nil { return nil } - bu.log.WithError(err).Warnf("Failed to call zero out from dev %s, start %v, length %v. Fallback to conservative way", destPath, start, length) + blkup.log.WithError(err).Warnf("Failed to call zero out from dev %s, start %v, length %v. Fallback to conservative way", destPath, start, length) var written int64 for written < length { diff --git a/pkg/uploader/block/uploader_test.go b/pkg/uploader/block/uploader_test.go index 69b5efcb5..bb7c79c5a 100644 --- a/pkg/uploader/block/uploader_test.go +++ b/pkg/uploader/block/uploader_test.go @@ -506,7 +506,7 @@ func TestGetSourceSize(t *testing.T) { if tc.expectErr { assert.Error(t, err) } else { - assert.NoError(t, err) + require.NoError(t, err) assert.Equal(t, tc.expected, size) } }) @@ -515,22 +515,22 @@ func TestGetSourceSize(t *testing.T) { func TestFlushZeroBlocks(t *testing.T) { t.Run("success via write fallback", func(t *testing.T) { - f, err := os.CreateTemp("", "zerotest-*") + f, err := os.CreateTemp(t.TempDir(), "zerotest-*") require.NoError(t, err) defer os.Remove(f.Name()) defer f.Close() require.NoError(t, f.Truncate(2048)) - bu := &blockUploader{ + blkup := &blockUploader{ log: logrus.New(), } - bu.log.(*logrus.Logger).Out = io.Discard + blkup.log.(*logrus.Logger).Out = io.Discard zeroBlock := make([]byte, 1024) - err = bu.flushZeroBlocks(f, 0, 2048, zeroBlock, f.Name()) + err = blkup.flushZeroBlocks(f, 0, 2048, zeroBlock, f.Name()) - assert.NoError(t, err) + require.NoError(t, err) data, err := os.ReadFile(f.Name()) require.NoError(t, err) @@ -555,13 +555,13 @@ func TestRestoreData(t *testing.T) { ctx := context.Background() progress := &mockProgressUpdater{} progress.On("UpdateProgress", mock.Anything).Return() - bu := &blockUploader{ + blkup := &blockUploader{ ctx: ctx, progress: progress, log: logrus.New(), } - f, err := os.CreateTemp("", "restoretest-*") + f, err := os.CreateTemp(t.TempDir(), "restoretest-*") require.NoError(t, err) defer os.Remove(f.Name()) defer f.Close() @@ -577,8 +577,8 @@ func TestRestoreData(t *testing.T) { iterMock.On("Next").Return(uint64(0), true).Once() iterMock.On("Next").Return(uint64(0), false) - written, err := bu.restoreData(reader, f, iterMock, 1048576, f.Name()) - assert.NoError(t, err) + written, err := blkup.restoreData(reader, f, iterMock, 1048576, f.Name()) + require.NoError(t, err) assert.Equal(t, int64(1048576), written) f.Seek(0, 0) @@ -589,12 +589,12 @@ func TestRestoreData(t *testing.T) { t.Run("read err", func(t *testing.T) { ctx := context.Background() - bu := &blockUploader{ + blkup := &blockUploader{ ctx: ctx, log: logrus.New(), } - f, err := os.CreateTemp("", "restoretest-*") + f, err := os.CreateTemp(t.TempDir(), "restoretest-*") require.NoError(t, err) defer os.Remove(f.Name()) defer f.Close() @@ -606,8 +606,8 @@ func TestRestoreData(t *testing.T) { iterMock.On("Next").Return(uint64(0), true).Once() iterMock.On("Next").Return(uint64(0), false) - _, err = bu.restoreData(reader, f, iterMock, 1048576, f.Name()) - assert.Error(t, err) + _, err = blkup.restoreData(reader, f, iterMock, 1048576, f.Name()) + require.Error(t, err) assert.Contains(t, err.Error(), "read error") }) } @@ -616,13 +616,13 @@ func TestBlockUploaderRestore(t *testing.T) { t.Run("missing metadata", func(t *testing.T) { ctx := context.Background() repoWriter := udmrepomocks.NewBackupRepo(t) - bu := NewUploader(ctx, repoWriter, nil, logrus.New()) + blkup := NewUploader(ctx, repoWriter, nil, logrus.New()) repoWriter.On("ReadMetadata", mock.Anything, udmrepo.ID("root-id")).Return(nil, errors.New("meta not found")) iterMock := cbtmocks.NewIterator(t) - _, err := bu.Restore(udmrepo.Snapshot{RootObject: udmrepo.ObjectMetadata{ID: "root-id"}}, destInfo{}, iterMock, nil) - assert.Error(t, err) + _, err := blkup.Restore(udmrepo.Snapshot{RootObject: udmrepo.ObjectMetadata{ID: "root-id"}}, destInfo{}, iterMock, nil) + require.Error(t, err) assert.Contains(t, err.Error(), "meta not found") }) @@ -632,9 +632,9 @@ func TestBlockUploaderRestore(t *testing.T) { progress := &mockProgressUpdater{} progress.On("UpdateProgress", mock.Anything).Return() - bu := NewUploader(ctx, repoWriter, progress, logrus.New()) + blkup := NewUploader(ctx, repoWriter, progress, logrus.New()) - f, err := os.CreateTemp("", "restoretest-*") + f, err := os.CreateTemp(t.TempDir(), "restoretest-*") require.NoError(t, err) defer os.Remove(f.Name()) defer f.Close() @@ -682,8 +682,8 @@ func TestBlockUploaderRestore(t *testing.T) { iterMock.On("Next").Return(uint64(0), true).Once() iterMock.On("Next").Return(uint64(0), false) - written, err := bu.Restore(snap, dest, iterMock, nil) - assert.NoError(t, err) + written, err := blkup.Restore(snap, dest, iterMock, nil) + require.NoError(t, err) assert.Equal(t, int64(1048576), written) }) }