|
|
@@ -122,24 +122,26 @@ func (q *queue) Has(hash common.Hash) bool {
|
|
|
return false
|
|
|
}
|
|
|
|
|
|
-// Insert adds a set of hashes for the download queue for scheduling.
|
|
|
-func (q *queue) Insert(hashes []common.Hash) {
|
|
|
+// Insert adds a set of hashes for the download queue for scheduling, returning
|
|
|
+// the number of new hashes encountered.
|
|
|
+func (q *queue) Insert(hashes []common.Hash) int {
|
|
|
q.lock.Lock()
|
|
|
defer q.lock.Unlock()
|
|
|
|
|
|
// Insert all the hashes prioritized in the arrival order
|
|
|
- for i, hash := range hashes {
|
|
|
- index := q.hashCounter + i
|
|
|
-
|
|
|
+ inserts := 0
|
|
|
+ for _, hash := range hashes {
|
|
|
+ // Skip anything we already have
|
|
|
if old, ok := q.hashPool[hash]; ok {
|
|
|
glog.V(logger.Warn).Infof("Hash %x already scheduled at index %v", hash, old)
|
|
|
continue
|
|
|
}
|
|
|
- q.hashPool[hash] = index
|
|
|
- q.hashQueue.Push(hash, float32(index)) // Highest gets schedules first
|
|
|
+ // Update the counters and insert the hash
|
|
|
+ q.hashCounter, inserts = q.hashCounter+1, inserts+1
|
|
|
+ q.hashPool[hash] = q.hashCounter
|
|
|
+ q.hashQueue.Push(hash, float32(q.hashCounter)) // Highest gets schedules first
|
|
|
}
|
|
|
- // Update the hash counter for the next batch of inserts
|
|
|
- q.hashCounter += len(hashes)
|
|
|
+ return inserts
|
|
|
}
|
|
|
|
|
|
// GetHeadBlock retrieves the first block from the cache, or nil if it hasn't
|