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 }