github.com/insionng/yougam@v0.0.0-20170714101924-2bc18d833463/libraries/pingcap/tidb/store/tikv/coprocessor_test.go (about)

     1  // Copyright 2016 PingCAP, Inc.
     2  //
     3  // Licensed under the Apache License, Version 2.0 (the "License");
     4  // you may not use this file except in compliance with the License.
     5  // You may obtain a copy of the License at
     6  //
     7  //     http://www.apache.org/licenses/LICENSE-2.0
     8  //
     9  // Unless required by applicable law or agreed to in writing, software
    10  // distributed under the License is distributed on an "AS IS" BASIS,
    11  // See the License for the specific language governing permissions and
    12  // limitations under the License.
    13  
    14  package tikv
    15  
    16  import (
    17  	. "github.com/insionng/yougam/libraries/pingcap/check"
    18  	"github.com/insionng/yougam/libraries/pingcap/tidb/kv"
    19  	"github.com/insionng/yougam/libraries/pingcap/tidb/store/tikv/mock-tikv"
    20  )
    21  
    22  type testCoprocessorSuite struct{}
    23  
    24  var _ = Suite(&testCoprocessorSuite{})
    25  
    26  func (s *testCoprocessorSuite) TestBuildTasks(c *C) {
    27  	// nil --- 'g' --- 'n' --- 't' --- nil
    28  	// <-  0  -> <- 1 -> <- 2 -> <- 3 ->
    29  	cluster := mocktikv.NewCluster()
    30  	_, regionIDs, _ := mocktikv.BootstrapWithMultiRegions(cluster, []byte("g"), []byte("n"), []byte("t"))
    31  	cache := NewRegionCache(mocktikv.NewPDClient(cluster))
    32  
    33  	tasks, err := buildCopTasks(cache, s.buildKeyRanges("a", "c"), false)
    34  	c.Assert(err, IsNil)
    35  	c.Assert(tasks, HasLen, 1)
    36  	s.taskEqual(c, tasks[0], regionIDs[0], "a", "c")
    37  
    38  	tasks, err = buildCopTasks(cache, s.buildKeyRanges("g", "n"), false)
    39  	c.Assert(err, IsNil)
    40  	c.Assert(tasks, HasLen, 1)
    41  	s.taskEqual(c, tasks[0], regionIDs[1], "g", "n")
    42  
    43  	tasks, err = buildCopTasks(cache, s.buildKeyRanges("m", "n"), false)
    44  	c.Assert(err, IsNil)
    45  	c.Assert(tasks, HasLen, 1)
    46  	s.taskEqual(c, tasks[0], regionIDs[1], "m", "n")
    47  
    48  	tasks, err = buildCopTasks(cache, s.buildKeyRanges("a", "k"), false)
    49  	c.Assert(err, IsNil)
    50  	c.Assert(tasks, HasLen, 2)
    51  	s.taskEqual(c, tasks[0], regionIDs[0], "a", "g")
    52  	s.taskEqual(c, tasks[1], regionIDs[1], "g", "k")
    53  
    54  	tasks, err = buildCopTasks(cache, s.buildKeyRanges("a", "x"), false)
    55  	c.Assert(err, IsNil)
    56  	c.Assert(tasks, HasLen, 4)
    57  	s.taskEqual(c, tasks[0], regionIDs[0], "a", "g")
    58  	s.taskEqual(c, tasks[1], regionIDs[1], "g", "n")
    59  	s.taskEqual(c, tasks[2], regionIDs[2], "n", "t")
    60  	s.taskEqual(c, tasks[3], regionIDs[3], "t", "x")
    61  
    62  	tasks, err = buildCopTasks(cache, s.buildKeyRanges("a", "b", "b", "c"), false)
    63  	c.Assert(err, IsNil)
    64  	c.Assert(tasks, HasLen, 1)
    65  	s.taskEqual(c, tasks[0], regionIDs[0], "a", "b", "b", "c")
    66  
    67  	tasks, err = buildCopTasks(cache, s.buildKeyRanges("a", "b", "e", "f"), false)
    68  	c.Assert(err, IsNil)
    69  	c.Assert(tasks, HasLen, 1)
    70  	s.taskEqual(c, tasks[0], regionIDs[0], "a", "b", "e", "f")
    71  
    72  	tasks, err = buildCopTasks(cache, s.buildKeyRanges("g", "n", "o", "p"), false)
    73  	c.Assert(err, IsNil)
    74  	c.Assert(tasks, HasLen, 2)
    75  	s.taskEqual(c, tasks[0], regionIDs[1], "g", "n")
    76  	s.taskEqual(c, tasks[1], regionIDs[2], "o", "p")
    77  
    78  	tasks, err = buildCopTasks(cache, s.buildKeyRanges("h", "k", "m", "p"), false)
    79  	c.Assert(err, IsNil)
    80  	c.Assert(tasks, HasLen, 2)
    81  	s.taskEqual(c, tasks[0], regionIDs[1], "h", "k", "m", "n")
    82  	s.taskEqual(c, tasks[1], regionIDs[2], "n", "p")
    83  }
    84  
    85  func (s *testCoprocessorSuite) TestRebuild(c *C) {
    86  	// nil --- 'm' --- nil
    87  	// <-  0  -> <- 1 ->
    88  	cluster := mocktikv.NewCluster()
    89  	storeID, regionIDs, peerIDs := mocktikv.BootstrapWithMultiRegions(cluster, []byte("m"))
    90  	cache := NewRegionCache(mocktikv.NewPDClient(cluster))
    91  
    92  	tasks, err := buildCopTasks(cache, s.buildKeyRanges("a", "z"), false)
    93  	c.Assert(err, IsNil)
    94  	c.Assert(tasks, HasLen, 2)
    95  	s.taskEqual(c, tasks[0], regionIDs[0], "a", "m")
    96  	s.taskEqual(c, tasks[1], regionIDs[1], "m", "z")
    97  
    98  	// nil -- 'm' -- 'q' -- nil
    99  	// <-  0 -> <--1-> <-2-->
   100  	regionIDs = append(regionIDs, cluster.AllocID())
   101  	peerIDs = append(peerIDs, cluster.AllocID())
   102  	cluster.Split(regionIDs[1], regionIDs[2], []byte("q"), []uint64{peerIDs[2]}, storeID)
   103  	cache.DropRegion(tasks[1].region.VerID())
   104  
   105  	tasks, err = buildCopTasks(cache, s.buildKeyRanges("a", "z"), true)
   106  	c.Assert(err, IsNil)
   107  	iter := &copIterator{
   108  		store: &tikvStore{
   109  			regionCache: cache,
   110  		},
   111  		req: &kv.Request{
   112  			Desc: true,
   113  		},
   114  		tasks: tasks,
   115  	}
   116  	err = iter.rebuildCurrentTask(iter.tasks[0])
   117  	c.Assert(err, IsNil)
   118  	c.Assert(iter.tasks, HasLen, 3)
   119  	s.taskEqual(c, iter.tasks[2], regionIDs[0], "a", "m")
   120  	s.taskEqual(c, iter.tasks[1], regionIDs[1], "m", "q")
   121  	s.taskEqual(c, iter.tasks[0], regionIDs[2], "q", "z")
   122  
   123  	tasks, err = buildCopTasks(cache, s.buildKeyRanges("a", "z"), true)
   124  	iter = &copIterator{
   125  		store: &tikvStore{
   126  			regionCache: cache,
   127  		},
   128  		req: &kv.Request{
   129  			Desc: false,
   130  		},
   131  		tasks: tasks,
   132  	}
   133  	err = iter.rebuildCurrentTask(iter.tasks[2])
   134  	c.Assert(err, IsNil)
   135  	c.Assert(iter.tasks, HasLen, 3)
   136  	s.taskEqual(c, iter.tasks[2], regionIDs[0], "a", "m")
   137  	s.taskEqual(c, iter.tasks[1], regionIDs[1], "m", "q")
   138  	s.taskEqual(c, iter.tasks[0], regionIDs[2], "q", "z")
   139  }
   140  
   141  func (s *testCoprocessorSuite) buildKeyRanges(keys ...string) []kv.KeyRange {
   142  	var ranges []kv.KeyRange
   143  	for i := 0; i < len(keys); i += 2 {
   144  		ranges = append(ranges, kv.KeyRange{
   145  			StartKey: []byte(keys[i]),
   146  			EndKey:   []byte(keys[i+1]),
   147  		})
   148  	}
   149  	return ranges
   150  }
   151  
   152  func (s *testCoprocessorSuite) taskEqual(c *C, task *copTask, regionID uint64, keys ...string) {
   153  	c.Assert(task.region.GetID(), Equals, regionID)
   154  	for i, r := range task.ranges {
   155  		c.Assert(string(r.StartKey), Equals, keys[2*i])
   156  		c.Assert(string(r.EndKey), Equals, keys[2*i+1])
   157  	}
   158  }