eth: randomly fetch announced block (don't hammer origin)
This commit is contained in:
		| @@ -127,7 +127,7 @@ func (pm *ProtocolManager) txsyncLoop() { | |||||||
| // fetcher is responsible for collecting hash notifications, and periodically | // fetcher is responsible for collecting hash notifications, and periodically | ||||||
| // checking all unknown ones and individually fetching them. | // checking all unknown ones and individually fetching them. | ||||||
| func (pm *ProtocolManager) fetcher() { | func (pm *ProtocolManager) fetcher() { | ||||||
| 	announces := make(map[common.Hash]*blockAnnounce) | 	announces := make(map[common.Hash][]*blockAnnounce) | ||||||
| 	request := make(map[*peer][]common.Hash) | 	request := make(map[*peer][]common.Hash) | ||||||
| 	pending := make(map[common.Hash]*blockAnnounce) | 	pending := make(map[common.Hash]*blockAnnounce) | ||||||
| 	cycle := time.Tick(notifyCheckCycle) | 	cycle := time.Tick(notifyCheckCycle) | ||||||
| @@ -139,7 +139,7 @@ func (pm *ProtocolManager) fetcher() { | |||||||
| 			// A batch of hashes the notified, schedule them for retrieval | 			// A batch of hashes the notified, schedule them for retrieval | ||||||
| 			glog.V(logger.Debug).Infof("Scheduling %d hash announcements from %s", len(notifications), notifications[0].peer.id) | 			glog.V(logger.Debug).Infof("Scheduling %d hash announcements from %s", len(notifications), notifications[0].peer.id) | ||||||
| 			for _, announce := range notifications { | 			for _, announce := range notifications { | ||||||
| 				announces[announce.hash] = announce | 				announces[announce.hash] = append(announces[announce.hash], announce) | ||||||
| 			} | 			} | ||||||
|  |  | ||||||
| 		case <-cycle: | 		case <-cycle: | ||||||
| @@ -150,8 +150,9 @@ func (pm *ProtocolManager) fetcher() { | |||||||
| 				} | 				} | ||||||
| 			} | 			} | ||||||
| 			// Check if any notified blocks failed to arrive | 			// Check if any notified blocks failed to arrive | ||||||
| 			for hash, announce := range announces { | 			for hash, all := range announces { | ||||||
| 				if time.Since(announce.time) > notifyArriveTimeout { | 				if time.Since(all[0].time) > notifyArriveTimeout { | ||||||
|  | 					announce := all[rand.Intn(len(all))] | ||||||
| 					if !pm.chainman.HasBlock(hash) { | 					if !pm.chainman.HasBlock(hash) { | ||||||
| 						request[announce.peer] = append(request[announce.peer], hash) | 						request[announce.peer] = append(request[announce.peer], hash) | ||||||
| 						pending[hash] = announce | 						pending[hash] = announce | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user