1
mirror of https://github.com/rclone/rclone synced 2024-09-21 19:31:31 +02:00

cache: improve efficiency with RangeOption and RangeSeek #1825

* All remotes now support RangeOption so remove SeekOption
  * Correct off by one error as RangeOption arguments are inclusive.
  * Use RangeSeek in preference to Seek if available
This commit is contained in:
Nick Craig-Wood 2018-02-19 17:52:33 +00:00
parent e0eb666dbf
commit fe8eeec5b5

View File

@ -389,7 +389,7 @@ func (w *worker) reader(offset, end int64, closeOpen bool) (io.ReadCloser, error
r := w.rc r := w.rc
if w.rc == nil { if w.rc == nil {
r, err = w.r.cacheFs().openRateLimited(func() (io.ReadCloser, error) { r, err = w.r.cacheFs().openRateLimited(func() (io.ReadCloser, error) {
return w.r.cachedObject.Object.Open(&fs.SeekOption{Offset: offset}, &fs.RangeOption{Start: offset, End: end}) return w.r.cachedObject.Object.Open(&fs.RangeOption{Start: offset, End: end - 1})
}) })
if err != nil { if err != nil {
return nil, err return nil, err
@ -398,16 +398,18 @@ func (w *worker) reader(offset, end int64, closeOpen bool) (io.ReadCloser, error
} }
if !closeOpen { if !closeOpen {
seekerObj, ok := r.(io.Seeker) if do, ok := r.(fs.RangeSeeker); ok {
if ok { _, err = do.RangeSeek(offset, os.SEEK_SET, end-offset)
_, err = seekerObj.Seek(offset, os.SEEK_SET) return r, err
} else if do, ok := r.(io.Seeker); ok {
_, err = do.Seek(offset, os.SEEK_SET)
return r, err return r, err
} }
} }
_ = w.rc.Close() _ = w.rc.Close()
return w.r.cacheFs().openRateLimited(func() (io.ReadCloser, error) { return w.r.cacheFs().openRateLimited(func() (io.ReadCloser, error) {
r, err = w.r.cachedObject.Object.Open(&fs.SeekOption{Offset: offset}, &fs.RangeOption{Start: offset, End: end}) r, err = w.r.cachedObject.Object.Open(&fs.RangeOption{Start: offset, End: end - 1})
if err != nil { if err != nil {
return nil, err return nil, err
} }