cache: backend add List method and a cache clear functionality

* removes files which are no longer in the repository, including index files, snapshot files and pack files from the cache.

cache: fix ids set initialisation with NewIDSet()
This commit is contained in:
Srigovind Nayak 2024-08-11 01:42:13 +05:30 committed by Michael Eischer
parent 48e3832322
commit fac1d9fea1

View file

@ -2,11 +2,14 @@ package cache
import ( import (
"context" "context"
"fmt"
"io" "io"
"os"
"sync" "sync"
"github.com/restic/restic/internal/backend" "github.com/restic/restic/internal/backend"
"github.com/restic/restic/internal/debug" "github.com/restic/restic/internal/debug"
"github.com/restic/restic/internal/restic"
) )
// Backend wraps a restic.Backend and adds a cache. // Backend wraps a restic.Backend and adds a cache.
@ -215,3 +218,40 @@ func (b *Backend) IsNotExist(err error) bool {
func (b *Backend) Unwrap() backend.Backend { func (b *Backend) Unwrap() backend.Backend {
return b.Backend return b.Backend
} }
func (b *Backend) List(ctx context.Context, t backend.FileType, fn func(f backend.FileInfo) error) error {
if !b.Cache.canBeCached(t) {
return b.Backend.List(ctx, t, fn)
}
// will contain the IDs of the files that are in the repository
ids := restic.NewIDSet()
// wrap the original function to also add the file to the ids set
wrapFn := func(f backend.FileInfo) error {
id, err := restic.ParseID(f.Name)
if err != nil {
// returning error here since, if we cannot parse the ID, the file
// is invalid and the list must exit.
return err
}
ids.Insert(id)
// execute the original function
return fn(f)
}
err := b.Backend.List(ctx, t, wrapFn)
if err != nil {
return err
}
// clear the cache for files that are not in the repo anymore, ignore errors
err = b.Cache.Clear(t, ids)
if err != nil {
fmt.Fprintf(os.Stderr, "error clearing %s files in cache: %v\n", t.String(), err)
}
return nil
}