talent-plan-tinykv/scheduler/server/schedule/operator_controller_test.go
Connor 5e089a2cd1 init course framework
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>
2020-04-30 15:25:07 +08:00

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)
}