code: func (s *scheduler) run(sections chan uint64, dist chan *request, done chan []byte, quit chan struct{}, wg *sync.WaitGroup) {
  	// Create a forwarder channel between requests and responses of the same size as
  	// the distribution channel (since that will block the pipeline anyway).
  	pend := make(chan uint64, cap(dist))
  
  	// Start the pipeline schedulers to forward between user -> distributor -> user
  	wg.Add(2)
  	go s.scheduleRequests(sections, dist, pend, quit, wg)
  	go s.scheduleDeliveries(pend, done, quit, wg)
  }
docs: // run creates a retrieval pipeline, receiving section indexes from sections and
  // returning the results in the same order through the done channel. Concurrent
  // runs of the same scheduler are allowed, leading to retrieval task deduplication.