mirror of
https://github.com/talent-plan/tinykv.git
synced 2024-12-28 05:40:10 +08:00
5e089a2cd1
Signed-off-by: Connor <zbk602423539@gmail.com> Co-authored-by: Nick Cameron <nrc@ncameron.org> Co-authored-by: linning <linningde25@gmail.com> Co-authored-by: YangKeao <keao.yang@yahoo.com> Co-authored-by: andylokandy <andylokandy@hotmail.com> Co-authored-by: Iosmanthus Teng <myosmanthustree@gmail.com>
135 lines
4.6 KiB
Go
135 lines
4.6 KiB
Go
// Copyright 2018 PingCAP, Inc.
|
|
//
|
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
|
// you may not use this file except in compliance with the License.
|
|
// You may obtain a copy of the License at
|
|
//
|
|
// http://www.apache.org/licenses/LICENSE-2.0
|
|
//
|
|
// Unless required by applicable law or agreed to in writing, software
|
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
|
// See the License for the specific language governing permissions and
|
|
// limitations under the License.
|
|
|
|
package schedule
|
|
|
|
import (
|
|
"context"
|
|
"testing"
|
|
"time"
|
|
|
|
"github.com/pingcap-incubator/tinykv/proto/pkg/metapb"
|
|
"github.com/pingcap-incubator/tinykv/proto/pkg/schedulerpb"
|
|
"github.com/pingcap-incubator/tinykv/scheduler/pkg/mock/mockcluster"
|
|
"github.com/pingcap-incubator/tinykv/scheduler/pkg/mock/mockhbstream"
|
|
"github.com/pingcap-incubator/tinykv/scheduler/pkg/mock/mockoption"
|
|
"github.com/pingcap-incubator/tinykv/scheduler/server/schedule/operator"
|
|
. "github.com/pingcap/check"
|
|
)
|
|
|
|
func Test(t *testing.T) {
|
|
TestingT(t)
|
|
}
|
|
|
|
var _ = Suite(&testOperatorControllerSuite{})
|
|
|
|
type testOperatorControllerSuite struct {
|
|
ctx context.Context
|
|
cancel context.CancelFunc
|
|
}
|
|
|
|
func (t *testOperatorControllerSuite) SetUpSuite(c *C) {
|
|
t.ctx, t.cancel = context.WithCancel(context.Background())
|
|
}
|
|
|
|
func (t *testOperatorControllerSuite) TearDownSuite(c *C) {
|
|
t.cancel()
|
|
}
|
|
|
|
func (t *testOperatorControllerSuite) TestOperatorStatus(c *C) {
|
|
opt := mockoption.NewScheduleOptions()
|
|
tc := mockcluster.NewCluster(opt)
|
|
oc := NewOperatorController(t.ctx, tc, mockhbstream.NewHeartbeatStream())
|
|
tc.AddLeaderStore(1, 2)
|
|
tc.AddLeaderStore(2, 0)
|
|
tc.AddLeaderRegion(1, 1, 2)
|
|
tc.AddLeaderRegion(2, 1, 2)
|
|
steps := []operator.OpStep{
|
|
operator.RemovePeer{FromStore: 2},
|
|
operator.AddPeer{ToStore: 2, PeerID: 4},
|
|
}
|
|
op1 := operator.NewOperator("test", "test", 1, &metapb.RegionEpoch{}, operator.OpRegion, steps...)
|
|
op2 := operator.NewOperator("test", "test", 2, &metapb.RegionEpoch{}, operator.OpRegion, steps...)
|
|
region1 := tc.GetRegion(1)
|
|
region2 := tc.GetRegion(2)
|
|
op1.SetStartTime(time.Now())
|
|
oc.SetOperator(op1)
|
|
op2.SetStartTime(time.Now())
|
|
oc.SetOperator(op2)
|
|
c.Assert(oc.GetOperatorStatus(1).Status, Equals, schedulerpb.OperatorStatus_RUNNING)
|
|
c.Assert(oc.GetOperatorStatus(2).Status, Equals, schedulerpb.OperatorStatus_RUNNING)
|
|
op1.SetStartTime(time.Now().Add(-10 * time.Minute))
|
|
region2 = ApplyOperatorStep(region2, op2)
|
|
tc.PutRegion(region2)
|
|
oc.Dispatch(region1, "test")
|
|
oc.Dispatch(region2, "test")
|
|
c.Assert(oc.GetOperatorStatus(1).Status, Equals, schedulerpb.OperatorStatus_TIMEOUT)
|
|
c.Assert(oc.GetOperatorStatus(2).Status, Equals, schedulerpb.OperatorStatus_RUNNING)
|
|
ApplyOperator(tc, op2)
|
|
oc.Dispatch(region2, "test")
|
|
c.Assert(oc.GetOperatorStatus(2).Status, Equals, schedulerpb.OperatorStatus_SUCCESS)
|
|
}
|
|
|
|
// #1652
|
|
func (t *testOperatorControllerSuite) TestDispatchOutdatedRegion(c *C) {
|
|
cluster := mockcluster.NewCluster(mockoption.NewScheduleOptions())
|
|
stream := mockhbstream.NewHeartbeatStreams(cluster.ID)
|
|
controller := NewOperatorController(t.ctx, cluster, stream)
|
|
|
|
cluster.AddLeaderStore(1, 2)
|
|
cluster.AddLeaderStore(2, 0)
|
|
cluster.AddLeaderRegion(1, 1, 2)
|
|
steps := []operator.OpStep{
|
|
operator.TransferLeader{FromStore: 1, ToStore: 2},
|
|
operator.RemovePeer{FromStore: 1},
|
|
}
|
|
|
|
op := operator.NewOperator("test", "test", 1,
|
|
&metapb.RegionEpoch{ConfVer: 0, Version: 0},
|
|
operator.OpRegion, steps...)
|
|
c.Assert(controller.AddOperator(op), Equals, true)
|
|
c.Assert(len(stream.MsgCh()), Equals, 1)
|
|
|
|
// report the result of transferring leader
|
|
region := cluster.MockRegionInfo(1, 2, []uint64{1, 2},
|
|
&metapb.RegionEpoch{ConfVer: 0, Version: 0})
|
|
|
|
controller.Dispatch(region, DispatchFromHeartBeat)
|
|
c.Assert(op.ConfVerChanged(region), Equals, 0)
|
|
c.Assert(len(stream.MsgCh()), Equals, 2)
|
|
|
|
// report the result of removing peer
|
|
region = cluster.MockRegionInfo(1, 2, []uint64{2},
|
|
&metapb.RegionEpoch{ConfVer: 0, Version: 0})
|
|
|
|
controller.Dispatch(region, DispatchFromHeartBeat)
|
|
c.Assert(op.ConfVerChanged(region), Equals, 1)
|
|
c.Assert(len(stream.MsgCh()), Equals, 2)
|
|
|
|
// add and disaptch op again, the op should be stale
|
|
op = operator.NewOperator("test", "test", 1,
|
|
&metapb.RegionEpoch{ConfVer: 0, Version: 0},
|
|
operator.OpRegion, steps...)
|
|
c.Assert(controller.AddOperator(op), Equals, true)
|
|
c.Assert(op.ConfVerChanged(region), Equals, 0)
|
|
c.Assert(len(stream.MsgCh()), Equals, 3)
|
|
|
|
// report region with an abnormal confver
|
|
region = cluster.MockRegionInfo(1, 1, []uint64{1, 2},
|
|
&metapb.RegionEpoch{ConfVer: 1, Version: 0})
|
|
controller.Dispatch(region, DispatchFromHeartBeat)
|
|
c.Assert(op.ConfVerChanged(region), Equals, 0)
|
|
// no new step
|
|
c.Assert(len(stream.MsgCh()), Equals, 3)
|
|
}
|