code: func (f *lightFetcher) newFetcherDistReq(bestHash common.Hash, reqID uint64, bestAmount uint64) *distReq {
  	return &distReq{
  		getCost: func(dp distPeer) uint64 {
  			p := dp.(*peer)
  			return p.GetRequestCost(GetBlockHeadersMsg, int(bestAmount))
  		},
  		canSend: func(dp distPeer) bool {
  			p := dp.(*peer)
  			f.lock.Lock()
  			defer f.lock.Unlock()
  
  			if p.isOnlyAnnounce {
  				return false
  			}
  
  			fp := f.peers[p]
  			if fp == nil {
  				return false
  			}
  			n := fp.nodeByHash[bestHash]
  			return n != nil && !n.requested
  		},
  		request: func(dp distPeer) func() {
  			p := dp.(*peer)
  			f.lock.Lock()
  			fp := f.peers[p]
  			if fp != nil {
  				n := fp.nodeByHash[bestHash]
  				if n != nil {
  					n.requested = true
  				}
  			}
  			f.lock.Unlock()
  
  			cost := p.GetRequestCost(GetBlockHeadersMsg, int(bestAmount))
  			p.fcServer.QueuedRequest(reqID, cost)
  			f.reqMu.Lock()
  			f.requested[reqID] = fetchRequest{hash: bestHash, amount: bestAmount, peer: p, sent: mclock.Now()}
  			f.reqMu.Unlock()
  			go func() {
  				time.Sleep(hardRequestTimeout)
  				f.timeoutChn <- reqID
  			}()
  			return func() { p.RequestHeadersByHash(reqID, cost, bestHash, int(bestAmount), 0, true) }
  		},
  	}
  }
docs: // newFetcherDistReq creates a new request for the distributor.