forked from TrueCloudLab/restic
copy: Load snapshots before indexes
This commit is contained in:
parent
47243176fa
commit
7b9ae91e04
5 changed files with 29 additions and 3 deletions
|
@ -211,6 +211,10 @@ func runCheck(opts CheckOptions, gopts GlobalOptions, args []string) error {
|
||||||
}
|
}
|
||||||
|
|
||||||
chkr := checker.New(repo, opts.CheckUnused)
|
chkr := checker.New(repo, opts.CheckUnused)
|
||||||
|
err = chkr.LoadSnapshots(gopts.ctx)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
Verbosef("load indexes\n")
|
Verbosef("load indexes\n")
|
||||||
hints, errs := chkr.LoadIndex(gopts.ctx)
|
hints, errs := chkr.LoadIndex(gopts.ctx)
|
||||||
|
|
|
@ -11,6 +11,7 @@ import (
|
||||||
"sync"
|
"sync"
|
||||||
|
|
||||||
"github.com/minio/sha256-simd"
|
"github.com/minio/sha256-simd"
|
||||||
|
"github.com/restic/restic/internal/backend"
|
||||||
"github.com/restic/restic/internal/debug"
|
"github.com/restic/restic/internal/debug"
|
||||||
"github.com/restic/restic/internal/errors"
|
"github.com/restic/restic/internal/errors"
|
||||||
"github.com/restic/restic/internal/hashing"
|
"github.com/restic/restic/internal/hashing"
|
||||||
|
@ -35,6 +36,7 @@ type Checker struct {
|
||||||
trackUnused bool
|
trackUnused bool
|
||||||
|
|
||||||
masterIndex *repository.MasterIndex
|
masterIndex *repository.MasterIndex
|
||||||
|
snapshots restic.Lister
|
||||||
|
|
||||||
repo restic.Repository
|
repo restic.Repository
|
||||||
}
|
}
|
||||||
|
@ -75,6 +77,12 @@ func (err ErrOldIndexFormat) Error() string {
|
||||||
return fmt.Sprintf("index %v has old format", err.ID.Str())
|
return fmt.Sprintf("index %v has old format", err.ID.Str())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (c *Checker) LoadSnapshots(ctx context.Context) error {
|
||||||
|
var err error
|
||||||
|
c.snapshots, err = backend.MemorizeList(ctx, c.repo.Backend(), restic.SnapshotFile)
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
// LoadIndex loads all index files.
|
// LoadIndex loads all index files.
|
||||||
func (c *Checker) LoadIndex(ctx context.Context) (hints []error, errs []error) {
|
func (c *Checker) LoadIndex(ctx context.Context) (hints []error, errs []error) {
|
||||||
debug.Log("Start")
|
debug.Log("Start")
|
||||||
|
@ -278,8 +286,8 @@ func (c *Checker) checkTreeWorker(ctx context.Context, trees <-chan restic.TreeI
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func loadSnapshotTreeIDs(ctx context.Context, repo restic.Repository) (ids restic.IDs, errs []error) {
|
func loadSnapshotTreeIDs(ctx context.Context, lister restic.Lister, repo restic.Repository) (ids restic.IDs, errs []error) {
|
||||||
err := restic.ForAllSnapshots(ctx, repo.Backend(), repo, nil, func(id restic.ID, sn *restic.Snapshot, err error) error {
|
err := restic.ForAllSnapshots(ctx, lister, repo, nil, func(id restic.ID, sn *restic.Snapshot, err error) error {
|
||||||
if err != nil {
|
if err != nil {
|
||||||
errs = append(errs, err)
|
errs = append(errs, err)
|
||||||
return nil
|
return nil
|
||||||
|
@ -300,7 +308,7 @@ func loadSnapshotTreeIDs(ctx context.Context, repo restic.Repository) (ids resti
|
||||||
// subtrees are available in the index. errChan is closed after all trees have
|
// subtrees are available in the index. errChan is closed after all trees have
|
||||||
// been traversed.
|
// been traversed.
|
||||||
func (c *Checker) Structure(ctx context.Context, p *progress.Counter, errChan chan<- error) {
|
func (c *Checker) Structure(ctx context.Context, p *progress.Counter, errChan chan<- error) {
|
||||||
trees, errs := loadSnapshotTreeIDs(ctx, c.repo)
|
trees, errs := loadSnapshotTreeIDs(ctx, c.snapshots, c.repo)
|
||||||
p.SetMax(uint64(len(trees)))
|
p.SetMax(uint64(len(trees)))
|
||||||
debug.Log("need to check %d trees from snapshots, %d errs returned", len(trees), len(errs))
|
debug.Log("need to check %d trees from snapshots, %d errs returned", len(trees), len(errs))
|
||||||
|
|
||||||
|
|
|
@ -44,6 +44,10 @@ func checkPacks(chkr *checker.Checker) []error {
|
||||||
}
|
}
|
||||||
|
|
||||||
func checkStruct(chkr *checker.Checker) []error {
|
func checkStruct(chkr *checker.Checker) []error {
|
||||||
|
err := chkr.LoadSnapshots(context.TODO())
|
||||||
|
if err != nil {
|
||||||
|
return []error{err}
|
||||||
|
}
|
||||||
return collectErrors(context.TODO(), func(ctx context.Context, errChan chan<- error) {
|
return collectErrors(context.TODO(), func(ctx context.Context, errChan chan<- error) {
|
||||||
chkr.Structure(ctx, nil, errChan)
|
chkr.Structure(ctx, nil, errChan)
|
||||||
})
|
})
|
||||||
|
|
|
@ -20,6 +20,11 @@ func TestCheckRepo(t testing.TB, repo restic.Repository) {
|
||||||
t.Fatalf("errors loading index: %v", hints)
|
t.Fatalf("errors loading index: %v", hints)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
err := chkr.LoadSnapshots(context.TODO())
|
||||||
|
if err != nil {
|
||||||
|
t.Error(err)
|
||||||
|
}
|
||||||
|
|
||||||
// packs
|
// packs
|
||||||
errChan := make(chan error)
|
errChan := make(chan error)
|
||||||
go chkr.Packs(context.TODO(), errChan)
|
go chkr.Packs(context.TODO(), errChan)
|
||||||
|
|
|
@ -369,6 +369,11 @@ func TestIndexSave(t *testing.T) {
|
||||||
}
|
}
|
||||||
|
|
||||||
checker := checker.New(repo, false)
|
checker := checker.New(repo, false)
|
||||||
|
err = checker.LoadSnapshots(context.TODO())
|
||||||
|
if err != nil {
|
||||||
|
t.Error(err)
|
||||||
|
}
|
||||||
|
|
||||||
hints, errs := checker.LoadIndex(context.TODO())
|
hints, errs := checker.LoadIndex(context.TODO())
|
||||||
for _, h := range hints {
|
for _, h := range hints {
|
||||||
t.Logf("hint: %v\n", h)
|
t.Logf("hint: %v\n", h)
|
||||||
|
|
Loading…
Reference in a new issue