diff --git a/pkg/index/receive.go b/pkg/index/receive.go index 64f3a9766..c21b87fee 100644 --- a/pkg/index/receive.go +++ b/pkg/index/receive.go @@ -120,6 +120,7 @@ func (ix *Index) populateFile(blobRef *blobref.BlobRef, ss *schema.Superset, bm log.Printf("index: error indexing file, creating NewFileReader %s: %v", blobRef, err) return nil } + defer fr.Close() mime, reader := magic.MimeTypeFromReader(fr) sha1 := sha1.New() diff --git a/pkg/schema/filereader.go b/pkg/schema/filereader.go index ea223807b..589251dad 100644 --- a/pkg/schema/filereader.go +++ b/pkg/schema/filereader.go @@ -155,6 +155,8 @@ type FileReader struct { // NewFileReader returns a new FileReader reading the contents of fileBlobRef, // fetching blobs from fetcher. The fileBlobRef must be of a "bytes" or "file" // schema blob. +// +// The caller should call Close on the FileReader when done reading. func NewFileReader(fetcher blobref.SeekFetcher, fileBlobRef *blobref.BlobRef) (*FileReader, error) { // TODO(bradfitz): make this take a blobref.FetcherAt instead? // TODO(bradfitz): rename this into bytes reader? but for now it's still diff --git a/pkg/server/image.go b/pkg/server/image.go index 9c5c2db92..8d2ba5583 100644 --- a/pkg/server/image.go +++ b/pkg/server/image.go @@ -96,14 +96,16 @@ func (ih *ImageHandler) cacheScaled(tr io.Reader, name string) error { return nil } -func (ih *ImageHandler) cached(br *blobref.BlobRef) (fr *schema.FileReader, err error) { +// cached returns a FileReader for the given file schema blobref. +// The FileReader should be closed when done reading. +func (ih *ImageHandler) cached(fileRef *blobref.BlobRef) (*schema.FileReader, error) { fetchSeeker := blobref.SeekerFromStreamingFetcher(ih.Cache) - fr, err = schema.NewFileReader(fetchSeeker, br) + fr, err := schema.NewFileReader(fetchSeeker, fileRef) if err != nil { return nil, err } if imageDebug { - log.Printf("Image Cache: hit: %v\n", br) + log.Printf("Image Cache: hit: %v\n", fileRef) } return fr, nil } @@ -126,6 +128,7 @@ func (ih *ImageHandler) scaledCached(buf *bytes.Buffer, file *blobref.BlobRef) ( if err != nil { return format, fmt.Errorf("No cache hit for %v: %v", br, err) } + defer fr.Close() _, err = io.Copy(buf, fr) if err != nil { return format, fmt.Errorf("error reading cached thumbnail %v: %v", name, err) @@ -151,6 +154,7 @@ func (ih *ImageHandler) scaleImage(buf *bytes.Buffer, file *blobref.BlobRef) (fo if err != nil { return format, err } + defer fr.Close() _, err = io.Copy(buf, fr) if err != nil {