diff --git a/utils/cache/file_caches.go b/utils/cache/file_caches.go index 5edc533f..ffa9f548 100644 --- a/utils/cache/file_caches.go +++ b/utils/cache/file_caches.go @@ -174,6 +174,7 @@ func (fc *fileCache) Get(ctx context.Context, arg Item) (*CachedStream, error) { go func() { if err := copyAndClose(w, reader); err != nil { log.Debug(ctx, "Error storing file in cache", "cache", fc.name, "key", key, err) + _ = r.Close() _ = fc.invalidate(ctx, key) } else { log.Trace(ctx, "File successfully stored in cache", "cache", fc.name, "key", key) diff --git a/utils/cache/file_caches_test.go b/utils/cache/file_caches_test.go index 72f4463d..a8511d16 100644 --- a/utils/cache/file_caches_test.go +++ b/utils/cache/file_caches_test.go @@ -116,18 +116,16 @@ var _ = Describe("File Caches", func() { }) }) When("reader returns error", func() { - It("does not cache", func() { + It("does not cache and closes the stream", func() { fc := callNewFileCache("test", "1KB", "test", 0, func(ctx context.Context, arg Item) (io.Reader, error) { - return errFakeReader{errors.New("read failure")}, nil + return &errFakeReader{data: []byte("data"), err: errors.New("read failure")}, nil }) s, err := fc.Get(context.Background(), &testArg{"test"}) Expect(err).ToNot(HaveOccurred()) - _, _ = io.Copy(io.Discard, s) - // TODO How to make the fscache reader return the underlying reader error? - //Expect(err).To(MatchError("read failure")) + _, err = io.ReadAll(s) + Expect(err.Error()).To(ContainSubstring("file already closed")) - // Data should not be cached (or eventually be removed from cache) Eventually(func() bool { s, _ = fc.Get(context.Background(), &testArg{"test"}) if s != nil { @@ -145,6 +143,17 @@ type testArg struct{ s string } func (t *testArg) Key() string { return t.s } -type errFakeReader struct{ err error } +type errFakeReader struct { + data []byte + err error + off int +} -func (e errFakeReader) Read([]byte) (int, error) { return 0, e.err } +func (e *errFakeReader) Read(b []byte) (int, error) { + if e.off < len(e.data) { + n := copy(b, e.data[e.off:]) + e.off += n + return n, nil + } + return 0, e.err +}