server: start to listen after init stats complete (#51472)
close pingcap/tidb#51473
This commit is contained in:
@ -88,6 +88,7 @@ func NewCluster() (*Cluster, error) {
|
||||
// Start runs a mock cluster.
|
||||
func (mock *Cluster) Start() error {
|
||||
server.RunInGoTest = true
|
||||
server.RunInGoTestChan = make(chan struct{})
|
||||
mock.TiDBDriver = server.NewTiDBDriver(mock.Storage)
|
||||
cfg := config.NewConfig()
|
||||
// let tidb random select a port
|
||||
@ -107,6 +108,7 @@ func (mock *Cluster) Start() error {
|
||||
panic(err1)
|
||||
}
|
||||
}()
|
||||
<-server.RunInGoTestChan
|
||||
mock.DSN = waitUntilServerOnline("127.0.0.1", cfg.Status.StatusPort)
|
||||
return nil
|
||||
}
|
||||
@ -181,7 +183,8 @@ func waitUntilServerOnline(addr string, statusPort uint) string {
|
||||
}
|
||||
if retry == retryTime {
|
||||
log.Panic("failed to connect HTTP status in every 10 ms",
|
||||
zap.Int("retryTime", retryTime))
|
||||
zap.Int("retryTime", retryTime),
|
||||
zap.String("url", statusURL))
|
||||
}
|
||||
return strings.SplitAfter(dsn, "/")[0]
|
||||
}
|
||||
|
||||
@ -302,11 +302,6 @@ func main() {
|
||||
storage, dom := createStoreAndDomain(keyspaceName)
|
||||
svr := createServer(storage, dom)
|
||||
|
||||
// Register error API is not thread-safe, the caller MUST NOT register errors after initialization.
|
||||
// To prevent misuse, set a flag to indicate that register new error will panic immediately.
|
||||
// For regression of issue like https://github.com/pingcap/tidb/issues/28190
|
||||
terror.RegisterFinish()
|
||||
|
||||
exited := make(chan struct{})
|
||||
signal.SetupSignalHandler(func() {
|
||||
svr.Close()
|
||||
@ -317,7 +312,6 @@ func main() {
|
||||
close(exited)
|
||||
})
|
||||
topsql.SetupTopSQL()
|
||||
|
||||
terror.MustNil(svr.Run(dom))
|
||||
<-exited
|
||||
syncLog()
|
||||
|
||||
@ -24,6 +24,7 @@ import (
|
||||
|
||||
func TestMain(m *testing.M) {
|
||||
server.RunInGoTest = true
|
||||
server.RunInGoTestChan = make(chan struct{})
|
||||
testsetup.SetupForCommonTest()
|
||||
opts := []goleak.Option{
|
||||
goleak.IgnoreTopFunction("github.com/golang/glog.(*fileSink).flushDaemon"),
|
||||
|
||||
@ -113,6 +113,7 @@ go_library(
|
||||
"@com_github_pingcap_kvproto//pkg/diagnosticspb",
|
||||
"@com_github_pingcap_kvproto//pkg/mpp",
|
||||
"@com_github_pingcap_kvproto//pkg/tikvpb",
|
||||
"@com_github_pingcap_log//:log",
|
||||
"@com_github_pingcap_sysutil//:sysutil",
|
||||
"@com_github_prometheus_client_golang//prometheus",
|
||||
"@com_github_prometheus_client_golang//prometheus/promhttp",
|
||||
|
||||
@ -59,13 +59,13 @@ func TestExtractHandler(t *testing.T) {
|
||||
dom, err := session.GetDomain(store)
|
||||
require.NoError(t, err)
|
||||
server.SetDomain(dom)
|
||||
|
||||
client.Port = testutil.GetPortFromTCPAddr(server.ListenAddr())
|
||||
client.StatusPort = testutil.GetPortFromTCPAddr(server.StatusListenerAddr())
|
||||
go func() {
|
||||
err := server.Run(nil)
|
||||
require.NoError(t, err)
|
||||
}()
|
||||
<-server2.RunInGoTestChan
|
||||
client.Port = testutil.GetPortFromTCPAddr(server.ListenAddr())
|
||||
client.StatusPort = testutil.GetPortFromTCPAddr(server.StatusListenerAddr())
|
||||
client.WaitUntilServerOnline()
|
||||
startTime := time.Now()
|
||||
time.Sleep(time.Second)
|
||||
|
||||
@ -33,6 +33,7 @@ import (
|
||||
|
||||
func TestMain(m *testing.M) {
|
||||
server.RunInGoTest = true
|
||||
server.RunInGoTestChan = make(chan struct{})
|
||||
testsetup.SetupForCommonTest()
|
||||
topsqlstate.EnableTopSQL()
|
||||
unistore.CheckResourceTagForTopSQLInGoTest = true
|
||||
|
||||
@ -33,6 +33,7 @@ import (
|
||||
|
||||
func TestMain(m *testing.M) {
|
||||
server.RunInGoTest = true
|
||||
server.RunInGoTestChan = make(chan struct{})
|
||||
testsetup.SetupForCommonTest()
|
||||
topsqlstate.EnableTopSQL()
|
||||
unistore.CheckResourceTagForTopSQLInGoTest = true
|
||||
|
||||
@ -49,12 +49,13 @@ func TestDumpOptimizeTraceAPI(t *testing.T) {
|
||||
require.NoError(t, err)
|
||||
server.SetDomain(dom)
|
||||
|
||||
client.Port = testutil.GetPortFromTCPAddr(server.ListenAddr())
|
||||
client.StatusPort = testutil.GetPortFromTCPAddr(server.StatusListenerAddr())
|
||||
go func() {
|
||||
err := server.Run(nil)
|
||||
require.NoError(t, err)
|
||||
}()
|
||||
<-server2.RunInGoTestChan
|
||||
client.Port = testutil.GetPortFromTCPAddr(server.ListenAddr())
|
||||
client.StatusPort = testutil.GetPortFromTCPAddr(server.StatusListenerAddr())
|
||||
client.WaitUntilServerOnline()
|
||||
|
||||
statsHandler := optimizor.NewStatsHandler(dom)
|
||||
|
||||
@ -97,7 +97,7 @@ func prepareServerAndClientForTest(t *testing.T, store kv.Storage, dom *domain.D
|
||||
err := srv.Run(nil)
|
||||
require.NoError(t, err)
|
||||
}()
|
||||
|
||||
<-server.RunInGoTestChan
|
||||
client.Port = testutil.GetPortFromTCPAddr(srv.ListenAddr())
|
||||
client.StatusPort = testutil.GetPortFromTCPAddr(srv.StatusListenerAddr())
|
||||
client.WaitUntilServerOnline()
|
||||
|
||||
@ -55,13 +55,13 @@ func TestDumpStatsAPI(t *testing.T) {
|
||||
dom, err := session.GetDomain(store)
|
||||
require.NoError(t, err)
|
||||
server.SetDomain(dom)
|
||||
|
||||
client.Port = testutil.GetPortFromTCPAddr(server.ListenAddr())
|
||||
client.StatusPort = testutil.GetPortFromTCPAddr(server.StatusListenerAddr())
|
||||
go func() {
|
||||
err := server.Run(nil)
|
||||
require.NoError(t, err)
|
||||
}()
|
||||
<-server2.RunInGoTestChan
|
||||
client.Port = testutil.GetPortFromTCPAddr(server.ListenAddr())
|
||||
client.StatusPort = testutil.GetPortFromTCPAddr(server.StatusListenerAddr())
|
||||
client.WaitUntilServerOnline()
|
||||
|
||||
statsHandler := optimizor.NewStatsHandler(dom)
|
||||
|
||||
@ -463,17 +463,18 @@ func (ts *basicHTTPHandlerTestSuite) startServer(t *testing.T) {
|
||||
cfg.Port = 0
|
||||
cfg.Status.StatusPort = 0
|
||||
cfg.Status.ReportStatus = true
|
||||
|
||||
server2.RunInGoTestChan = make(chan struct{})
|
||||
server, err := server2.NewServer(cfg, ts.tidbdrv)
|
||||
require.NoError(t, err)
|
||||
ts.Port = testutil.GetPortFromTCPAddr(server.ListenAddr())
|
||||
ts.StatusPort = testutil.GetPortFromTCPAddr(server.StatusListenerAddr())
|
||||
ts.server = server
|
||||
ts.server.SetDomain(ts.domain)
|
||||
go func() {
|
||||
err := server.Run(ts.domain)
|
||||
require.NoError(t, err)
|
||||
}()
|
||||
<-server2.RunInGoTestChan
|
||||
ts.Port = testutil.GetPortFromTCPAddr(server.ListenAddr())
|
||||
ts.StatusPort = testutil.GetPortFromTCPAddr(server.StatusListenerAddr())
|
||||
ts.WaitUntilServerOnline()
|
||||
|
||||
do, err := session.GetDomain(ts.store)
|
||||
|
||||
@ -33,6 +33,7 @@ import (
|
||||
|
||||
func TestMain(m *testing.M) {
|
||||
server.RunInGoTest = true
|
||||
server.RunInGoTestChan = make(chan struct{})
|
||||
testsetup.SetupForCommonTest()
|
||||
topsqlstate.EnableTopSQL()
|
||||
unistore.CheckResourceTagForTopSQLInGoTest = true
|
||||
|
||||
@ -67,8 +67,13 @@ import (
|
||||
|
||||
const defaultStatusPort = 10080
|
||||
|
||||
func (s *Server) startStatusHTTP() {
|
||||
func (s *Server) startStatusHTTP() error {
|
||||
err := s.initHTTPListener()
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
go s.startHTTPServer()
|
||||
return nil
|
||||
}
|
||||
|
||||
func serveError(w http.ResponseWriter, status int, txt string) {
|
||||
|
||||
@ -49,6 +49,7 @@ import (
|
||||
|
||||
"github.com/blacktear23/go-proxyprotocol"
|
||||
"github.com/pingcap/errors"
|
||||
"github.com/pingcap/log"
|
||||
autoid "github.com/pingcap/tidb/pkg/autoid_service"
|
||||
"github.com/pingcap/tidb/pkg/config"
|
||||
"github.com/pingcap/tidb/pkg/domain"
|
||||
@ -83,6 +84,8 @@ var (
|
||||
osVersion string
|
||||
// RunInGoTest represents whether we are run code in test.
|
||||
RunInGoTest bool
|
||||
// RunInGoTestChan is used to control the RunInGoTest.
|
||||
RunInGoTestChan chan struct{}
|
||||
)
|
||||
|
||||
func init() {
|
||||
@ -289,7 +292,11 @@ func NewServer(cfg *config.Config, driver IDriver) (*Server, error) {
|
||||
if s.tlsConfig != nil {
|
||||
s.capability |= mysql.ClientSSL
|
||||
}
|
||||
variable.RegisterStatistics(s)
|
||||
return s, nil
|
||||
}
|
||||
|
||||
func (s *Server) initTiDBListener() (err error) {
|
||||
if s.cfg.Host != "" && (s.cfg.Port != 0 || RunInGoTest) {
|
||||
addr := net.JoinHostPort(s.cfg.Host, strconv.Itoa(int(s.cfg.Port)))
|
||||
tcpProto := "tcp"
|
||||
@ -297,7 +304,7 @@ func NewServer(cfg *config.Config, driver IDriver) (*Server, error) {
|
||||
tcpProto = "tcp4"
|
||||
}
|
||||
if s.listener, err = net.Listen(tcpProto, addr); err != nil {
|
||||
return nil, errors.Trace(err)
|
||||
return errors.Trace(err)
|
||||
}
|
||||
logutil.BgLogger().Info("server is running MySQL protocol", zap.String("addr", addr))
|
||||
if RunInGoTest && s.cfg.Port == 0 {
|
||||
@ -307,18 +314,18 @@ func NewServer(cfg *config.Config, driver IDriver) (*Server, error) {
|
||||
|
||||
if s.cfg.Socket != "" {
|
||||
if err := cleanupStaleSocket(s.cfg.Socket); err != nil {
|
||||
return nil, errors.Trace(err)
|
||||
return errors.Trace(err)
|
||||
}
|
||||
|
||||
if s.socket, err = net.Listen("unix", s.cfg.Socket); err != nil {
|
||||
return nil, errors.Trace(err)
|
||||
return errors.Trace(err)
|
||||
}
|
||||
logutil.BgLogger().Info("server is running MySQL protocol", zap.String("socket", s.cfg.Socket))
|
||||
}
|
||||
|
||||
if s.socket == nil && s.listener == nil {
|
||||
err = errors.New("Server not configured to listen on either -socket or -host and -port")
|
||||
return nil, errors.Trace(err)
|
||||
return errors.Trace(err)
|
||||
}
|
||||
|
||||
if s.cfg.ProxyProtocol.Networks != "" {
|
||||
@ -330,7 +337,7 @@ func NewServer(cfg *config.Config, driver IDriver) (*Server, error) {
|
||||
int(s.cfg.ProxyProtocol.HeaderTimeout), s.cfg.ProxyProtocol.Fallbackable)
|
||||
if err != nil {
|
||||
logutil.BgLogger().Error("ProxyProtocol networks parameter invalid")
|
||||
return nil, errors.Trace(err)
|
||||
return errors.Trace(err)
|
||||
}
|
||||
if s.listener != nil {
|
||||
s.listener = ppListener
|
||||
@ -340,10 +347,13 @@ func NewServer(cfg *config.Config, driver IDriver) (*Server, error) {
|
||||
logutil.BgLogger().Info("server is running MySQL protocol (through PROXY protocol)", zap.String("socket", s.cfg.Socket))
|
||||
}
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func (s *Server) initHTTPListener() (err error) {
|
||||
if s.cfg.Status.ReportStatus {
|
||||
if err = s.listenStatusHTTPServer(); err != nil {
|
||||
return nil, errors.Trace(err)
|
||||
return errors.Trace(err)
|
||||
}
|
||||
}
|
||||
|
||||
@ -364,10 +374,7 @@ func NewServer(cfg *config.Config, driver IDriver) (*Server, error) {
|
||||
logutil.BgLogger().Error("Fail to load JWKS from the path", zap.String("jwks", s.cfg.Security.AuthTokenJWKS))
|
||||
}
|
||||
}
|
||||
|
||||
variable.RegisterStatistics(s)
|
||||
|
||||
return s, nil
|
||||
return
|
||||
}
|
||||
|
||||
func cleanupStaleSocket(socket string) error {
|
||||
@ -426,7 +433,11 @@ func (s *Server) Run(dom *domain.Domain) error {
|
||||
|
||||
// Start HTTP API to report tidb info such as TPS.
|
||||
if s.cfg.Status.ReportStatus {
|
||||
s.startStatusHTTP()
|
||||
err := s.startStatusHTTP()
|
||||
if err != nil {
|
||||
log.Error("failed to create the server", zap.Error(err), zap.Stack("stack"))
|
||||
return err
|
||||
}
|
||||
}
|
||||
if config.GetGlobalConfig().Performance.ForceInitStats && dom != nil {
|
||||
<-dom.StatsHandle().InitStatsDone
|
||||
@ -434,15 +445,38 @@ func (s *Server) Run(dom *domain.Domain) error {
|
||||
// If error should be reported and exit the server it can be sent on this
|
||||
// channel. Otherwise, end with sending a nil error to signal "done"
|
||||
errChan := make(chan error, 2)
|
||||
err := s.initTiDBListener()
|
||||
if err != nil {
|
||||
log.Error("failed to create the server", zap.Error(err), zap.Stack("stack"))
|
||||
return err
|
||||
}
|
||||
// Register error API is not thread-safe, the caller MUST NOT register errors after initialization.
|
||||
// To prevent misuse, set a flag to indicate that register new error will panic immediately.
|
||||
// For regression of issue like https://github.com/pingcap/tidb/issues/28190
|
||||
terror.RegisterFinish()
|
||||
go s.startNetworkListener(s.listener, false, errChan)
|
||||
go s.startNetworkListener(s.socket, true, errChan)
|
||||
err := <-errChan
|
||||
if RunInGoTest && !isClosed(RunInGoTestChan) {
|
||||
close(RunInGoTestChan)
|
||||
}
|
||||
err = <-errChan
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
return <-errChan
|
||||
}
|
||||
|
||||
// isClosed is to check if the channel is closed
|
||||
func isClosed(ch chan struct{}) bool {
|
||||
select {
|
||||
case <-ch:
|
||||
return true
|
||||
default:
|
||||
}
|
||||
|
||||
return false
|
||||
}
|
||||
|
||||
func (s *Server) startNetworkListener(listener net.Listener, isUnixSocket bool, errChan chan error) {
|
||||
if listener == nil {
|
||||
errChan <- nil
|
||||
|
||||
@ -33,6 +33,7 @@ import (
|
||||
|
||||
func TestMain(m *testing.M) {
|
||||
server.RunInGoTest = true
|
||||
server.RunInGoTestChan = make(chan struct{})
|
||||
testsetup.SetupForCommonTest()
|
||||
topsqlstate.EnableTopSQL()
|
||||
unistore.CheckResourceTagForTopSQLInGoTest = true
|
||||
|
||||
@ -141,8 +141,9 @@ func TestStatusPort(t *testing.T) {
|
||||
cfg.Performance.TCPKeepAlive = true
|
||||
|
||||
server, err := server2.NewServer(cfg, ts.Tidbdrv)
|
||||
require.NoError(t, err)
|
||||
err = server.Run(ts.Domain)
|
||||
require.Error(t, err)
|
||||
require.Nil(t, server)
|
||||
}
|
||||
|
||||
func TestMultiStatements(t *testing.T) {
|
||||
@ -164,16 +165,16 @@ func TestSocketForwarding(t *testing.T) {
|
||||
cfg.Port = cli.Port
|
||||
os.Remove(cfg.Socket)
|
||||
cfg.Status.ReportStatus = false
|
||||
|
||||
server2.RunInGoTestChan = make(chan struct{})
|
||||
server, err := server2.NewServer(cfg, ts.Tidbdrv)
|
||||
require.NoError(t, err)
|
||||
server.SetDomain(ts.Domain)
|
||||
cli.Port = testutil.GetPortFromTCPAddr(server.ListenAddr())
|
||||
go func() {
|
||||
err := server.Run(nil)
|
||||
require.NoError(t, err)
|
||||
}()
|
||||
time.Sleep(time.Millisecond * 100)
|
||||
<-server2.RunInGoTestChan
|
||||
cli.Port = testutil.GetPortFromTCPAddr(server.ListenAddr())
|
||||
defer server.Close()
|
||||
|
||||
cli.RunTestRegression(t, func(config *mysql.Config) {
|
||||
@ -197,7 +198,7 @@ func TestSocket(t *testing.T) {
|
||||
cfg.Status.ReportStatus = false
|
||||
|
||||
ts := servertestkit.CreateTidbTestSuite(t)
|
||||
|
||||
server2.RunInGoTestChan = make(chan struct{})
|
||||
server, err := server2.NewServer(cfg, ts.Tidbdrv)
|
||||
require.NoError(t, err)
|
||||
server.SetDomain(ts.Domain)
|
||||
@ -205,7 +206,7 @@ func TestSocket(t *testing.T) {
|
||||
err := server.Run(nil)
|
||||
require.NoError(t, err)
|
||||
}()
|
||||
time.Sleep(time.Millisecond * 100)
|
||||
<-server2.RunInGoTestChan
|
||||
defer server.Close()
|
||||
|
||||
confFunc := func(config *mysql.Config) {
|
||||
@ -232,15 +233,17 @@ func TestSocketAndIp(t *testing.T) {
|
||||
cfg.Status.ReportStatus = false
|
||||
|
||||
ts := servertestkit.CreateTidbTestSuite(t)
|
||||
|
||||
server2.RunInGoTestChan = make(chan struct{})
|
||||
server, err := server2.NewServer(cfg, ts.Tidbdrv)
|
||||
require.NoError(t, err)
|
||||
server.SetDomain(ts.Domain)
|
||||
cli.Port = testutil.GetPortFromTCPAddr(server.ListenAddr())
|
||||
|
||||
go func() {
|
||||
err := server.Run(nil)
|
||||
require.NoError(t, err)
|
||||
}()
|
||||
<-server2.RunInGoTestChan
|
||||
cli.Port = testutil.GetPortFromTCPAddr(server.ListenAddr())
|
||||
cli.WaitUntilServerCanConnect()
|
||||
defer server.Close()
|
||||
|
||||
@ -397,7 +400,7 @@ func TestOnlySocket(t *testing.T) {
|
||||
cfg.Status.ReportStatus = false
|
||||
|
||||
ts := servertestkit.CreateTidbTestSuite(t)
|
||||
|
||||
server2.RunInGoTestChan = make(chan struct{})
|
||||
server, err := server2.NewServer(cfg, ts.Tidbdrv)
|
||||
require.NoError(t, err)
|
||||
server.SetDomain(ts.Domain)
|
||||
@ -405,7 +408,7 @@ func TestOnlySocket(t *testing.T) {
|
||||
err := server.Run(nil)
|
||||
require.NoError(t, err)
|
||||
}()
|
||||
time.Sleep(time.Millisecond * 100)
|
||||
<-server2.RunInGoTestChan
|
||||
defer server.Close()
|
||||
require.Nil(t, server.Listener())
|
||||
require.NotNil(t, server.Socket())
|
||||
@ -898,17 +901,18 @@ func TestGracefulShutdown(t *testing.T) {
|
||||
cfg.Status.StatusPort = 0
|
||||
cfg.Status.ReportStatus = true
|
||||
cfg.Performance.TCPKeepAlive = true
|
||||
server2.RunInGoTestChan = make(chan struct{})
|
||||
server, err := server2.NewServer(cfg, ts.Tidbdrv)
|
||||
require.NoError(t, err)
|
||||
require.NotNil(t, server)
|
||||
cli.Port = testutil.GetPortFromTCPAddr(server.ListenAddr())
|
||||
cli.StatusPort = testutil.GetPortFromTCPAddr(server.StatusListenerAddr())
|
||||
|
||||
go func() {
|
||||
err := server.Run(nil)
|
||||
require.NoError(t, err)
|
||||
}()
|
||||
time.Sleep(time.Millisecond * 100)
|
||||
|
||||
<-server2.RunInGoTestChan
|
||||
cli.Port = testutil.GetPortFromTCPAddr(server.ListenAddr())
|
||||
cli.StatusPort = testutil.GetPortFromTCPAddr(server.StatusListenerAddr())
|
||||
resp, err := cli.FetchStatus("/status") // server is up
|
||||
require.NoError(t, err)
|
||||
require.Nil(t, resp.Body.Close())
|
||||
@ -2141,16 +2145,18 @@ func TestLocalhostClientMapping(t *testing.T) {
|
||||
cfg.Status.ReportStatus = false
|
||||
|
||||
ts := servertestkit.CreateTidbTestSuite(t)
|
||||
|
||||
server2.RunInGoTestChan = make(chan struct{})
|
||||
server, err := server2.NewServer(cfg, ts.Tidbdrv)
|
||||
require.NoError(t, err)
|
||||
server.SetDomain(ts.Domain)
|
||||
cli.Port = testutil.GetPortFromTCPAddr(server.ListenAddr())
|
||||
|
||||
go func() {
|
||||
err := server.Run(nil)
|
||||
require.NoError(t, err)
|
||||
}()
|
||||
defer server.Close()
|
||||
<-server2.RunInGoTestChan
|
||||
cli.Port = testutil.GetPortFromTCPAddr(server.ListenAddr())
|
||||
cli.WaitUntilServerCanConnect()
|
||||
|
||||
cli.Port = testutil.GetPortFromTCPAddr(server.ListenAddr())
|
||||
|
||||
@ -33,6 +33,7 @@ import (
|
||||
|
||||
func TestMain(m *testing.M) {
|
||||
server.RunInGoTest = true
|
||||
server.RunInGoTestChan = make(chan struct{})
|
||||
testsetup.SetupForCommonTest()
|
||||
topsqlstate.EnableTopSQL()
|
||||
unistore.CheckResourceTagForTopSQLInGoTest = true
|
||||
|
||||
@ -33,6 +33,7 @@ import (
|
||||
|
||||
func TestMain(m *testing.M) {
|
||||
server.RunInGoTest = true
|
||||
server.RunInGoTestChan = make(chan struct{})
|
||||
testsetup.SetupForCommonTest()
|
||||
topsqlstate.EnableTopSQL()
|
||||
unistore.CheckResourceTagForTopSQLInGoTest = true
|
||||
|
||||
@ -23,7 +23,7 @@ import (
|
||||
"github.com/pingcap/tidb/pkg/config"
|
||||
"github.com/pingcap/tidb/pkg/domain"
|
||||
"github.com/pingcap/tidb/pkg/kv"
|
||||
"github.com/pingcap/tidb/pkg/server"
|
||||
srv "github.com/pingcap/tidb/pkg/server"
|
||||
"github.com/pingcap/tidb/pkg/server/internal/testserverclient"
|
||||
"github.com/pingcap/tidb/pkg/server/internal/testutil"
|
||||
"github.com/pingcap/tidb/pkg/server/internal/util"
|
||||
@ -40,8 +40,8 @@ import (
|
||||
// TidbTestSuite is a test suite for tidb
|
||||
type TidbTestSuite struct {
|
||||
*testserverclient.TestServerClient
|
||||
Tidbdrv *server.TiDBDriver
|
||||
Server *server.Server
|
||||
Tidbdrv *srv.TiDBDriver
|
||||
Server *srv.Server
|
||||
Domain *domain.Domain
|
||||
Store kv.Storage
|
||||
}
|
||||
@ -68,12 +68,11 @@ func CreateTidbTestSuiteWithCfg(t *testing.T, cfg *config.Config) *TidbTestSuite
|
||||
require.NoError(t, err)
|
||||
ts.Domain, err = session.BootstrapSession(ts.Store)
|
||||
require.NoError(t, err)
|
||||
ts.Tidbdrv = server.NewTiDBDriver(ts.Store)
|
||||
ts.Tidbdrv = srv.NewTiDBDriver(ts.Store)
|
||||
|
||||
server, err := server.NewServer(cfg, ts.Tidbdrv)
|
||||
server, err := srv.NewServer(cfg, ts.Tidbdrv)
|
||||
require.NoError(t, err)
|
||||
ts.Port = testutil.GetPortFromTCPAddr(server.ListenAddr())
|
||||
ts.StatusPort = testutil.GetPortFromTCPAddr(server.StatusListenerAddr())
|
||||
|
||||
ts.Server = server
|
||||
ts.Server.SetDomain(ts.Domain)
|
||||
ts.Domain.InfoSyncer().SetSessionManager(ts.Server)
|
||||
@ -81,6 +80,9 @@ func CreateTidbTestSuiteWithCfg(t *testing.T, cfg *config.Config) *TidbTestSuite
|
||||
err := ts.Server.Run(nil)
|
||||
require.NoError(t, err)
|
||||
}()
|
||||
<-srv.RunInGoTestChan
|
||||
ts.Port = testutil.GetPortFromTCPAddr(server.ListenAddr())
|
||||
ts.StatusPort = testutil.GetPortFromTCPAddr(server.StatusListenerAddr())
|
||||
ts.WaitUntilServerOnline()
|
||||
|
||||
t.Cleanup(func() {
|
||||
|
||||
@ -33,6 +33,7 @@ import (
|
||||
|
||||
func TestMain(m *testing.M) {
|
||||
server.RunInGoTest = true
|
||||
server.RunInGoTestChan = make(chan struct{})
|
||||
testsetup.SetupForCommonTest()
|
||||
topsqlstate.EnableTopSQL()
|
||||
unistore.CheckResourceTagForTopSQLInGoTest = true
|
||||
|
||||
@ -31,7 +31,7 @@ import (
|
||||
"github.com/go-sql-driver/mysql"
|
||||
"github.com/pingcap/errors"
|
||||
"github.com/pingcap/tidb/pkg/config"
|
||||
"github.com/pingcap/tidb/pkg/server"
|
||||
tidbserver "github.com/pingcap/tidb/pkg/server"
|
||||
"github.com/pingcap/tidb/pkg/server/internal/testserverclient"
|
||||
"github.com/pingcap/tidb/pkg/server/internal/testutil"
|
||||
util2 "github.com/pingcap/tidb/pkg/server/internal/util"
|
||||
@ -210,16 +210,18 @@ func TestTLSVerify(t *testing.T) {
|
||||
SSLCert: fileName("server-cert.pem"),
|
||||
SSLKey: fileName("server-key.pem"),
|
||||
}
|
||||
server, err := server.NewServer(cfg, ts.Tidbdrv)
|
||||
tidbserver.RunInGoTestChan = make(chan struct{})
|
||||
server, err := tidbserver.NewServer(cfg, ts.Tidbdrv)
|
||||
require.NoError(t, err)
|
||||
server.SetDomain(ts.Domain)
|
||||
defer server.Close()
|
||||
cli.Port = testutil.GetPortFromTCPAddr(server.ListenAddr())
|
||||
|
||||
go func() {
|
||||
err := server.Run(nil)
|
||||
require.NoError(t, err)
|
||||
}()
|
||||
time.Sleep(time.Millisecond * 100)
|
||||
<-tidbserver.RunInGoTestChan
|
||||
cli.Port = testutil.GetPortFromTCPAddr(server.ListenAddr())
|
||||
// The client does not provide a certificate, the connection should succeed.
|
||||
err = cli.RunTestTLSConnection(t, nil)
|
||||
require.NoError(t, err)
|
||||
@ -303,15 +305,16 @@ func TestTLSBasic(t *testing.T) {
|
||||
SSLCert: fileName("server-cert.pem"),
|
||||
SSLKey: fileName("server-key.pem"),
|
||||
}
|
||||
server, err := server.NewServer(cfg, ts.Tidbdrv)
|
||||
tidbserver.RunInGoTestChan = make(chan struct{})
|
||||
server, err := tidbserver.NewServer(cfg, ts.Tidbdrv)
|
||||
require.NoError(t, err)
|
||||
server.SetDomain(ts.Domain)
|
||||
cli.Port = testutil.GetPortFromTCPAddr(server.ListenAddr())
|
||||
go func() {
|
||||
err := server.Run(nil)
|
||||
require.NoError(t, err)
|
||||
}()
|
||||
time.Sleep(time.Millisecond * 100)
|
||||
<-tidbserver.RunInGoTestChan
|
||||
cli.Port = testutil.GetPortFromTCPAddr(server.ListenAddr())
|
||||
err = cli.RunTestTLSConnection(t, connOverrider) // We should establish connection successfully.
|
||||
require.NoError(t, err)
|
||||
cli.RunTestRegression(t, connOverrider, "TLSRegression")
|
||||
@ -370,7 +373,7 @@ func TestErrorNoRollback(t *testing.T) {
|
||||
SSLCert: "wrong path",
|
||||
SSLKey: "wrong path",
|
||||
}
|
||||
_, err = server.NewServer(cfg, ts.Tidbdrv)
|
||||
_, err = tidbserver.NewServer(cfg, ts.Tidbdrv)
|
||||
require.Error(t, err)
|
||||
|
||||
// test reload tls fail with/without "error no rollback option"
|
||||
@ -379,16 +382,17 @@ func TestErrorNoRollback(t *testing.T) {
|
||||
SSLCert: "/tmp/server-cert-rollback.pem",
|
||||
SSLKey: "/tmp/server-key-rollback.pem",
|
||||
}
|
||||
server, err := server.NewServer(cfg, ts.Tidbdrv)
|
||||
tidbserver.RunInGoTestChan = make(chan struct{})
|
||||
server, err := tidbserver.NewServer(cfg, ts.Tidbdrv)
|
||||
require.NoError(t, err)
|
||||
server.SetDomain(ts.Domain)
|
||||
cli.Port = testutil.GetPortFromTCPAddr(server.ListenAddr())
|
||||
go func() {
|
||||
err := server.Run(nil)
|
||||
require.NoError(t, err)
|
||||
}()
|
||||
defer server.Close()
|
||||
time.Sleep(time.Millisecond * 100)
|
||||
<-tidbserver.RunInGoTestChan
|
||||
cli.Port = testutil.GetPortFromTCPAddr(server.ListenAddr())
|
||||
connOverrider := func(config *mysql.Config) {
|
||||
config.TLSConfig = "client-cert-rollback-test"
|
||||
}
|
||||
@ -438,15 +442,16 @@ func TestReloadTLS(t *testing.T) {
|
||||
SSLCert: "/tmp/server-cert-reload.pem",
|
||||
SSLKey: "/tmp/server-key-reload.pem",
|
||||
}
|
||||
server, err := server.NewServer(cfg, ts.Tidbdrv)
|
||||
tidbserver.RunInGoTestChan = make(chan struct{})
|
||||
server, err := tidbserver.NewServer(cfg, ts.Tidbdrv)
|
||||
require.NoError(t, err)
|
||||
server.SetDomain(ts.Domain)
|
||||
cli.Port = testutil.GetPortFromTCPAddr(server.ListenAddr())
|
||||
go func() {
|
||||
err := server.Run(nil)
|
||||
require.NoError(t, err)
|
||||
}()
|
||||
time.Sleep(time.Millisecond * 100)
|
||||
<-tidbserver.RunInGoTestChan
|
||||
cli.Port = testutil.GetPortFromTCPAddr(server.ListenAddr())
|
||||
// The client provides a valid certificate.
|
||||
connOverrider := func(config *mysql.Config) {
|
||||
config.TLSConfig = "client-certificate-reload"
|
||||
@ -531,16 +536,17 @@ func TestStatusAPIWithTLS(t *testing.T) {
|
||||
cfg.Security.ClusterSSLCA = fileName("ca-cert-2.pem")
|
||||
cfg.Security.ClusterSSLCert = fileName("server-cert-2.pem")
|
||||
cfg.Security.ClusterSSLKey = fileName("server-key-2.pem")
|
||||
server, err := server.NewServer(cfg, ts.Tidbdrv)
|
||||
tidbserver.RunInGoTestChan = make(chan struct{})
|
||||
server, err := tidbserver.NewServer(cfg, ts.Tidbdrv)
|
||||
require.NoError(t, err)
|
||||
cli.Port = testutil.GetPortFromTCPAddr(server.ListenAddr())
|
||||
cli.StatusPort = testutil.GetPortFromTCPAddr(server.StatusListenerAddr())
|
||||
|
||||
go func() {
|
||||
err := server.Run(nil)
|
||||
require.NoError(t, err)
|
||||
}()
|
||||
time.Sleep(time.Millisecond * 100)
|
||||
|
||||
<-tidbserver.RunInGoTestChan
|
||||
cli.Port = testutil.GetPortFromTCPAddr(server.ListenAddr())
|
||||
cli.StatusPort = testutil.GetPortFromTCPAddr(server.StatusListenerAddr())
|
||||
// https connection should work.
|
||||
ts.RunTestStatusAPI(t)
|
||||
|
||||
@ -588,15 +594,17 @@ func TestStatusAPIWithTLSCNCheck(t *testing.T) {
|
||||
cfg.Security.ClusterSSLCert = serverCertPath
|
||||
cfg.Security.ClusterSSLKey = serverKeyPath
|
||||
cfg.Security.ClusterVerifyCN = []string{"tidb-client-2"}
|
||||
server, err := server.NewServer(cfg, ts.Tidbdrv)
|
||||
tidbserver.RunInGoTestChan = make(chan struct{})
|
||||
server, err := tidbserver.NewServer(cfg, ts.Tidbdrv)
|
||||
require.NoError(t, err)
|
||||
|
||||
cli.Port = testutil.GetPortFromTCPAddr(server.ListenAddr())
|
||||
cli.StatusPort = testutil.GetPortFromTCPAddr(server.StatusListenerAddr())
|
||||
go func() {
|
||||
err := server.Run(nil)
|
||||
require.NoError(t, err)
|
||||
}()
|
||||
<-tidbserver.RunInGoTestChan
|
||||
cli.Port = testutil.GetPortFromTCPAddr(server.ListenAddr())
|
||||
cli.StatusPort = testutil.GetPortFromTCPAddr(server.StatusListenerAddr())
|
||||
defer server.Close()
|
||||
time.Sleep(time.Millisecond * 100)
|
||||
|
||||
@ -628,7 +636,7 @@ func TestInvalidTLS(t *testing.T) {
|
||||
SSLCert: "bogus-server-cert.pem",
|
||||
SSLKey: "bogus-server-key.pem",
|
||||
}
|
||||
_, err := server.NewServer(cfg, ts.Tidbdrv)
|
||||
_, err := tidbserver.NewServer(cfg, ts.Tidbdrv)
|
||||
require.Error(t, err)
|
||||
}
|
||||
|
||||
@ -645,17 +653,18 @@ func TestTLSAuto(t *testing.T) {
|
||||
cfg.Status.ReportStatus = false
|
||||
cfg.Security.AutoTLS = true
|
||||
cfg.Security.RSAKeySize = 528 // Reduces unittest runtime
|
||||
tidbserver.RunInGoTestChan = make(chan struct{})
|
||||
err := os.MkdirAll(cfg.TempStoragePath, 0700)
|
||||
require.NoError(t, err)
|
||||
server, err := server.NewServer(cfg, ts.Tidbdrv)
|
||||
server, err := tidbserver.NewServer(cfg, ts.Tidbdrv)
|
||||
require.NoError(t, err)
|
||||
server.SetDomain(ts.Domain)
|
||||
cli.Port = testutil.GetPortFromTCPAddr(server.ListenAddr())
|
||||
go func() {
|
||||
err := server.Run(nil)
|
||||
require.NoError(t, err)
|
||||
}()
|
||||
time.Sleep(time.Millisecond * 100)
|
||||
<-tidbserver.RunInGoTestChan
|
||||
cli.Port = testutil.GetPortFromTCPAddr(server.ListenAddr())
|
||||
err = cli.RunTestTLSConnection(t, connOverrider) // Relying on automatically created TLS certificates
|
||||
require.NoError(t, err)
|
||||
|
||||
|
||||
Reference in New Issue
Block a user