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  }