forked from TrueCloudLab/restic
Merge pull request #814 from restic/fix-archiver
Correct archiver behavior in case of errors
This commit is contained in:
commit
2c81bc35dc
2 changed files with 13 additions and 12 deletions
|
@ -142,7 +142,7 @@ func (arch *Archiver) reloadFileIfChanged(node *restic.Node, file fs.File) (*res
|
||||||
node, err = restic.NodeFromFileInfo(node.Path, fi)
|
node, err = restic.NodeFromFileInfo(node.Path, fi)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
debug.Log("restic.NodeFromFileInfo returned error for %v: %v", node.Path, err)
|
debug.Log("restic.NodeFromFileInfo returned error for %v: %v", node.Path, err)
|
||||||
return nil, err
|
arch.Warn(node.Path, fi, err)
|
||||||
}
|
}
|
||||||
|
|
||||||
return node, nil
|
return node, nil
|
||||||
|
@ -275,11 +275,8 @@ func (arch *Archiver) fileWorker(wg *sync.WaitGroup, p *restic.Progress, done <-
|
||||||
|
|
||||||
node, err := restic.NodeFromFileInfo(e.Fullpath(), e.Info())
|
node, err := restic.NodeFromFileInfo(e.Fullpath(), e.Info())
|
||||||
if err != nil {
|
if err != nil {
|
||||||
// TODO: integrate error reporting
|
|
||||||
debug.Log("restic.NodeFromFileInfo returned error for %v: %v", node.Path, err)
|
debug.Log("restic.NodeFromFileInfo returned error for %v: %v", node.Path, err)
|
||||||
e.Result() <- nil
|
arch.Warn(e.Fullpath(), e.Info(), err)
|
||||||
p.Report(restic.Stat{Errors: 1})
|
|
||||||
continue
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// try to use old node, if present
|
// try to use old node, if present
|
||||||
|
@ -307,11 +304,11 @@ func (arch *Archiver) fileWorker(wg *sync.WaitGroup, p *restic.Progress, done <-
|
||||||
|
|
||||||
// otherwise read file normally
|
// otherwise read file normally
|
||||||
if node.Type == "file" && len(node.Content) == 0 {
|
if node.Type == "file" && len(node.Content) == 0 {
|
||||||
debug.Log(" read and save %v, content: %v", e.Path(), node.Content)
|
debug.Log(" read and save %v", e.Path())
|
||||||
node, err = arch.SaveFile(p, node)
|
node, err = arch.SaveFile(p, node)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
// TODO: integrate error reporting
|
|
||||||
fmt.Fprintf(os.Stderr, "error for %v: %v\n", node.Path, err)
|
fmt.Fprintf(os.Stderr, "error for %v: %v\n", node.Path, err)
|
||||||
|
arch.Warn(e.Path(), nil, err)
|
||||||
// ignore this file
|
// ignore this file
|
||||||
e.Result() <- nil
|
e.Result() <- nil
|
||||||
p.Report(restic.Stat{Errors: 1})
|
p.Report(restic.Stat{Errors: 1})
|
||||||
|
@ -371,15 +368,20 @@ func (arch *Archiver) dirWorker(wg *sync.WaitGroup, p *restic.Progress, done <-c
|
||||||
|
|
||||||
// else insert node
|
// else insert node
|
||||||
node := res.(*restic.Node)
|
node := res.(*restic.Node)
|
||||||
tree.Insert(node)
|
|
||||||
|
|
||||||
if node.Type == "dir" {
|
if node.Type == "dir" {
|
||||||
debug.Log("got tree node for %s: %v", node.Path, node.Subtree)
|
debug.Log("got tree node for %s: %v", node.Path, node.Subtree)
|
||||||
|
|
||||||
|
if node.Subtree == nil {
|
||||||
|
debug.Log("subtree is nil for node %v", node.Path)
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
if node.Subtree.IsNull() {
|
if node.Subtree.IsNull() {
|
||||||
panic("invalid null subtree restic.ID")
|
panic("invalid null subtree restic.ID")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
tree.Insert(node)
|
||||||
}
|
}
|
||||||
|
|
||||||
node := &restic.Node{}
|
node := &restic.Node{}
|
||||||
|
@ -387,9 +389,7 @@ func (arch *Archiver) dirWorker(wg *sync.WaitGroup, p *restic.Progress, done <-c
|
||||||
if dir.Path() != "" && dir.Info() != nil {
|
if dir.Path() != "" && dir.Info() != nil {
|
||||||
n, err := restic.NodeFromFileInfo(dir.Fullpath(), dir.Info())
|
n, err := restic.NodeFromFileInfo(dir.Fullpath(), dir.Info())
|
||||||
if err != nil {
|
if err != nil {
|
||||||
n.Error = err.Error()
|
arch.Warn(dir.Path(), dir.Info(), err)
|
||||||
dir.Result() <- n
|
|
||||||
continue
|
|
||||||
}
|
}
|
||||||
node = n
|
node = n
|
||||||
}
|
}
|
||||||
|
|
|
@ -63,7 +63,8 @@ func (node Node) String() string {
|
||||||
return fmt.Sprintf("<Node(%s) %s>", node.Type, node.Name)
|
return fmt.Sprintf("<Node(%s) %s>", node.Type, node.Name)
|
||||||
}
|
}
|
||||||
|
|
||||||
// NodeFromFileInfo returns a new node from the given path and FileInfo.
|
// NodeFromFileInfo returns a new node from the given path and FileInfo. It
|
||||||
|
// returns the first error that is encountered, together with a node.
|
||||||
func NodeFromFileInfo(path string, fi os.FileInfo) (*Node, error) {
|
func NodeFromFileInfo(path string, fi os.FileInfo) (*Node, error) {
|
||||||
mask := os.ModePerm | os.ModeType | os.ModeSetuid | os.ModeSetgid | os.ModeSticky
|
mask := os.ModePerm | os.ModeType | os.ModeSetuid | os.ModeSetgid | os.ModeSticky
|
||||||
node := &Node{
|
node := &Node{
|
||||||
|
|
Loading…
Reference in a new issue