From 98b51357b0ba6e10fb12a997273d47342bf357d0 Mon Sep 17 00:00:00 2001 From: Ivan Shapovalov Date: Tue, 3 Dec 2024 21:32:18 +0400 Subject: [PATCH] restorer: HardlinkIndex: improve API, combine Has() and Value() --- internal/restorer/hardlinks_index.go | 6 ++++-- internal/restorer/hardlinks_index_test.go | 6 ++++-- internal/restorer/restorer.go | 4 ++-- 3 files changed, 10 insertions(+), 6 deletions(-) diff --git a/internal/restorer/hardlinks_index.go b/internal/restorer/hardlinks_index.go index d4db159b9..d4206e1f5 100644 --- a/internal/restorer/hardlinks_index.go +++ b/internal/restorer/hardlinks_index.go @@ -44,11 +44,13 @@ func (idx *HardlinkIndex[T]) Add(inode uint64, device uint64, value T) { } } -// Value looks up the associated data for a given inode. +// Value looks up the associated data for a given inode, and returns that data +// plus a flag indicating whether the inode exists in the index. func (idx *HardlinkIndex[T]) Value(inode uint64, device uint64) (T, bool) { idx.m.Lock() defer idx.m.Unlock() - return idx.Index[HardlinkKey{inode, device}] + v, ok := idx.Index[HardlinkKey{inode, device}] + return v, ok } // Remove removes an inode from the index. diff --git a/internal/restorer/hardlinks_index_test.go b/internal/restorer/hardlinks_index_test.go index 31ce938f9..ce918ca10 100644 --- a/internal/restorer/hardlinks_index_test.go +++ b/internal/restorer/hardlinks_index_test.go @@ -15,10 +15,12 @@ func TestHardLinks(t *testing.T) { idx.Add(1, 2, "inode1-file1-on-device2") idx.Add(2, 3, "inode2-file2-on-device3") - sresult := idx.Value(1, 2) + sresult, ok := idx.Value(1, 2) + rtest.Equals(t, ok, true) rtest.Equals(t, sresult, "inode1-file1-on-device2") - sresult = idx.Value(2, 3) + sresult, ok = idx.Value(2, 3) + rtest.Equals(t, ok, true) rtest.Equals(t, sresult, "inode2-file2-on-device3") bresult := idx.Has(1, 2) diff --git a/internal/restorer/restorer.go b/internal/restorer/restorer.go index 977ed42a6..683d98483 100644 --- a/internal/restorer/restorer.go +++ b/internal/restorer/restorer.go @@ -445,9 +445,9 @@ func (res *Restorer) RestoreTo(ctx context.Context, dst string) (uint64, error) return err } - if idx.Has(node.Inode, node.DeviceID) && idx.Value(node.Inode, node.DeviceID) != location { + if orig, hasOrig := idx.Value(node.Inode, node.DeviceID); hasOrig && orig != location { _, err := res.withOverwriteCheck(ctx, node, target, location, true, nil, func(_ bool, _ *fileState) error { - return res.restoreHardlinkAt(node, filerestorer.targetPath(idx.Value(node.Inode, node.DeviceID)), target, location) + return res.restoreHardlinkAt(node, filerestorer.targetPath(orig), target, location) }) return err }