eth/downloader: fix possible data race by inconsistent field protection (#20690)

This commit is contained in:
Boqin Qin 2020-02-25 17:44:21 +08:00 committed by GitHub
parent bf1cdd723a
commit 2a5ed1a1d3
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -564,26 +564,29 @@ func (q *queue) reserveHeaders(p *peerConnection, count int, taskPool map[common
// CancelHeaders aborts a fetch request, returning all pending skeleton indexes to the queue. // CancelHeaders aborts a fetch request, returning all pending skeleton indexes to the queue.
func (q *queue) CancelHeaders(request *fetchRequest) { func (q *queue) CancelHeaders(request *fetchRequest) {
q.lock.Lock()
defer q.lock.Unlock()
q.cancel(request, q.headerTaskQueue, q.headerPendPool) q.cancel(request, q.headerTaskQueue, q.headerPendPool)
} }
// CancelBodies aborts a body fetch request, returning all pending headers to the // CancelBodies aborts a body fetch request, returning all pending headers to the
// task queue. // task queue.
func (q *queue) CancelBodies(request *fetchRequest) { func (q *queue) CancelBodies(request *fetchRequest) {
q.lock.Lock()
defer q.lock.Unlock()
q.cancel(request, q.blockTaskQueue, q.blockPendPool) q.cancel(request, q.blockTaskQueue, q.blockPendPool)
} }
// CancelReceipts aborts a body fetch request, returning all pending headers to // CancelReceipts aborts a body fetch request, returning all pending headers to
// the task queue. // the task queue.
func (q *queue) CancelReceipts(request *fetchRequest) { func (q *queue) CancelReceipts(request *fetchRequest) {
q.lock.Lock()
defer q.lock.Unlock()
q.cancel(request, q.receiptTaskQueue, q.receiptPendPool) q.cancel(request, q.receiptTaskQueue, q.receiptPendPool)
} }
// Cancel aborts a fetch request, returning all pending hashes to the task queue. // Cancel aborts a fetch request, returning all pending hashes to the task queue.
func (q *queue) cancel(request *fetchRequest, taskQueue *prque.Prque, pendPool map[string]*fetchRequest) { func (q *queue) cancel(request *fetchRequest, taskQueue *prque.Prque, pendPool map[string]*fetchRequest) {
q.lock.Lock()
defer q.lock.Unlock()
if request.From > 0 { if request.From > 0 {
taskQueue.Push(request.From, -int64(request.From)) taskQueue.Push(request.From, -int64(request.From))
} }