mirror of
https://github.com/ethereum/go-ethereum.git
synced 2026-07-22 04:36:42 +00:00
fix LazyChunkReader.ReadAt was using wrong slice index giving sections of zeroes in joined output
This commit is contained in:
parent
63b6ddb896
commit
e5645a8d57
1 changed files with 16 additions and 16 deletions
|
|
@ -126,7 +126,9 @@ func (s *ChunkReader) ReadAt(p []byte, off int64) (n int, err error) {
|
||||||
}
|
}
|
||||||
return n, err
|
return n, err
|
||||||
}
|
}
|
||||||
return s.r.ReadAt(p, off)
|
n, err = s.r.ReadAt(p, off)
|
||||||
|
dpaLogger.DebugDetailf("READ! %v, %v: %x", n, err, p)
|
||||||
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
// added methods to that ChunkReader implements the Sliced interface
|
// added methods to that ChunkReader implements the Sliced interface
|
||||||
|
|
@ -149,14 +151,14 @@ func (s *ChunkReader) Slice(from, to int64) (b []byte, err error) {
|
||||||
func (r *ChunkReader) WriteTo(w io.Writer) (n int64, err error) {
|
func (r *ChunkReader) WriteTo(w io.Writer) (n int64, err error) {
|
||||||
var b []byte
|
var b []byte
|
||||||
var m int
|
var m int
|
||||||
if b, _ := r.Slice(r.off-r.base, r.limit-r.base); b == nil {
|
// if b, _ := r.Slice(r.off-r.base, r.limit-r.base); b == nil {
|
||||||
// if slices not available we do it with extra allocation
|
// if slices not available we do it with extra allocation
|
||||||
b = make([]byte, r.limit-r.off)
|
b = make([]byte, r.limit-r.off)
|
||||||
m, err = r.Read(b)
|
m, err = r.Read(b)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return
|
return
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
// }
|
||||||
m, err = w.Write(b)
|
m, err = w.Write(b)
|
||||||
if m > len(b) {
|
if m > len(b) {
|
||||||
panic("bytes.Reader.WriteTo: invalid Write count")
|
panic("bytes.Reader.WriteTo: invalid Write count")
|
||||||
|
|
@ -230,9 +232,7 @@ func (self *LazyChunkReader) ReadAt(b []byte, off int64) (read int, err error) {
|
||||||
err = io.EOF
|
err = io.EOF
|
||||||
}
|
}
|
||||||
var index int
|
var index int
|
||||||
if off > 0 {
|
index = int(off / self.treeSize)
|
||||||
index = int((off - 1) / self.treeSize)
|
|
||||||
}
|
|
||||||
off -= int64(index) * self.treeSize
|
off -= int64(index) * self.treeSize
|
||||||
var limit int
|
var limit int
|
||||||
var reader LazySectionReader
|
var reader LazySectionReader
|
||||||
|
|
@ -243,18 +243,18 @@ func (self *LazyChunkReader) ReadAt(b []byte, off int64) (read int, err error) {
|
||||||
self.sections[i] = reader // memoize this reader
|
self.sections[i] = reader // memoize this reader
|
||||||
}
|
}
|
||||||
if want > int(reader.Size()-off) {
|
if want > int(reader.Size()-off) {
|
||||||
limit = int(reader.Size())
|
limit = int(reader.Size() - off)
|
||||||
} else {
|
} else {
|
||||||
limit = int(off) + want
|
limit = want
|
||||||
}
|
}
|
||||||
dpaLogger.DebugDetailf("%v - %v (%v) want %v, got %v, read %v", off, limit, reader.Size(), want, got, read)
|
if got, err = reader.ReadAt(b[read:read+limit], off); err != nil {
|
||||||
reader.Seek(0, 0)
|
|
||||||
if got, err = reader.ReadAt(b[off:limit], off); err != nil {
|
|
||||||
dpaLogger.DebugDetailf("oh oh oh oh")
|
dpaLogger.DebugDetailf("oh oh oh oh")
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
read += got
|
read += got
|
||||||
want -= got
|
want -= got
|
||||||
|
off = 0
|
||||||
|
dpaLogger.DebugDetailf("%v - %v (%v) want %v, got %v, read %v: %x", off, limit, reader.Size(), want, got, read, b[off:limit])
|
||||||
}
|
}
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue