2
2
mirror of https://github.com/octoleo/restic.git synced 2024-06-07 11:30:49 +00:00

archiver: remove unused fileInfo from progress callback

This commit is contained in:
Michael Eischer 2022-05-21 00:31:26 +02:00
parent dcb00fd2d1
commit 32f4997733
10 changed files with 45 additions and 52 deletions

View File

@ -647,7 +647,7 @@ func runBackup(opts BackupOptions, gopts GlobalOptions, term *termstatus.Termina
} }
errorHandler := func(item string, err error) error { errorHandler := func(item string, err error) error {
return progressReporter.Error(item, nil, err) return progressReporter.Error(item, err)
} }
messageHandler := func(msg string, args ...interface{}) { messageHandler := func(msg string, args ...interface{}) {
@ -690,9 +690,9 @@ func runBackup(opts BackupOptions, gopts GlobalOptions, term *termstatus.Termina
arch.Select = selectFilter arch.Select = selectFilter
arch.WithAtime = opts.WithAtime arch.WithAtime = opts.WithAtime
success := true success := true
arch.Error = func(item string, fi os.FileInfo, err error) error { arch.Error = func(item string, err error) error {
success = false success = false
return progressReporter.Error(item, fi, err) return progressReporter.Error(item, err)
} }
arch.CompleteItem = progressReporter.CompleteItem arch.CompleteItem = progressReporter.CompleteItem
arch.StartFile = progressReporter.StartFile arch.StartFile = progressReporter.StartFile

View File

@ -27,7 +27,7 @@ type SelectFunc func(item string, fi os.FileInfo) bool
// ErrorFunc is called when an error during archiving occurs. When nil is // ErrorFunc is called when an error during archiving occurs. When nil is
// returned, the archiver continues, otherwise it aborts and passes the error // returned, the archiver continues, otherwise it aborts and passes the error
// up the call stack. // up the call stack.
type ErrorFunc func(file string, fi os.FileInfo, err error) error type ErrorFunc func(file string, err error) error
// ItemStats collects some statistics about a particular file or directory. // ItemStats collects some statistics about a particular file or directory.
type ItemStats struct { type ItemStats struct {
@ -157,7 +157,7 @@ func New(repo restic.Repository, fs fs.FS, opts Options) *Archiver {
} }
// error calls arch.Error if it is set and the error is different from context.Canceled. // error calls arch.Error if it is set and the error is different from context.Canceled.
func (arch *Archiver) error(item string, fi os.FileInfo, err error) error { func (arch *Archiver) error(item string, err error) error {
if arch.Error == nil || err == nil { if arch.Error == nil || err == nil {
return err return err
} }
@ -166,7 +166,7 @@ func (arch *Archiver) error(item string, fi os.FileInfo, err error) error {
return err return err
} }
errf := arch.Error(item, fi, err) errf := arch.Error(item, err)
if err != errf { if err != errf {
debug.Log("item %v: error was filtered by handler, before: %q, after: %v", item, err, errf) debug.Log("item %v: error was filtered by handler, before: %q, after: %v", item, err, errf)
} }
@ -269,7 +269,7 @@ func (arch *Archiver) SaveDir(ctx context.Context, snPath string, fi os.FileInfo
// return error early if possible // return error early if possible
if err != nil { if err != nil {
err = arch.error(pathname, fi, err) err = arch.error(pathname, err)
if err == nil { if err == nil {
// ignore error // ignore error
continue continue
@ -294,9 +294,6 @@ func (arch *Archiver) SaveDir(ctx context.Context, snPath string, fi os.FileInfo
type FutureNode struct { type FutureNode struct {
snPath, target string snPath, target string
// kept to call the error callback function
fi os.FileInfo
node *restic.Node node *restic.Node
stats ItemStats stats ItemStats
err error err error
@ -375,7 +372,7 @@ func (arch *Archiver) Save(ctx context.Context, snPath, target string, previous
fi, err := arch.FS.Lstat(target) fi, err := arch.FS.Lstat(target)
if err != nil { if err != nil {
debug.Log("lstat() for %v returned error: %v", target, err) debug.Log("lstat() for %v returned error: %v", target, err)
err = arch.error(abstarget, fi, err) err = arch.error(abstarget, err)
if err != nil { if err != nil {
return FutureNode{}, false, errors.Wrap(err, "Lstat") return FutureNode{}, false, errors.Wrap(err, "Lstat")
} }
@ -412,7 +409,7 @@ func (arch *Archiver) Save(ctx context.Context, snPath, target string, previous
debug.Log("%v hasn't changed, but contents are missing!", target) debug.Log("%v hasn't changed, but contents are missing!", target)
// There are contents missing - inform user! // There are contents missing - inform user!
err := errors.Errorf("parts of %v not found in the repository index; storing the file again", target) err := errors.Errorf("parts of %v not found in the repository index; storing the file again", target)
err = arch.error(abstarget, fi, err) err = arch.error(abstarget, err)
if err != nil { if err != nil {
return FutureNode{}, false, err return FutureNode{}, false, err
} }
@ -423,7 +420,7 @@ func (arch *Archiver) Save(ctx context.Context, snPath, target string, previous
file, err := arch.FS.OpenFile(target, fs.O_RDONLY|fs.O_NOFOLLOW, 0) file, err := arch.FS.OpenFile(target, fs.O_RDONLY|fs.O_NOFOLLOW, 0)
if err != nil { if err != nil {
debug.Log("Openfile() for %v returned error: %v", target, err) debug.Log("Openfile() for %v returned error: %v", target, err)
err = arch.error(abstarget, fi, err) err = arch.error(abstarget, err)
if err != nil { if err != nil {
return FutureNode{}, false, errors.Wrap(err, "Lstat") return FutureNode{}, false, errors.Wrap(err, "Lstat")
} }
@ -434,7 +431,7 @@ func (arch *Archiver) Save(ctx context.Context, snPath, target string, previous
if err != nil { if err != nil {
debug.Log("stat() on opened file %v returned error: %v", target, err) debug.Log("stat() on opened file %v returned error: %v", target, err)
_ = file.Close() _ = file.Close()
err = arch.error(abstarget, fi, err) err = arch.error(abstarget, err)
if err != nil { if err != nil {
return FutureNode{}, false, errors.Wrap(err, "Lstat") return FutureNode{}, false, errors.Wrap(err, "Lstat")
} }
@ -445,7 +442,7 @@ func (arch *Archiver) Save(ctx context.Context, snPath, target string, previous
if !fs.IsRegularFile(fi) { if !fs.IsRegularFile(fi) {
err = errors.Errorf("file %v changed type, refusing to archive") err = errors.Errorf("file %v changed type, refusing to archive")
_ = file.Close() _ = file.Close()
err = arch.error(abstarget, fi, err) err = arch.error(abstarget, err)
if err != nil { if err != nil {
return FutureNode{}, false, err return FutureNode{}, false, err
} }
@ -467,7 +464,7 @@ func (arch *Archiver) Save(ctx context.Context, snPath, target string, previous
start := time.Now() start := time.Now()
oldSubtree, err := arch.loadSubtree(ctx, previous) oldSubtree, err := arch.loadSubtree(ctx, previous)
if err != nil { if err != nil {
err = arch.error(abstarget, fi, err) err = arch.error(abstarget, err)
} }
if err != nil { if err != nil {
return FutureNode{}, false, err return FutureNode{}, false, err
@ -576,7 +573,7 @@ func (arch *Archiver) SaveTree(ctx context.Context, snPath string, atree *Tree,
fn, excluded, err := arch.Save(ctx, join(snPath, name), subatree.Path, previous.Find(name)) fn, excluded, err := arch.Save(ctx, join(snPath, name), subatree.Path, previous.Find(name))
if err != nil { if err != nil {
err = arch.error(subatree.Path, fn.fi, err) err = arch.error(subatree.Path, err)
if err == nil { if err == nil {
// ignore error // ignore error
continue continue
@ -600,7 +597,7 @@ func (arch *Archiver) SaveTree(ctx context.Context, snPath string, atree *Tree,
oldNode := previous.Find(name) oldNode := previous.Find(name)
oldSubtree, err := arch.loadSubtree(ctx, oldNode) oldSubtree, err := arch.loadSubtree(ctx, oldNode)
if err != nil { if err != nil {
err = arch.error(join(snPath, name), nil, err) err = arch.error(join(snPath, name), err)
} }
if err != nil { if err != nil {
return nil, err return nil, err
@ -654,7 +651,7 @@ func (arch *Archiver) SaveTree(ctx context.Context, snPath string, atree *Tree,
// return the error, or ignore it // return the error, or ignore it
if fn.err != nil { if fn.err != nil {
fn.err = arch.error(fn.target, fn.fi, fn.err) fn.err = arch.error(fn.target, fn.err)
if fn.err == nil { if fn.err == nil {
// ignore error // ignore error
continue continue
@ -762,7 +759,7 @@ func (arch *Archiver) loadParentTree(ctx context.Context, snapshotID restic.ID)
tree, err := restic.LoadTree(ctx, arch.Repo, *sn.Tree) tree, err := restic.LoadTree(ctx, arch.Repo, *sn.Tree)
if err != nil { if err != nil {
debug.Log("unable to load tree %v: %v", *sn.Tree, err) debug.Log("unable to load tree %v: %v", *sn.Tree, err)
_ = arch.error("/", nil, arch.wrapLoadTreeError(*sn.Tree, err)) _ = arch.error("/", arch.wrapLoadTreeError(*sn.Tree, err))
return nil return nil
} }
return tree return tree

View File

@ -47,7 +47,7 @@ func saveFile(t testing.TB, repo restic.Repository, filename string, filesystem
arch := New(repo, filesystem, Options{}) arch := New(repo, filesystem, Options{})
arch.runWorkers(ctx, wg) arch.runWorkers(ctx, wg)
arch.Error = func(item string, fi os.FileInfo, err error) error { arch.Error = func(item string, err error) error {
t.Errorf("archiver error for %v: %v", item, err) t.Errorf("archiver error for %v: %v", item, err)
return err return err
} }
@ -217,7 +217,7 @@ func TestArchiverSave(t *testing.T) {
repo.StartPackUploader(ctx, wg) repo.StartPackUploader(ctx, wg)
arch := New(repo, fs.Track{FS: fs.Local{}}, Options{}) arch := New(repo, fs.Track{FS: fs.Local{}}, Options{})
arch.Error = func(item string, fi os.FileInfo, err error) error { arch.Error = func(item string, err error) error {
t.Errorf("archiver error for %v: %v", item, err) t.Errorf("archiver error for %v: %v", item, err)
return err return err
} }
@ -295,7 +295,7 @@ func TestArchiverSaveReaderFS(t *testing.T) {
} }
arch := New(repo, readerFs, Options{}) arch := New(repo, readerFs, Options{})
arch.Error = func(item string, fi os.FileInfo, err error) error { arch.Error = func(item string, err error) error {
t.Errorf("archiver error for %v: %v", item, err) t.Errorf("archiver error for %v: %v", item, err)
return err return err
} }
@ -1723,7 +1723,7 @@ func TestArchiverParent(t *testing.T) {
func TestArchiverErrorReporting(t *testing.T) { func TestArchiverErrorReporting(t *testing.T) {
ignoreErrorForBasename := func(basename string) ErrorFunc { ignoreErrorForBasename := func(basename string) ErrorFunc {
return func(item string, fi os.FileInfo, err error) error { return func(item string, err error) error {
if filepath.Base(item) == "targetfile" { if filepath.Base(item) == "targetfile" {
t.Logf("ignoring error for targetfile: %v", err) t.Logf("ignoring error for targetfile: %v", err)
return nil return nil
@ -2248,7 +2248,7 @@ func TestRacyFileSwap(t *testing.T) {
repo.StartPackUploader(ctx, wg) repo.StartPackUploader(ctx, wg)
arch := New(repo, fs.Track{FS: statfs}, Options{}) arch := New(repo, fs.Track{FS: statfs}, Options{})
arch.Error = func(item string, fi os.FileInfo, err error) error { arch.Error = func(item string, err error) error {
t.Logf("archiver error as expected for %v: %v", item, err) t.Logf("archiver error as expected for %v: %v", item, err)
return err return err
} }

View File

@ -27,7 +27,7 @@ func NewScanner(fs fs.FS) *Scanner {
FS: fs, FS: fs,
SelectByName: func(item string) bool { return true }, SelectByName: func(item string) bool { return true },
Select: func(item string, fi os.FileInfo) bool { return true }, Select: func(item string, fi os.FileInfo) bool { return true },
Error: func(item string, fi os.FileInfo, err error) error { return err }, Error: func(item string, err error) error { return err },
Result: func(item string, s ScanStats) {}, Result: func(item string, s ScanStats) {},
} }
} }
@ -111,7 +111,7 @@ func (s *Scanner) scan(ctx context.Context, stats ScanStats, target string) (Sca
// get file information // get file information
fi, err := s.FS.Lstat(target) fi, err := s.FS.Lstat(target)
if err != nil { if err != nil {
return stats, s.Error(target, fi, err) return stats, s.Error(target, err)
} }
// run remaining select functions that require file information // run remaining select functions that require file information
@ -126,7 +126,7 @@ func (s *Scanner) scan(ctx context.Context, stats ScanStats, target string) (Sca
case fi.Mode().IsDir(): case fi.Mode().IsDir():
names, err := readdirnames(s.FS, target, fs.O_NOFOLLOW) names, err := readdirnames(s.FS, target, fs.O_NOFOLLOW)
if err != nil { if err != nil {
return stats, s.Error(target, fi, err) return stats, s.Error(target, err)
} }
sort.Strings(names) sort.Strings(names)

View File

@ -133,7 +133,7 @@ func TestScannerError(t *testing.T) {
src TestDir src TestDir
result ScanStats result ScanStats
selFn SelectFunc selFn SelectFunc
errFn func(t testing.TB, item string, fi os.FileInfo, err error) error errFn func(t testing.TB, item string, err error) error
resFn func(t testing.TB, item string, s ScanStats) resFn func(t testing.TB, item string, s ScanStats)
prepare func(t testing.TB) prepare func(t testing.TB)
}{ }{
@ -173,7 +173,7 @@ func TestScannerError(t *testing.T) {
t.Fatal(err) t.Fatal(err)
} }
}, },
errFn: func(t testing.TB, item string, fi os.FileInfo, err error) error { errFn: func(t testing.TB, item string, err error) error {
if item == filepath.FromSlash("work/subdir") { if item == filepath.FromSlash("work/subdir") {
return nil return nil
} }
@ -198,7 +198,7 @@ func TestScannerError(t *testing.T) {
} }
} }
}, },
errFn: func(t testing.TB, item string, fi os.FileInfo, err error) error { errFn: func(t testing.TB, item string, err error) error {
if item == "foo" { if item == "foo" {
t.Logf("ignoring error for %v: %v", item, err) t.Logf("ignoring error for %v: %v", item, err)
return nil return nil
@ -257,13 +257,13 @@ func TestScannerError(t *testing.T) {
} }
} }
if test.errFn != nil { if test.errFn != nil {
sc.Error = func(item string, fi os.FileInfo, err error) error { sc.Error = func(item string, err error) error {
p, relErr := filepath.Rel(cur, item) p, relErr := filepath.Rel(cur, item)
if relErr != nil { if relErr != nil {
panic(relErr) panic(relErr)
} }
return test.errFn(t, p, fi, err) return test.errFn(t, p, err)
} }
} }

View File

@ -114,7 +114,7 @@ func (s *TreeSaver) save(ctx context.Context, snPath string, node *restic.Node,
// return the error if it wasn't ignored // return the error if it wasn't ignored
if fn.err != nil { if fn.err != nil {
debug.Log("err for %v: %v", fn.snPath, fn.err) debug.Log("err for %v: %v", fn.snPath, fn.err)
fn.err = s.errFn(fn.target, fn.fi, fn.err) fn.err = s.errFn(fn.target, fn.err)
if fn.err == nil { if fn.err == nil {
// ignore error // ignore error
continue continue

View File

@ -3,7 +3,6 @@ package archiver
import ( import (
"context" "context"
"fmt" "fmt"
"os"
"runtime" "runtime"
"sync/atomic" "sync/atomic"
"testing" "testing"
@ -23,7 +22,7 @@ func TestTreeSaver(t *testing.T) {
return restic.NewRandomID(), ItemStats{TreeBlobs: 1, TreeSize: 123}, nil return restic.NewRandomID(), ItemStats{TreeBlobs: 1, TreeSize: 123}, nil
} }
errFn := func(snPath string, fi os.FileInfo, err error) error { errFn := func(snPath string, err error) error {
return nil return nil
} }
@ -83,7 +82,7 @@ func TestTreeSaverError(t *testing.T) {
return restic.NewRandomID(), ItemStats{TreeBlobs: 1, TreeSize: 123}, nil return restic.NewRandomID(), ItemStats{TreeBlobs: 1, TreeSize: 123}, nil
} }
errFn := func(snPath string, fi os.FileInfo, err error) error { errFn := func(snPath string, err error) error {
t.Logf("ignoring error %v\n", err) t.Logf("ignoring error %v\n", err)
return nil return nil
} }

View File

@ -3,7 +3,6 @@ package backup
import ( import (
"bytes" "bytes"
"encoding/json" "encoding/json"
"os"
"sort" "sort"
"time" "time"
@ -79,7 +78,7 @@ func (b *JSONProgress) Update(total, processed Counter, errors uint, currentFile
// ScannerError is the error callback function for the scanner, it prints the // ScannerError is the error callback function for the scanner, it prints the
// error in verbose mode and returns nil. // error in verbose mode and returns nil.
func (b *JSONProgress) ScannerError(item string, fi os.FileInfo, err error) error { func (b *JSONProgress) ScannerError(item string, err error) error {
b.error(errorUpdate{ b.error(errorUpdate{
MessageType: "error", MessageType: "error",
Error: err, Error: err,
@ -90,7 +89,7 @@ func (b *JSONProgress) ScannerError(item string, fi os.FileInfo, err error) erro
} }
// Error is the error callback function for the archiver, it prints the error and returns nil. // Error is the error callback function for the archiver, it prints the error and returns nil.
func (b *JSONProgress) Error(item string, fi os.FileInfo, err error) error { func (b *JSONProgress) Error(item string, err error) error {
b.error(errorUpdate{ b.error(errorUpdate{
MessageType: "error", MessageType: "error",
Error: err, Error: err,

View File

@ -3,7 +3,6 @@ package backup
import ( import (
"context" "context"
"io" "io"
"os"
"sync" "sync"
"time" "time"
@ -14,8 +13,8 @@ import (
type ProgressPrinter interface { type ProgressPrinter interface {
Update(total, processed Counter, errors uint, currentFiles map[string]struct{}, start time.Time, secs uint64) Update(total, processed Counter, errors uint, currentFiles map[string]struct{}, start time.Time, secs uint64)
Error(item string, fi os.FileInfo, err error) error Error(item string, err error) error
ScannerError(item string, fi os.FileInfo, err error) error ScannerError(item string, err error) error
CompleteItem(messageType string, item string, previous, current *restic.Node, s archiver.ItemStats, d time.Duration) CompleteItem(messageType string, item string, previous, current *restic.Node, s archiver.ItemStats, d time.Duration)
ReportTotal(item string, start time.Time, s archiver.ScanStats) ReportTotal(item string, start time.Time, s archiver.ScanStats)
Finish(snapshotID restic.ID, start time.Time, summary *Summary, dryRun bool) Finish(snapshotID restic.ID, start time.Time, summary *Summary, dryRun bool)
@ -44,11 +43,11 @@ type ProgressReporter interface {
CompleteItem(item string, previous, current *restic.Node, s archiver.ItemStats, d time.Duration) CompleteItem(item string, previous, current *restic.Node, s archiver.ItemStats, d time.Duration)
StartFile(filename string) StartFile(filename string)
CompleteBlob(filename string, bytes uint64) CompleteBlob(filename string, bytes uint64)
ScannerError(item string, fi os.FileInfo, err error) error ScannerError(item string, err error) error
ReportTotal(item string, s archiver.ScanStats) ReportTotal(item string, s archiver.ScanStats)
SetMinUpdatePause(d time.Duration) SetMinUpdatePause(d time.Duration)
Run(ctx context.Context) error Run(ctx context.Context) error
Error(item string, fi os.FileInfo, err error) error Error(item string, err error) error
Finish(snapshotID restic.ID) Finish(snapshotID restic.ID)
} }
@ -173,13 +172,13 @@ func (p *Progress) Run(ctx context.Context) error {
// ScannerError is the error callback function for the scanner, it prints the // ScannerError is the error callback function for the scanner, it prints the
// error in verbose mode and returns nil. // error in verbose mode and returns nil.
func (p *Progress) ScannerError(item string, fi os.FileInfo, err error) error { func (p *Progress) ScannerError(item string, err error) error {
return p.printer.ScannerError(item, fi, err) return p.printer.ScannerError(item, err)
} }
// Error is the error callback function for the archiver, it prints the error and returns nil. // Error is the error callback function for the archiver, it prints the error and returns nil.
func (p *Progress) Error(item string, fi os.FileInfo, err error) error { func (p *Progress) Error(item string, err error) error {
cbErr := p.printer.Error(item, fi, err) cbErr := p.printer.Error(item, err)
select { select {
case p.errCh <- struct{}{}: case p.errCh <- struct{}{}:

View File

@ -2,7 +2,6 @@ package backup
import ( import (
"fmt" "fmt"
"os"
"sort" "sort"
"time" "time"
@ -75,13 +74,13 @@ func (b *TextProgress) Update(total, processed Counter, errors uint, currentFile
// ScannerError is the error callback function for the scanner, it prints the // ScannerError is the error callback function for the scanner, it prints the
// error in verbose mode and returns nil. // error in verbose mode and returns nil.
func (b *TextProgress) ScannerError(item string, fi os.FileInfo, err error) error { func (b *TextProgress) ScannerError(item string, err error) error {
b.V("scan: %v\n", err) b.V("scan: %v\n", err)
return nil return nil
} }
// Error is the error callback function for the archiver, it prints the error and returns nil. // Error is the error callback function for the archiver, it prints the error and returns nil.
func (b *TextProgress) Error(item string, fi os.FileInfo, err error) error { func (b *TextProgress) Error(item string, err error) error {
b.E("error: %v\n", err) b.E("error: %v\n", err)
return nil return nil
} }