mirror of
https://github.com/restic/restic.git
synced 2025-08-20 07:17:31 +00:00
restorer: Optimize empty file restore
don't create fileInfo structs for empty files. this saves memory. this also avoids extra serial scan of all fileInfo, which should make restore faster and more consistent. Signed-off-by: Igor Fedorenko <igor@ifedorenko.com>
This commit is contained in:

committed by
Alexander Neumann

parent
c2bcb764cd
commit
bda8d7722e
61
internal/restorer/restorer_unix_test.go
Normal file
61
internal/restorer/restorer_unix_test.go
Normal file
@@ -0,0 +1,61 @@
|
||||
//+build !windows
|
||||
|
||||
package restorer
|
||||
|
||||
import (
|
||||
"context"
|
||||
"os"
|
||||
"path/filepath"
|
||||
"syscall"
|
||||
"testing"
|
||||
|
||||
"github.com/restic/restic/internal/repository"
|
||||
"github.com/restic/restic/internal/restic"
|
||||
rtest "github.com/restic/restic/internal/test"
|
||||
)
|
||||
|
||||
func TestRestorerRestoreEmptyHardlinkedFileds(t *testing.T) {
|
||||
repo, cleanup := repository.TestRepository(t)
|
||||
defer cleanup()
|
||||
|
||||
_, id := saveSnapshot(t, repo, Snapshot{
|
||||
Nodes: map[string]Node{
|
||||
"dirtest": Dir{
|
||||
Nodes: map[string]Node{
|
||||
"file1": File{Links: 2, Inode: 1},
|
||||
"file2": File{Links: 2, Inode: 1},
|
||||
},
|
||||
},
|
||||
},
|
||||
})
|
||||
|
||||
res, err := NewRestorer(repo, id)
|
||||
rtest.OK(t, err)
|
||||
|
||||
res.SelectFilter = func(item string, dstpath string, node *restic.Node) (selectedForRestore bool, childMayBeSelected bool) {
|
||||
return true, true
|
||||
}
|
||||
|
||||
tempdir, cleanup := rtest.TempDir(t)
|
||||
defer cleanup()
|
||||
|
||||
ctx, cancel := context.WithCancel(context.Background())
|
||||
defer cancel()
|
||||
|
||||
err = res.RestoreTo(ctx, tempdir)
|
||||
rtest.OK(t, err)
|
||||
|
||||
f1, err := os.Stat(filepath.Join(tempdir, "dirtest/file1"))
|
||||
rtest.OK(t, err)
|
||||
rtest.Equals(t, int64(0), f1.Size())
|
||||
s1, ok1 := f1.Sys().(*syscall.Stat_t)
|
||||
|
||||
f2, err := os.Stat(filepath.Join(tempdir, "dirtest/file2"))
|
||||
rtest.OK(t, err)
|
||||
rtest.Equals(t, int64(0), f2.Size())
|
||||
s2, ok2 := f2.Sys().(*syscall.Stat_t)
|
||||
|
||||
if ok1 && ok2 {
|
||||
rtest.Equals(t, s1.Ino, s2.Ino)
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user