MCPcopy Index your code
hub / github.com/rclone/rclone / openRange

Method openRange

fs/chunkedreader/sequential.go:179–215  ·  view source on GitHub ↗

openRange will open the source Object with the current chunk range If the current open reader implements RangeSeeker, it is tried first. When RangeSeek fails, o.Open with a RangeOption is used. A length <= 0 will request till the end of the file

()

Source from the content-addressed store, hash-verified

177//
178// A length <= 0 will request till the end of the file
179func (cr *sequential) openRange() error {
180 offset, length := cr.chunkOffset, cr.chunkSize
181 fs.Debugf(cr.o, "ChunkedReader.openRange at %d length %d", offset, length)
182
183 if cr.closed {
184 return ErrorFileClosed
185 }
186
187 if rs, ok := cr.rc.(fs.RangeSeeker); ok {
188 n, err := rs.RangeSeek(cr.ctx, offset, io.SeekStart, length)
189 if err == nil && n == offset {
190 cr.offset = offset
191 return nil
192 }
193 if err != nil {
194 fs.Debugf(cr.o, "ChunkedReader.openRange seek failed (%s). Trying Open", err)
195 } else {
196 fs.Debugf(cr.o, "ChunkedReader.openRange seeked to wrong offset. Wanted %d, got %d. Trying Open", offset, n)
197 }
198 }
199
200 var rc io.ReadCloser
201 var err error
202 if length <= 0 {
203 if offset == 0 {
204 rc, err = cr.o.Open(cr.ctx, &fs.HashesOption{Hashes: hash.Set(hash.None)})
205 } else {
206 rc, err = cr.o.Open(cr.ctx, &fs.HashesOption{Hashes: hash.Set(hash.None)}, &fs.RangeOption{Start: offset, End: -1})
207 }
208 } else {
209 rc, err = cr.o.Open(cr.ctx, &fs.HashesOption{Hashes: hash.Set(hash.None)}, &fs.RangeOption{Start: offset, End: offset + length - 1})
210 }
211 if err != nil {
212 return err
213 }
214 return cr.resetReader(rc, offset)
215}
216
217// resetReader switches the current reader to the given reader.
218// The old reader will be Close'd before setting the new reader.

Callers 2

ReadMethod · 0.95
OpenMethod · 0.95

Calls 5

resetReaderMethod · 0.95
DebugfFunction · 0.92
SetTypeAlias · 0.92
RangeSeekMethod · 0.65
OpenMethod · 0.65

Tested by

no test coverage detected