github.com/insionng/yougam@v0.0.0-20170714101924-2bc18d833463/libraries/pingcap/tidb/store/tikv/region_cache_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 "fmt" 18 19 . "github.com/insionng/yougam/libraries/pingcap/check" 20 "github.com/insionng/yougam/libraries/pingcap/tidb/store/tikv/mock-tikv" 21 ) 22 23 type testRegionCacheSuite struct { 24 cluster *mocktikv.Cluster 25 store1 uint64 26 store2 uint64 27 peer1 uint64 28 peer2 uint64 29 region1 uint64 30 cache *RegionCache 31 } 32 33 var _ = Suite(&testRegionCacheSuite{}) 34 35 func (s *testRegionCacheSuite) SetUpTest(c *C) { 36 s.cluster = mocktikv.NewCluster() 37 storeIDs, peerIDs, regionID, _ := mocktikv.BootstrapWithMultiStores(s.cluster, 2) 38 s.region1 = regionID 39 s.store1 = storeIDs[0] 40 s.store2 = storeIDs[1] 41 s.peer1 = peerIDs[0] 42 s.peer2 = peerIDs[1] 43 s.cache = NewRegionCache(mocktikv.NewPDClient(s.cluster)) 44 } 45 46 func (s *testRegionCacheSuite) storeAddr(id uint64) string { 47 return fmt.Sprintf("store%d", id) 48 } 49 50 func (s *testRegionCacheSuite) TestSimple(c *C) { 51 r, err := s.cache.GetRegion([]byte("a")) 52 c.Assert(err, IsNil) 53 c.Assert(r, NotNil) 54 c.Assert(r.GetID(), Equals, s.region1) 55 c.Assert(r.GetAddress(), Equals, s.storeAddr(s.store1)) 56 c.Assert(s.cache.regions, HasLen, 1) 57 } 58 59 func (s *testRegionCacheSuite) TestDropStore(c *C) { 60 s.cluster.RemoveStore(s.store1) 61 r, err := s.cache.GetRegion([]byte("a")) 62 c.Assert(err, NotNil) 63 c.Assert(r, IsNil) 64 c.Assert(s.cache.regions, HasLen, 0) 65 } 66 67 func (s *testRegionCacheSuite) TestUpdateLeader(c *C) { 68 r, err := s.cache.GetRegion([]byte("a")) 69 c.Assert(err, IsNil) 70 // tikv-server reports `NotLeader` 71 s.cache.UpdateLeader(r.VerID(), s.peer2) 72 73 r, err = s.cache.GetRegion([]byte("a")) 74 c.Assert(err, IsNil) 75 c.Assert(r, NotNil) 76 c.Assert(r.GetID(), Equals, s.region1) 77 c.Assert(r.curPeerIdx, Equals, 1) 78 c.Assert(r.GetAddress(), Equals, s.storeAddr(s.store2)) 79 } 80 81 func (s *testRegionCacheSuite) TestUpdateLeader2(c *C) { 82 r, err := s.cache.GetRegion([]byte("a")) 83 c.Assert(err, IsNil) 84 // new store3 becomes leader 85 store3 := s.cluster.AllocID() 86 peer3 := s.cluster.AllocID() 87 s.cluster.AddStore(store3, s.storeAddr(store3)) 88 s.cluster.AddPeer(s.region1, store3, peer3) 89 s.cluster.ChangeLeader(s.region1, peer3) 90 // tikv-server reports `NotLeader` 91 s.cache.UpdateLeader(r.VerID(), peer3) 92 93 // Store3 does not exist in cache, causes a reload from PD. 94 r, err = s.cache.GetRegion([]byte("a")) 95 c.Assert(err, IsNil) 96 c.Assert(r, NotNil) 97 c.Assert(r.GetID(), Equals, s.region1) 98 c.Assert(r.curPeerIdx, Equals, 0) 99 c.Assert(r.GetAddress(), Equals, s.storeAddr(s.store1)) 100 101 // tikv-server reports `NotLeader` again. 102 s.cache.UpdateLeader(r.VerID(), peer3) 103 r, err = s.cache.GetRegion([]byte("a")) 104 c.Assert(err, IsNil) 105 c.Assert(r, NotNil) 106 c.Assert(r.GetID(), Equals, s.region1) 107 c.Assert(r.curPeerIdx, Equals, 2) 108 c.Assert(r.GetAddress(), Equals, s.storeAddr(store3)) 109 } 110 111 func (s *testRegionCacheSuite) TestUpdateLeader3(c *C) { 112 r, err := s.cache.GetRegion([]byte("a")) 113 c.Assert(err, IsNil) 114 // store2 becomes leader 115 s.cluster.ChangeLeader(s.region1, s.peer2) 116 // store2 gone, store3 becomes leader 117 s.cluster.RemoveStore(s.store2) 118 store3 := s.cluster.AllocID() 119 peer3 := s.cluster.AllocID() 120 s.cluster.AddStore(store3, s.storeAddr(store3)) 121 s.cluster.AddPeer(s.region1, store3, peer3) 122 s.cluster.ChangeLeader(s.region1, peer3) 123 // tikv-server reports `NotLeader`(store2 is the leader) 124 s.cache.UpdateLeader(r.VerID(), s.peer2) 125 126 // Store2 does not exist any more, causes a reload from PD. 127 r, err = s.cache.GetRegion([]byte("a")) 128 c.Assert(err, IsNil) 129 c.Assert(r, NotNil) 130 c.Assert(r.GetID(), Equals, s.region1) 131 c.Assert(r.curPeerIdx, Equals, 0) 132 c.Assert(r.GetAddress(), Equals, s.storeAddr(s.store1)) 133 134 // tikv-server reports `NotLeader` again. 135 s.cache.UpdateLeader(r.VerID(), peer3) 136 r, err = s.cache.GetRegion([]byte("a")) 137 c.Assert(err, IsNil) 138 c.Assert(r, NotNil) 139 c.Assert(r.GetID(), Equals, s.region1) 140 c.Assert(r.curPeerIdx, Equals, 2) 141 c.Assert(r.GetAddress(), Equals, s.storeAddr(store3)) 142 } 143 144 func (s *testRegionCacheSuite) TestSplit(c *C) { 145 r, err := s.cache.GetRegion([]byte("x")) 146 c.Assert(err, IsNil) 147 c.Assert(r.GetID(), Equals, s.region1) 148 c.Assert(r.GetAddress(), Equals, s.storeAddr(s.store1)) 149 150 // split to ['' - 'm' - 'z'] 151 region2 := s.cluster.AllocID() 152 newPeers := s.cluster.AllocIDs(2) 153 s.cluster.Split(s.region1, region2, []byte("m"), newPeers, newPeers[0]) 154 155 // tikv-server reports `NotInRegion` 156 s.cache.DropRegion(r.VerID()) 157 c.Assert(s.cache.regions, HasLen, 0) 158 159 r, err = s.cache.GetRegion([]byte("x")) 160 c.Assert(err, IsNil) 161 c.Assert(r.GetID(), Equals, region2) 162 c.Assert(r.GetAddress(), Equals, s.storeAddr(s.store1)) 163 c.Assert(s.cache.regions, HasLen, 1) 164 } 165 166 func (s *testRegionCacheSuite) TestMerge(c *C) { 167 // ['' - 'm' - 'z'] 168 region2 := s.cluster.AllocID() 169 newPeers := s.cluster.AllocIDs(2) 170 s.cluster.Split(s.region1, region2, []byte("m"), newPeers, newPeers[0]) 171 172 r, err := s.cache.GetRegion([]byte("x")) 173 c.Assert(err, IsNil) 174 c.Assert(r.GetID(), Equals, region2) 175 176 // merge to single region 177 s.cluster.Merge(s.region1, region2) 178 179 // tikv-server reports `NotInRegion` 180 s.cache.DropRegion(r.VerID()) 181 c.Assert(s.cache.regions, HasLen, 0) 182 183 r, err = s.cache.GetRegion([]byte("x")) 184 c.Assert(err, IsNil) 185 c.Assert(r.GetID(), Equals, s.region1) 186 c.Assert(s.cache.regions, HasLen, 1) 187 } 188 189 func (s *testRegionCacheSuite) TestReconnect(c *C) { 190 r, err := s.cache.GetRegion([]byte("a")) 191 c.Assert(err, IsNil) 192 193 // connect tikv-server failed, cause drop cache 194 s.cache.DropRegion(r.VerID()) 195 196 r, err = s.cache.GetRegion([]byte("a")) 197 c.Assert(err, IsNil) 198 c.Assert(r, NotNil) 199 c.Assert(r.GetID(), Equals, s.region1) 200 c.Assert(r.GetAddress(), Equals, s.storeAddr(s.store1)) 201 c.Assert(s.cache.regions, HasLen, 1) 202 } 203 204 func (s *testRegionCacheSuite) TestNextPeer(c *C) { 205 region, err := s.cache.GetRegion([]byte("a")) 206 c.Assert(err, IsNil) 207 c.Assert(region.curPeerIdx, Equals, 0) 208 209 s.cache.NextPeer(region.VerID()) 210 region, err = s.cache.GetRegion([]byte("a")) 211 c.Assert(err, IsNil) 212 c.Assert(region.curPeerIdx, Equals, 1) 213 214 s.cache.NextPeer(region.VerID()) 215 region, err = s.cache.GetRegion([]byte("a")) 216 c.Assert(err, IsNil) 217 // Out of range of Peers, so get Region again and pick Stores[0] as leader. 218 c.Assert(region.curPeerIdx, Equals, 0) 219 }