code: func (t *DeleteRangeTask) Execute() error {
  	startKey, rangeEndKey := t.startKey, t.endKey
  	for {
  		select {
  		case <-t.ctx.Done():
  			t.canceled = true
  			return nil
  		default:
  		}
  		bo := NewBackoffer(t.ctx, deleteRangeOneRegionMaxBackoff)
  		loc, err := t.store.GetRegionCache().LocateKey(bo, startKey)
  		if err != nil {
  			return errors.Trace(err)
  		}
  
  		// Delete to the end of the region, except if it's the last region overlapping the range
  		endKey := loc.EndKey
  		// If it is the last region
  		if loc.Contains(rangeEndKey) {
  			endKey = rangeEndKey
  		}
  
  		req := &tikvrpc.Request{
  			Type: tikvrpc.CmdDeleteRange,
  			DeleteRange: &kvrpcpb.DeleteRangeRequest{
  				StartKey: startKey,
  				EndKey:   endKey,
  			},
  		}
  
  		resp, err := t.store.SendReq(bo, req, loc.Region, ReadTimeoutMedium)
  		if err != nil {
  			return errors.Trace(err)
  		}
  		regionErr, err := resp.GetRegionError()
  		if err != nil {
  			return errors.Trace(err)
  		}
  		if regionErr != nil {
  			err = bo.Backoff(BoRegionMiss, errors.New(regionErr.String()))
  			if err != nil {
  				return errors.Trace(err)
  			}
  			continue
  		}
  		deleteRangeResp := resp.DeleteRange
  		if deleteRangeResp == nil {
  			return errors.Trace(ErrBodyMissing)
  		}
  		if err := deleteRangeResp.GetError(); err != "" {
  			return errors.Errorf("unexpected delete range err: %v", err)
  		}
  		t.completedRegions++
  		if bytes.Equal(endKey, rangeEndKey) {
  			break
  		}
  		startKey = endKey
  	}
  
  	return nil
  }
docs: // Execute performs the delete range operation.