From ce902aac677d915058b702b66a162560a884c896 Mon Sep 17 00:00:00 2001 From: Michael Eischer Date: Fri, 19 Aug 2022 20:59:06 +0200 Subject: [PATCH] cache: Just try to open cache entry without calling stat first Instead of first checking whether a file is in the repository cache and then opening it, we just can open the file. This saves one stat call. If the file is in the cache, everything is fine and otherwise the code follows its normal fallback path. --- internal/cache/backend.go | 22 ++++++++++------------ internal/cache/file.go | 2 +- 2 files changed, 11 insertions(+), 13 deletions(-) diff --git a/internal/cache/backend.go b/internal/cache/backend.go index 4078ed2fa..36349c067 100644 --- a/internal/cache/backend.go +++ b/internal/cache/backend.go @@ -160,19 +160,17 @@ func (b *Backend) Load(ctx context.Context, h restic.Handle, length int, offset debug.Log("downloading %v finished", h) } - if b.Cache.Has(h) { - debug.Log("Load(%v, %v, %v) from cache", h, length, offset) - rd, err := b.Cache.load(h, length, offset) - if err == nil { - err = consumer(rd) - if err != nil { - _ = rd.Close() // ignore secondary errors - return err - } - return rd.Close() + // try loading from cache without checking that the handle is actually cached + rd, err := b.Cache.load(h, length, offset) + if err == nil { + err = consumer(rd) + if err != nil { + _ = rd.Close() // ignore secondary errors + return err } - debug.Log("error loading %v from cache: %v", h, err) + return rd.Close() } + debug.Log("error loading %v from cache: %v", h, err) // if we don't automatically cache this file type, fall back to the backend if !autoCacheTypes(h) { @@ -181,7 +179,7 @@ func (b *Backend) Load(ctx context.Context, h restic.Handle, length int, offset } debug.Log("auto-store %v in the cache", h) - err := b.cacheFile(ctx, h) + err = b.cacheFile(ctx, h) if err == nil { return b.loadFromCacheOrDelegate(ctx, h, length, offset, consumer) } diff --git a/internal/cache/file.go b/internal/cache/file.go index 8ed4be77e..490b2b311 100644 --- a/internal/cache/file.go +++ b/internal/cache/file.go @@ -43,7 +43,7 @@ type readCloser struct { // given handle. rd must be closed after use. If an error is returned, the // ReadCloser is nil. func (c *Cache) load(h restic.Handle, length int, offset int64) (io.ReadCloser, error) { - debug.Log("Load from cache: %v", h) + debug.Log("Load(%v, %v, %v) from cache", h, length, offset) if !c.canBeCached(h.Type) { return nil, errors.New("cannot be cached") }