]> Sergey Matveev's repositories - btrtrc.git/commitdiff
Retry Reader reads when data is unexpectedly missing
authorMatt Joiner <anacrolix@gmail.com>
Wed, 3 Jun 2015 03:36:27 +0000 (13:36 +1000)
committerMatt Joiner <anacrolix@gmail.com>
Wed, 3 Jun 2015 03:36:27 +0000 (13:36 +1000)
reader.go

index 99b0432e1df2f48f2c40bb157e9951dbe1d7557b..12437d5509fd1d37344d3785cbc94a16b62a060d 100644 (file)
--- a/reader.go
+++ b/reader.go
@@ -65,6 +65,10 @@ func (r *Reader) available(off, max int64) (ret int64) {
                ret += len1
                off += len1
        }
+       // Ensure that ret hasn't exceeded our original max.
+       if max < 0 {
+               ret += max
+       }
        return
 }
 
@@ -79,9 +83,6 @@ func (r *Reader) ReadAt(b []byte, off int64) (n int, err error) {
 func (r *Reader) Read(b []byte) (n int, err error) {
        n, err = r.readAt(b, r.pos)
        r.pos += int64(n)
-       if n != 0 && err == io.ErrUnexpectedEOF {
-               err = nil
-       }
        return
 }
 
@@ -100,6 +101,7 @@ func (r *Reader) readAt(b []byte, pos int64) (n int, err error) {
        if int64(len(b)) > maxLen {
                b = b[:maxLen]
        }
+again:
        r.raisePriorities(pos, len(b))
        for !r.readable(pos) {
                r.raisePriorities(pos, len(b))
@@ -107,10 +109,15 @@ func (r *Reader) readAt(b []byte, pos int64) (n int, err error) {
        }
        avail := r.available(pos, int64(len(b)))
        // log.Println("available", avail)
-       if int64(len(b)) > avail {
-               b = b[:avail]
+       b1 := b[:avail]
+       n, err = dataReadAt(r.t.data, b1, pos)
+       if n != 0 {
+               err = nil
+               return
+       }
+       if err == io.ErrUnexpectedEOF {
+               goto again
        }
-       n, err = dataReadAt(r.t.data, b, pos)
        return
 }