code: func (c *CopClient) Send(ctx context.Context, req *kv.Request, vars *kv.Variables) kv.Response {
  	ctx = context.WithValue(ctx, txnStartKey, req.StartTs)
  	bo := NewBackoffer(ctx, copBuildTaskMaxBackoff).WithVars(vars)
  	tasks, err := buildCopTasks(bo, c.store.regionCache, &copRanges{mid: req.KeyRanges}, req.Desc, req.Streaming)
  	if err != nil {
  		return copErrorResponse{err}
  	}
  	it := &copIterator{
  		store:       c.store,
  		req:         req,
  		concurrency: req.Concurrency,
  		finishCh:    make(chan struct{}),
  		vars:        vars,
  		memTracker:  req.MemTracker,
  	}
  	it.tasks = tasks
  	if it.concurrency > len(tasks) {
  		it.concurrency = len(tasks)
  	}
  	if it.concurrency < 1 {
  		// Make sure that there is at least one worker.
  		it.concurrency = 1
  	}
  	if !it.req.KeepOrder {
  		it.respChan = make(chan *copResponse, it.concurrency)
  	}
  	it.open(ctx)
  	return it
  }
docs: // Send builds the request and gets the coprocessor iterator response.