mirror of
https://github.com/talent-plan/tinykv.git
synced 2025-01-13 13:50:43 +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>
167 lines
3.8 KiB
Go
167 lines
3.8 KiB
Go
// Copyright 2016 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 server
|
|
|
|
import (
|
|
"context"
|
|
"fmt"
|
|
"testing"
|
|
|
|
"github.com/pingcap-incubator/tinykv/scheduler/pkg/testutil"
|
|
"github.com/pingcap-incubator/tinykv/scheduler/server/config"
|
|
. "github.com/pingcap/check"
|
|
)
|
|
|
|
func TestServer(t *testing.T) {
|
|
EnableZap = true
|
|
TestingT(t)
|
|
}
|
|
|
|
func mustRunTestServer(c *C) (*Server, CleanupFunc) {
|
|
var err error
|
|
server, cleanup, err := NewTestServer(c)
|
|
c.Assert(err, IsNil)
|
|
mustWaitLeader(c, []*Server{server})
|
|
return server, cleanup
|
|
}
|
|
|
|
func mustWaitLeader(c *C, svrs []*Server) *Server {
|
|
var leader *Server
|
|
testutil.WaitUntil(c, func(c *C) bool {
|
|
for _, s := range svrs {
|
|
if !s.IsClosed() && s.member.IsLeader() {
|
|
leader = s
|
|
return true
|
|
}
|
|
}
|
|
return false
|
|
})
|
|
return leader
|
|
}
|
|
|
|
var _ = Suite(&testLeaderServerSuite{})
|
|
|
|
type testLeaderServerSuite struct {
|
|
ctx context.Context
|
|
cancel context.CancelFunc
|
|
svrs map[string]*Server
|
|
leaderPath string
|
|
}
|
|
|
|
func (s *testLeaderServerSuite) SetUpSuite(c *C) {
|
|
s.ctx, s.cancel = context.WithCancel(context.Background())
|
|
s.svrs = make(map[string]*Server)
|
|
|
|
cfgs := NewTestMultiConfig(c, 3)
|
|
|
|
ch := make(chan *Server, 3)
|
|
for i := 0; i < 3; i++ {
|
|
cfg := cfgs[i]
|
|
|
|
go func() {
|
|
svr, err := CreateServer(cfg)
|
|
c.Assert(err, IsNil)
|
|
err = svr.Run(s.ctx)
|
|
c.Assert(err, IsNil)
|
|
ch <- svr
|
|
}()
|
|
}
|
|
|
|
for i := 0; i < 3; i++ {
|
|
svr := <-ch
|
|
s.svrs[svr.GetAddr()] = svr
|
|
s.leaderPath = svr.GetMember().GetLeaderPath()
|
|
}
|
|
}
|
|
|
|
func (s *testLeaderServerSuite) TearDownSuite(c *C) {
|
|
s.cancel()
|
|
for _, svr := range s.svrs {
|
|
svr.Close()
|
|
testutil.CleanServer(svr.cfg)
|
|
}
|
|
}
|
|
|
|
var _ = Suite(&testServerSuite{})
|
|
|
|
type testServerSuite struct{}
|
|
|
|
func newTestServersWithCfgs(ctx context.Context, c *C, cfgs []*config.Config) ([]*Server, CleanupFunc) {
|
|
svrs := make([]*Server, 0, len(cfgs))
|
|
|
|
ch := make(chan *Server)
|
|
for _, cfg := range cfgs {
|
|
go func(cfg *config.Config) {
|
|
svr, err := CreateServer(cfg)
|
|
c.Assert(err, IsNil)
|
|
err = svr.Run(ctx)
|
|
c.Assert(err, IsNil)
|
|
ch <- svr
|
|
}(cfg)
|
|
}
|
|
|
|
for i := 0; i < len(cfgs); i++ {
|
|
svrs = append(svrs, <-ch)
|
|
}
|
|
mustWaitLeader(c, svrs)
|
|
|
|
cleanup := func() {
|
|
for _, svr := range svrs {
|
|
svr.Close()
|
|
}
|
|
for _, cfg := range cfgs {
|
|
testutil.CleanServer(cfg)
|
|
}
|
|
}
|
|
|
|
return svrs, cleanup
|
|
}
|
|
|
|
func (s *testServerSuite) TestCheckClusterID(c *C) {
|
|
ctx, cancel := context.WithCancel(context.Background())
|
|
defer cancel()
|
|
cfgs := NewTestMultiConfig(c, 2)
|
|
for i, cfg := range cfgs {
|
|
cfg.DataDir = fmt.Sprintf("/tmp/test_pd_check_clusterID_%d", i)
|
|
// Clean up before testing.
|
|
testutil.CleanServer(cfg)
|
|
}
|
|
originInitial := cfgs[0].InitialCluster
|
|
for _, cfg := range cfgs {
|
|
cfg.InitialCluster = fmt.Sprintf("%s=%s", cfg.Name, cfg.PeerUrls)
|
|
}
|
|
|
|
cfgA, cfgB := cfgs[0], cfgs[1]
|
|
// Start a standalone cluster
|
|
// TODO: clean up. For now tests failed because:
|
|
// etcdserver: failed to purge snap file ...
|
|
svrsA, cleanA := newTestServersWithCfgs(ctx, c, []*config.Config{cfgA})
|
|
defer cleanA()
|
|
// Close it.
|
|
for _, svr := range svrsA {
|
|
svr.Close()
|
|
}
|
|
|
|
// Start another cluster.
|
|
_, cleanB := newTestServersWithCfgs(ctx, c, []*config.Config{cfgB})
|
|
defer cleanB()
|
|
|
|
// Start previous cluster, expect an error.
|
|
cfgA.InitialCluster = originInitial
|
|
svr, err := CreateServer(cfgA)
|
|
c.Assert(err, IsNil)
|
|
err = svr.Run(ctx)
|
|
c.Assert(err, NotNil)
|
|
}
|