func (r *fileReader) Read(data []byte) (int, error) { if r.reader == nil { // skip blocks as long as our offset is past the end of the current block for r.offset != 0 && r.index < len(r.blockRefs) && r.offset >= int64(pfsserver.ByteRangeSize(r.blockRef().Range)) { r.offset -= int64(pfsserver.ByteRangeSize(r.blockRef().Range)) r.index++ } if r.index == len(r.blockRefs) { return 0, io.EOF } var err error client := client.APIClient{BlockAPIClient: r.blockClient} r.reader, err = client.GetBlock(r.blockRef().Block.Hash, uint64(r.offset), uint64(r.size)) if err != nil { return 0, err } r.offset = 0 r.index++ } size, err := r.reader.Read(data) if err != nil && err != io.EOF { return size, err } if err == io.EOF { r.reader = nil } r.size -= int64(size) if r.size == 0 { return size, io.EOF } if r.size < 0 { return 0, fmt.Errorf("read more than we need; this is likely a bug") } return size, nil }