eth/downloader: ensure PendingNodeData returns 0 inside callback

This commit is contained in:
Felix Lange 2017-01-20 11:44:39 +01:00
parent e9313c7099
commit 26193db7cf

View file

@ -1096,21 +1096,21 @@ func (q *queue) DeliverNodeData(id string, data [][]byte, callback func(int, boo
progressed, nproc, procerr := q.stateScheduler.Process(process, batch)
q.stateWriters += 1
go func() {
defer func() {
q.lock.Lock()
q.stateWriters -= 1
q.lock.Unlock()
// Wake up WaitResults after the state has been written because it might be
// waiting for completion of the pivot block's state download.
q.active.Signal()
}()
if procerr != nil {
// Return processing errors through the callback so the sync gets canceled.
callback(nproc, progressed, procerr)
return
// Wake up WaitResults after the state has been written because it might be
// waiting for completion of the pivot block's state download.
defer q.active.Signal()
if procerr == nil {
nproc = len(process)
procerr = batch.Write()
}
err := batch.Write()
callback(len(process), progressed, err)
// Return processing errors through the callback so the sync gets canceled. The
// number of writers is decremented prior to the call so PendingNodeData will
// return zero when the callback runs.
q.lock.Lock()
q.stateWriters -= 1
q.lock.Unlock()
callback(nproc, progressed, procerr)
}()
// If none of the data items were good, it's a stale delivery