From 3d3e99ae52ff8895b840cbced2e55b5f849fd4be Mon Sep 17 00:00:00 2001 From: kim <89579420+NyaaaWhatsUpDoc@users.noreply.github.com> Date: Wed, 22 May 2024 09:46:24 +0000 Subject: [performance] update storage backend and make use of seek syscall when available (#2924) * update to use go-storage/ instead of go-store/v2/storage/ * pull in latest version from codeberg * remove test output :innocent: * add code comments * set the exclusive bit when creating new files in disk config * bump to actual release version * bump to v0.1.1 (tis a simple no-logic change) * update readme * only use a temporary read seeker when decoding video if required (should only be S3 now) * use fastcopy library to use memory pooled buffers when calling TempFileSeeker() * update to use seek call in serveFileRange() --- internal/api/fileserver/servefile.go | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) (limited to 'internal/api/fileserver') diff --git a/internal/api/fileserver/servefile.go b/internal/api/fileserver/servefile.go index 8fb5a838e..fc6ef0e7e 100644 --- a/internal/api/fileserver/servefile.go +++ b/internal/api/fileserver/servefile.go @@ -224,10 +224,20 @@ func serveFileRange(rw http.ResponseWriter, r *http.Request, src io.Reader, rng return } - // Dump the first 'start' many bytes into the void... - if _, err := fastcopy.CopyN(io.Discard, src, start); err != nil { - log.Errorf(r.Context(), "error reading from source: %v", err) - return + if rs, ok := src.(io.ReadSeeker); ok { + // Source supports seeking (usually *os.File), + // seek to the 'start' byte position in file. + if _, err := rs.Seek(start, 0); err != nil { + log.Errorf(r.Context(), "error seeking in source: %v", err) + return + } + } else { + // Compat for when no seek call is implemented, + // dump the first 'start' many bytes into void. + if _, err := fastcopy.CopyN(io.Discard, src, start); err != nil { + log.Errorf(r.Context(), "error reading from source: %v", err) + return + } } // Determine new content length -- cgit v1.2.3