in sharedlibraries/storage/parallelreader.go [160:188]
func fillWorkerBuffer(r *ParallelReader, worker *downloadWorker, startByte int64) error {
// Assigns reader to worker with the given startByte and chunk length.
var err error
if worker.reader, err = worker.object.NewRangeReader(r.ctx, startByte, r.partSizeBytes); err != nil {
return fmt.Errorf("failed to create range reader: %v", err)
}
// Reads data into the worker's buffer until the whole length is read.
bytesRead := int64(0)
for {
select {
case <-r.ctx.Done():
return fmt.Errorf("context cancellation called")
default:
var n int
if n, err = worker.reader.Read(worker.buffer[bytesRead:]); err != nil && err != io.EOF {
return fmt.Errorf("failed to read from range reader: %v", err)
}
if n == 0 || err == io.EOF {
// When all bytes are read, the loop will exit.
worker.BytesRemain = bytesRead
worker.chunkSize = bytesRead
worker.bufferOffset = 0
return nil
}
bytesRead += int64(n)
}
}
}