From 08ac3b4822262a72ab3f01006798a0741855112d Mon Sep 17 00:00:00 2001
From: Travis Ralston <travpc@gmail.com>
Date: Wed, 25 Mar 2020 13:33:53 -0600
Subject: [PATCH] Close a bunch of streams more often

Might reduce memory usage over time
---
 controllers/download_controller/download_controller.go      | 6 ++++++
 controllers/info_controller/info_controller.go              | 1 +
 controllers/preview_controller/preview_resource_handler.go  | 1 +
 .../thumbnail_controller/thumbnail_resource_handler.go      | 4 ++++
 util/util_exif/exif.go                                      | 1 +
 5 files changed, 13 insertions(+)

diff --git a/controllers/download_controller/download_controller.go b/controllers/download_controller/download_controller.go
index 6eaea874..77b74fd4 100644
--- a/controllers/download_controller/download_controller.go
+++ b/controllers/download_controller/download_controller.go
@@ -66,6 +66,9 @@ func GetMedia(origin string, mediaId string, downloadRemote bool, blockForMedia
 		if media != nil {
 			if media.Quarantined {
 				ctx.Log.Warn("Quarantined media accessed")
+				if minMedia.Stream != nil {
+					minMedia.Stream.Close() // close the other one first
+				}
 
 				if ctx.Config.Quarantine.ReplaceDownloads {
 					ctx.Log.Info("Replacing thumbnail with a quarantined one")
@@ -104,6 +107,9 @@ func GetMedia(origin string, mediaId string, downloadRemote bool, blockForMedia
 				return nil, err
 			}
 			if cached != nil && cached.Contents != nil {
+				if minMedia.Stream != nil {
+					minMedia.Stream.Close() // close the other one first
+				}
 				minMedia.Stream = util.BufferToStream(cached.Contents)
 				return minMedia, nil
 			}
diff --git a/controllers/info_controller/info_controller.go b/controllers/info_controller/info_controller.go
index 69c7eb46..21425985 100644
--- a/controllers/info_controller/info_controller.go
+++ b/controllers/info_controller/info_controller.go
@@ -30,6 +30,7 @@ func GetOrCalculateBlurhash(media *types.Media, rctx rcontext.RequestContext) (s
 	if err != nil {
 		return "", err
 	}
+	defer minMedia.Stream.Close()
 
 	// No cached blurhash: calculate one
 	rctx.Log.Info("Decoding image for blurhash calculation")
diff --git a/controllers/preview_controller/preview_resource_handler.go b/controllers/preview_controller/preview_resource_handler.go
index db54f9da..9329e79e 100644
--- a/controllers/preview_controller/preview_resource_handler.go
+++ b/controllers/preview_controller/preview_resource_handler.go
@@ -107,6 +107,7 @@ func urlPreviewWorkFn(request *resource_handler.WorkRequest) interface{} {
 			if err != nil {
 				ctx.Log.Warn("Non-fatal error streaming datastore file: " + err.Error())
 			} else {
+				defer mediaStream.Close()
 				img, err := imaging.Decode(mediaStream)
 				if err != nil {
 					ctx.Log.Warn("Non-fatal error getting thumbnail dimensions: " + err.Error())
diff --git a/controllers/thumbnail_controller/thumbnail_resource_handler.go b/controllers/thumbnail_controller/thumbnail_resource_handler.go
index aa8859e3..f2a4544a 100644
--- a/controllers/thumbnail_controller/thumbnail_resource_handler.go
+++ b/controllers/thumbnail_controller/thumbnail_resource_handler.go
@@ -150,6 +150,7 @@ func GenerateThumbnail(media *types.Media, width int, height int, method string,
 			ctx.Log.Error("Error getting file: ", err2)
 			return nil, err2
 		}
+		defer mediaStream.Close()
 		src, err = imaging.Decode(mediaStream)
 	}
 
@@ -225,6 +226,7 @@ func GenerateThumbnail(media *types.Media, width int, height int, method string,
 			ctx.Log.Error("Error resolving datastore path: ", err)
 			return nil, err
 		}
+		defer mediaStream.Close()
 
 		g, err := gif.DecodeAll(mediaStream)
 		if err != nil {
@@ -348,6 +350,7 @@ func svgToImage(media *types.Media, ctx rcontext.RequestContext) (image.Image, e
 		ctx.Log.Error("Error streaming file: ", err)
 		return nil, err
 	}
+	defer mediaStream.Close()
 
 	f, err := os.OpenFile(tempFile1, os.O_RDWR|os.O_CREATE, 0640)
 	if err != nil {
@@ -376,6 +379,7 @@ func pickImageFrame(media *types.Media, ctx rcontext.RequestContext) (image.Imag
 		ctx.Log.Error("Error resolving datastore path: ", err)
 		return nil, err
 	}
+	defer mediaStream.Close()
 
 	g, err := gif.DecodeAll(mediaStream)
 	if err != nil {
diff --git a/util/util_exif/exif.go b/util/util_exif/exif.go
index 7403bb59..f419927b 100644
--- a/util/util_exif/exif.go
+++ b/util/util_exif/exif.go
@@ -25,6 +25,7 @@ func GetExifOrientation(media *types.Media) (*ExifOrientation, error) {
 	if err != nil {
 		return nil, err
 	}
+	defer mediaStream.Close()
 
 	exifData, err := exif.Decode(mediaStream)
 	if err != nil {
-- 
GitLab