summaryrefslogtreecommitdiff
path: root/internal/api/fileserver
diff options
context:
space:
mode:
authorLibravatar kim <89579420+NyaaaWhatsUpDoc@users.noreply.github.com>2024-05-22 09:46:24 +0000
committerLibravatar GitHub <noreply@github.com>2024-05-22 11:46:24 +0200
commit3d3e99ae52ff8895b840cbced2e55b5f849fd4be (patch)
treec646d5eb99368028a2fbdafbe2c4400059d8eed5 /internal/api/fileserver
parent--- (#2923) (diff)
downloadgotosocial-3d3e99ae52ff8895b840cbced2e55b5f849fd4be.tar.xz
[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()
Diffstat (limited to 'internal/api/fileserver')
-rw-r--r--internal/api/fileserver/servefile.go18
1 files changed, 14 insertions, 4 deletions
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