code: func (c *Cluster) evacuateOldRegionRanges(start, end MvccKey) {
  	oldRegions := c.getRegionsCoverRange(start, end)
  	for _, oldRegion := range oldRegions {
  		startCmp := bytes.Compare(oldRegion.Meta.StartKey, start)
  		endCmp := bytes.Compare(oldRegion.Meta.EndKey, end)
  		if len(oldRegion.Meta.EndKey) == 0 {
  			endCmp = 1
  		}
  		if startCmp >= 0 && endCmp <= 0 {
  			// The region is within table data, it will be replaced by new regions.
  			delete(c.regions, oldRegion.Meta.Id)
  		} else if startCmp < 0 && endCmp > 0 {
  			// A single Region covers table data, split into two regions that do not overlap table data.
  			oldEnd := oldRegion.Meta.EndKey
  			oldRegion.updateKeyRange(oldRegion.Meta.StartKey, start)
  			peerID := c.allocID()
  			newRegion := newRegion(c.allocID(), []uint64{c.firstStoreID()}, []uint64{peerID}, peerID)
  			newRegion.updateKeyRange(end, oldEnd)
  			c.regions[newRegion.Meta.Id] = newRegion
  		} else if startCmp < 0 {
  			oldRegion.updateKeyRange(oldRegion.Meta.StartKey, start)
  		} else {
  			oldRegion.updateKeyRange(end, oldRegion.Meta.EndKey)
  		}
  	}
  }
docs: // evacuateOldRegionRanges evacuate the range [start, end].
  // Old regions has intersection with [start, end) will be updated or deleted.