diff --git a/server/cluster_worker.go b/server/cluster_worker.go index c92b66313a7..216a7fbff5b 100644 --- a/server/cluster_worker.go +++ b/server/cluster_worker.go @@ -93,14 +93,14 @@ func (c *RaftCluster) handleReportSplit(request *pdpb.ReportSplitRequest) (*pdpb } // Build origin region by using left and right. - originRegion := proto.Clone(left).(*metapb.Region) + originRegion := proto.Clone(right).(*metapb.Region) originRegion.RegionEpoch = nil - originRegion.EndKey = right.GetEndKey() + originRegion.StartKey = left.GetStartKey() // Wrap report split as an Operator, and add it into history cache. op := newSplitOperator(originRegion, left, right) c.coordinator.histories.add(originRegion.GetId(), op) - log.Infof("[region %d] region split, generate new region: %v", originRegion.GetId(), right) + log.Infof("[region %d] region split, generate new region: %v", originRegion.GetId(), left) c.coordinator.postEvent(op, evtEnd) return &pdpb.ReportSplitResponse{}, nil diff --git a/server/cluster_worker_test.go b/server/cluster_worker_test.go index 29a04e76433..5cf12c539e3 100644 --- a/server/cluster_worker_test.go +++ b/server/cluster_worker_test.go @@ -307,7 +307,7 @@ func splitRegion(c *C, old *metapb.Region, splitKey []byte, newRegionID uint64, return newRegion } -func (s *testClusterWorkerSuite) heartbeatRegion(c *C, clusterID uint64, msgID uint64, region *metapb.Region, leader *metapb.Peer) *pdpb.RegionHeartbeatResponse { +func (s *testClusterWorkerSuite) heartbeatRegion(c *C, clusterID uint64, msgID uint64, region *metapb.Region, leader *metapb.Peer, expectNil bool) *pdpb.RegionHeartbeatResponse { req := &pdpb.RegionHeartbeatRequest{ Header: newRequestHeader(clusterID), Leader: leader, @@ -318,8 +318,13 @@ func (s *testClusterWorkerSuite) heartbeatRegion(c *C, clusterID uint64, msgID u err := s.regionHeartbeat.Send(req) c.Assert(err, IsNil) + timeout := time.Millisecond * 500 + if expectNil { + timeout = time.Millisecond * 50 + } + select { - case <-time.After(time.Millisecond * 200): + case <-time.After(timeout): return nil case res := <-s.heartbeatRespCh: return res @@ -378,7 +383,7 @@ func (s *testClusterWorkerSuite) TestHeartbeatSplit(c *C) { leaderPeer1 := s.chooseRegionLeader(c, r1) - s.heartbeatRegion(c, s.clusterID, 0, r1, leaderPeer1) + s.heartbeatRegion(c, s.clusterID, 0, r1, leaderPeer1, true) checkSearchRegions(c, cluster, []byte{}) mustGetRegion(c, cluster, []byte("a"), r1) @@ -386,7 +391,7 @@ func (s *testClusterWorkerSuite) TestHeartbeatSplit(c *C) { mustGetRegion(c, cluster, []byte("z"), nil) leaderPeer2 := s.chooseRegionLeader(c, r2) - s.heartbeatRegion(c, s.clusterID, 0, r2, leaderPeer2) + s.heartbeatRegion(c, s.clusterID, 0, r2, leaderPeer2, true) checkSearchRegions(c, cluster, []byte{}, []byte("m")) mustGetRegion(c, cluster, []byte("z"), r2) @@ -397,7 +402,7 @@ func (s *testClusterWorkerSuite) TestHeartbeatSplit(c *C) { leaderPeer3 := s.chooseRegionLeader(c, r3) - s.heartbeatRegion(c, s.clusterID, 0, r3, leaderPeer3) + s.heartbeatRegion(c, s.clusterID, 0, r3, leaderPeer3, true) checkSearchRegions(c, cluster, []byte{}, []byte("q")) mustGetRegion(c, cluster, []byte("z"), r3) @@ -405,7 +410,7 @@ func (s *testClusterWorkerSuite) TestHeartbeatSplit(c *C) { // [m, q) is missing before r2's heartbeat. mustGetRegion(c, cluster, []byte("n"), nil) - s.heartbeatRegion(c, s.clusterID, 0, r2, leaderPeer2) + s.heartbeatRegion(c, s.clusterID, 0, r2, leaderPeer2, true) checkSearchRegions(c, cluster, []byte{}, []byte("m"), []byte("q")) mustGetRegion(c, cluster, []byte("n"), r2) @@ -429,7 +434,7 @@ func (s *testClusterWorkerSuite) TestHeartbeatSplit2(c *C) { // Add Peers util all stores are used up. for { - resp := s.heartbeatRegion(c, s.clusterID, 0, r1, leaderPeer) + resp := s.heartbeatRegion(c, s.clusterID, 0, r1, leaderPeer, false) if resp == nil { break } @@ -441,7 +446,7 @@ func (s *testClusterWorkerSuite) TestHeartbeatSplit2(c *C) { r2 := splitRegion(c, r1, []byte("m"), r2ID, r2PeerIDs) leaderPeer2 := s.chooseRegionLeader(c, r2) - resp := s.heartbeatRegion(c, s.clusterID, 0, r2, leaderPeer2) + resp := s.heartbeatRegion(c, s.clusterID, 0, r2, leaderPeer2, true) c.Assert(resp, IsNil) mustGetRegion(c, cluster, []byte("m"), r2) @@ -470,7 +475,7 @@ func (s *testClusterWorkerSuite) TestHeartbeatChangePeer(c *C) { // Add 4 peers. for i := 0; i < 4; i++ { - resp := s.heartbeatRegion(c, s.clusterID, 0, region, leaderPeer) + resp := s.heartbeatRegion(c, s.clusterID, 0, region, leaderPeer, false) c.Assert(resp, NotNil) // Check RegionHeartbeat response. s.checkChangePeerRes(c, resp.GetChangePeer(), pdpb.ConfChangeType_AddNode, region) @@ -478,7 +483,7 @@ func (s *testClusterWorkerSuite) TestHeartbeatChangePeer(c *C) { // Update region epoch and check region info. region.RegionEpoch.ConfVer = region.GetRegionEpoch().GetConfVer() + 1 - s.heartbeatRegion(c, s.clusterID, 0, region, leaderPeer) + s.heartbeatRegion(c, s.clusterID, 0, region, leaderPeer, false) // Check region peer count. region = s.checkRegionPeerCount(c, regionKey, i+2) @@ -491,7 +496,7 @@ func (s *testClusterWorkerSuite) TestHeartbeatChangePeer(c *C) { // Remove 2 peers peerCount := 5 for { - resp := s.heartbeatRegion(c, s.clusterID, 0, region, leaderPeer) + resp := s.heartbeatRegion(c, s.clusterID, 0, region, leaderPeer, false) if resp == nil { break } @@ -505,7 +510,7 @@ func (s *testClusterWorkerSuite) TestHeartbeatChangePeer(c *C) { // Update region epoch and check region info. region.RegionEpoch.ConfVer = region.GetRegionEpoch().GetConfVer() + 1 - s.heartbeatRegion(c, s.clusterID, 0, region, leaderPeer) + s.heartbeatRegion(c, s.clusterID, 0, region, leaderPeer, false) // Check region peer count. peerCount-- @@ -525,7 +530,7 @@ func (s *testClusterWorkerSuite) TestHeartbeatSplitAddPeer(c *C) { leaderPeer1 := s.chooseRegionLeader(c, r1) // First sync, pd-server will return a AddPeer. - resp := s.heartbeatRegion(c, s.clusterID, 0, r1, leaderPeer1) + resp := s.heartbeatRegion(c, s.clusterID, 0, r1, leaderPeer1, false) // Apply the AddPeer ConfChange, but with no sync. s.checkChangePeerRes(c, resp.GetChangePeer(), pdpb.ConfChangeType_AddNode, r1) // Split 1 to 1: [nil, m) 2: [m, nil). @@ -533,7 +538,7 @@ func (s *testClusterWorkerSuite) TestHeartbeatSplitAddPeer(c *C) { r2 := splitRegion(c, r1, []byte("m"), r2ID, r2PeerIDs) // Sync r1 with both ConfVer and Version updated. - resp = s.heartbeatRegion(c, s.clusterID, 0, r1, leaderPeer1) + resp = s.heartbeatRegion(c, s.clusterID, 0, r1, leaderPeer1, true) c.Assert(resp, IsNil) mustGetRegion(c, cluster, []byte("a"), r1) @@ -541,7 +546,7 @@ func (s *testClusterWorkerSuite) TestHeartbeatSplitAddPeer(c *C) { // Sync r2. leaderPeer2 := s.chooseRegionLeader(c, r2) - resp = s.heartbeatRegion(c, s.clusterID, 0, r2, leaderPeer2) + resp = s.heartbeatRegion(c, s.clusterID, 0, r2, leaderPeer2, true) c.Assert(resp, IsNil) } @@ -577,13 +582,13 @@ func (s *testClusterWorkerSuite) TestReportSplit(c *C) { // Mock a report split request. peer := s.newPeer(c, 999, 0) - left := s.newRegion(c, 0, []byte("aaa"), []byte("bbb"), []*metapb.Peer{peer}, nil) - right := s.newRegion(c, 0, []byte("bbb"), []byte("ccc"), []*metapb.Peer{peer}, nil) + left := s.newRegion(c, 2, []byte("aaa"), []byte("bbb"), []*metapb.Peer{peer}, nil) + right := s.newRegion(c, 1, []byte("bbb"), []byte("ccc"), []*metapb.Peer{peer}, nil) resp := s.reportSplit(c, 0, left, right) c.Assert(resp, NotNil) - regionID := left.GetId() + regionID := right.GetId() value, ok := cluster.coordinator.histories.get(regionID) c.Assert(ok, IsTrue)