code: func newFetcher(span opentracing.Span, addr Address, nf NetFetcher, cancel func(), peers *sync.Map, closeC chan struct{}) *fetcher {
  	cancelOnce := &sync.Once{} // cancel should only be called once
  	return &fetcher{
  		addr:        addr,
  		deliveredC:  make(chan struct{}),
  		deliverOnce: &sync.Once{},
  		cancelledC:  closeC,
  		netFetcher:  nf,
  		cancel: func() {
  			cancelOnce.Do(func() {
  				cancel()
  			})
  		},
  		peers: peers,
  		span:  span,
  	}
  }
docs: // newFetcher creates a new fetcher object for the fiven addr. fetch is the function which actually
  // does the retrieval (in non-test cases this is coming from the network package). cancel function is
  // called either
  //     1. when the chunk has been fetched all peers have been either notified or their context has been done
  //     2. the chunk has not been fetched but all context from all the requests has been done
  // The peers map stores all the peers which have requested chunk.