mirror of
https://github.com/ethereum/go-ethereum.git
synced 2026-08-20 10:52:25 +00:00
swarm/storage: Correct hierarchy for lazyreader read context
This commit is contained in:
parent
6c7f2db9cb
commit
aff90fcec9
1 changed files with 11 additions and 5 deletions
|
|
@ -465,7 +465,7 @@ func (r *LazyChunkReader) ReadAt(b []byte, off int64) (read int, err error) {
|
||||||
length *= r.chunkSize
|
length *= r.chunkSize
|
||||||
}
|
}
|
||||||
wg.Add(1)
|
wg.Add(1)
|
||||||
go r.join(b, off, off+length, depth, treeSize/r.branches, r.chunkData, &wg, errC, quitC)
|
go r.join(cctx, b, off, off+length, depth, treeSize/r.branches, r.chunkData, &wg, errC, quitC)
|
||||||
go func() {
|
go func() {
|
||||||
wg.Wait()
|
wg.Wait()
|
||||||
close(errC)
|
close(errC)
|
||||||
|
|
@ -485,7 +485,7 @@ func (r *LazyChunkReader) ReadAt(b []byte, off int64) (read int, err error) {
|
||||||
return len(b), nil
|
return len(b), nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (r *LazyChunkReader) join(b []byte, off int64, eoff int64, depth int, treeSize int64, chunkData ChunkData, parentWg *sync.WaitGroup, errC chan error, quitC chan bool) {
|
func (r *LazyChunkReader) join(ctx context.Context, b []byte, off int64, eoff int64, depth int, treeSize int64, chunkData ChunkData, parentWg *sync.WaitGroup, errC chan error, quitC chan bool) {
|
||||||
defer parentWg.Done()
|
defer parentWg.Done()
|
||||||
// find appropriate block level
|
// find appropriate block level
|
||||||
for chunkData.Size() < uint64(treeSize) && depth > r.depth {
|
for chunkData.Size() < uint64(treeSize) && depth > r.depth {
|
||||||
|
|
@ -533,7 +533,7 @@ func (r *LazyChunkReader) join(b []byte, off int64, eoff int64, depth int, treeS
|
||||||
go func(j int64) {
|
go func(j int64) {
|
||||||
childAddress := chunkData[8+j*r.hashSize : 8+(j+1)*r.hashSize]
|
childAddress := chunkData[8+j*r.hashSize : 8+(j+1)*r.hashSize]
|
||||||
startTime := time.Now()
|
startTime := time.Now()
|
||||||
chunkData, err := r.getter.Get(r.ctx, Reference(childAddress))
|
chunkData, err := r.getter.Get(ctx, Reference(childAddress))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
metrics.GetOrRegisterResettingTimer("lcr.getter.get.err", nil).UpdateSince(startTime)
|
metrics.GetOrRegisterResettingTimer("lcr.getter.get.err", nil).UpdateSince(startTime)
|
||||||
log.Debug("lazychunkreader.join", "key", fmt.Sprintf("%x", childAddress), "err", err)
|
log.Debug("lazychunkreader.join", "key", fmt.Sprintf("%x", childAddress), "err", err)
|
||||||
|
|
@ -554,7 +554,7 @@ func (r *LazyChunkReader) join(b []byte, off int64, eoff int64, depth int, treeS
|
||||||
if soff < off {
|
if soff < off {
|
||||||
soff = off
|
soff = off
|
||||||
}
|
}
|
||||||
r.join(b[soff-off:seoff-off], soff-roff, seoff-roff, depth-1, treeSize/r.branches, chunkData, wg, errC, quitC)
|
r.join(ctx, b[soff-off:seoff-off], soff-roff, seoff-roff, depth-1, treeSize/r.branches, chunkData, wg, errC, quitC)
|
||||||
}(i)
|
}(i)
|
||||||
} //for
|
} //for
|
||||||
}
|
}
|
||||||
|
|
@ -581,6 +581,11 @@ var errWhence = errors.New("Seek: invalid whence")
|
||||||
var errOffset = errors.New("Seek: invalid offset")
|
var errOffset = errors.New("Seek: invalid offset")
|
||||||
|
|
||||||
func (r *LazyChunkReader) Seek(offset int64, whence int) (int64, error) {
|
func (r *LazyChunkReader) Seek(offset int64, whence int) (int64, error) {
|
||||||
|
cctx, sp := spancontext.StartSpan(
|
||||||
|
r.ctx,
|
||||||
|
"lcr.seek")
|
||||||
|
defer sp.Finish()
|
||||||
|
|
||||||
log.Debug("lazychunkreader.seek", "key", r.addr, "offset", offset)
|
log.Debug("lazychunkreader.seek", "key", r.addr, "offset", offset)
|
||||||
switch whence {
|
switch whence {
|
||||||
default:
|
default:
|
||||||
|
|
@ -590,8 +595,9 @@ func (r *LazyChunkReader) Seek(offset int64, whence int) (int64, error) {
|
||||||
case 1:
|
case 1:
|
||||||
offset += r.off
|
offset += r.off
|
||||||
case 2:
|
case 2:
|
||||||
|
|
||||||
if r.chunkData == nil { //seek from the end requires rootchunk for size. call Size first
|
if r.chunkData == nil { //seek from the end requires rootchunk for size. call Size first
|
||||||
_, err := r.Size(context.TODO(), nil)
|
_, err := r.Size(cctx, nil)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return 0, fmt.Errorf("can't get size: %v", err)
|
return 0, fmt.Errorf("can't get size: %v", err)
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue