diff --git a/lib/util/logger/logger.go b/lib/util/logger/logger.go index a6b8574d..b8d13b6f 100644 --- a/lib/util/logger/logger.go +++ b/lib/util/logger/logger.go @@ -4,6 +4,8 @@ package logger import ( + "bytes" + "fmt" "testing" "go.uber.org/zap" @@ -12,18 +14,24 @@ import ( type testingLog struct { *testing.T + buf bytes.Buffer } func (t *testingLog) Write(b []byte) (int, error) { t.Logf("%s", b) - return len(b), nil + return t.buf.Write(b) } -// CreateLoggerForTest creates a logger for unit tests. -func CreateLoggerForTest(t *testing.T) *zap.Logger { +func (t *testingLog) String() string { + return t.buf.String() +} + +// CreateLoggerForTest returns both the logger and its content. +func CreateLoggerForTest(t *testing.T) (*zap.Logger, fmt.Stringer) { + log := &testingLog{T: t} return zap.New(zapcore.NewCore( zapcore.NewConsoleEncoder(zap.NewDevelopmentEncoderConfig()), - zapcore.AddSync(&testingLog{t}), + zapcore.AddSync(log), zap.InfoLevel, - )).Named(t.Name()) + )).Named(t.Name()), log } diff --git a/lib/util/security/cert_test.go b/lib/util/security/cert_test.go index 4f476545..8dfd6fa8 100644 --- a/lib/util/security/cert_test.go +++ b/lib/util/security/cert_test.go @@ -16,7 +16,7 @@ import ( ) func TestCertServer(t *testing.T) { - logger := logger.CreateLoggerForTest(t) + logger, _ := logger.CreateLoggerForTest(t) tmpdir := t.TempDir() certPath := filepath.Join(tmpdir, "cert") keyPath := filepath.Join(tmpdir, "key") @@ -267,7 +267,7 @@ func TestCertServer(t *testing.T) { } func TestReload(t *testing.T) { - lg := logger.CreateLoggerForTest(t) + lg, _ := logger.CreateLoggerForTest(t) tmpdir := t.TempDir() certPath := filepath.Join(tmpdir, "cert") keyPath := filepath.Join(tmpdir, "key") @@ -297,7 +297,7 @@ func TestReload(t *testing.T) { } func TestAutoCerts(t *testing.T) { - lg := logger.CreateLoggerForTest(t) + lg, _ := logger.CreateLoggerForTest(t) cfg := config.TLSConfig{ AutoCerts: true, } @@ -338,7 +338,7 @@ func getExpireTime(t *testing.T, ci *CertInfo) time.Time { } func TestSetConfig(t *testing.T) { - lg := logger.CreateLoggerForTest(t) + lg, _ := logger.CreateLoggerForTest(t) ci := NewCert(false) cfg := config.TLSConfig{ SkipCA: true, diff --git a/lib/util/systimemon/systime_mon_test.go b/lib/util/systimemon/systime_mon_test.go index 8a5a57a0..0561a3d7 100644 --- a/lib/util/systimemon/systime_mon_test.go +++ b/lib/util/systimemon/systime_mon_test.go @@ -17,7 +17,7 @@ import ( func TestSystimeMonitor(t *testing.T) { errTriggered := atomic.NewBool(false) nowTriggered := atomic.NewBool(false) - log := logger.CreateLoggerForTest(t) + log, _ := logger.CreateLoggerForTest(t) ctx, cancel := context.WithCancel(context.Background()) var wg waitgroup.WaitGroup wg.Run(func() { diff --git a/pkg/manager/cert/manager_test.go b/pkg/manager/cert/manager_test.go index b8e5978f..76eb2249 100644 --- a/pkg/manager/cert/manager_test.go +++ b/pkg/manager/cert/manager_test.go @@ -58,7 +58,7 @@ func connectWithTLS(ctls, stls *tls.Config) (clientErr, serverErr error) { // Test various configurations. func TestInit(t *testing.T) { - lg := logger.CreateLoggerForTest(t) + lg, _ := logger.CreateLoggerForTest(t) tmpdir := t.TempDir() type testcase struct { @@ -139,7 +139,7 @@ func TestInit(t *testing.T) { // Test rotation works. func TestRotate(t *testing.T) { tmpdir := t.TempDir() - lg := logger.CreateLoggerForTest(t) + lg, _ := logger.CreateLoggerForTest(t) caPath := filepath.Join(tmpdir, "ca") keyPath := filepath.Join(tmpdir, "key") certPath := filepath.Join(tmpdir, "cert") @@ -321,7 +321,7 @@ func TestRotate(t *testing.T) { func TestBidirectional(t *testing.T) { tmpdir := t.TempDir() - lg := logger.CreateLoggerForTest(t) + lg, _ := logger.CreateLoggerForTest(t) caPath1 := filepath.Join(tmpdir, "c1", "ca") keyPath1 := filepath.Join(tmpdir, "c1", "key") certPath1 := filepath.Join(tmpdir, "c1", "cert") @@ -359,7 +359,7 @@ func TestBidirectional(t *testing.T) { func TestWatchConfig(t *testing.T) { tmpdir := t.TempDir() - lg := logger.CreateLoggerForTest(t) + lg, _ := logger.CreateLoggerForTest(t) caPath1 := filepath.Join(tmpdir, "c1", "ca") keyPath1 := filepath.Join(tmpdir, "c1", "key") certPath1 := filepath.Join(tmpdir, "c1", "cert") diff --git a/pkg/manager/config/config.go b/pkg/manager/config/config.go index a10d71db..f8ead523 100644 --- a/pkg/manager/config/config.go +++ b/pkg/manager/config/config.go @@ -27,13 +27,27 @@ func (e *ConfigManager) reloadConfigFile(file string) error { func (e *ConfigManager) handleFSEvent(ev fsnotify.Event, f string) { switch { case ev.Has(fsnotify.Create), ev.Has(fsnotify.Write), ev.Has(fsnotify.Remove), ev.Has(fsnotify.Rename): + // The file may be the log file, triggering reload will cause more logs and thus cause reload again, + // so we need to filter the wrong files. + // The filesystem differs from OS to OS, so don't use string comparison. + f1, err := os.Stat(ev.Name) + if err != nil { + break + } + f2, err := os.Stat(f) + if err != nil { + break + } + if !os.SameFile(f1, f2) { + break + } if ev.Has(fsnotify.Remove) || ev.Has(fsnotify.Rename) { // in case of remove/rename the file, files are not present at filesystem for a while // it may be too fast to read the config file now, sleep for a while time.Sleep(50 * time.Millisecond) } // try to reload it - e.logger.Info("config file reloaded", zap.Error(e.reloadConfigFile(f))) + e.logger.Info("config file reloaded", zap.Stringer("event", ev), zap.Error(e.reloadConfigFile(f))) } } diff --git a/pkg/manager/config/config_test.go b/pkg/manager/config/config_test.go index f11c07d7..9e8d5eb8 100644 --- a/pkg/manager/config/config_test.go +++ b/pkg/manager/config/config_test.go @@ -7,6 +7,7 @@ import ( "fmt" "os" "path/filepath" + "strings" "testing" "time" @@ -22,9 +23,9 @@ func TestConfigReload(t *testing.T) { require.NoError(t, err) require.NoError(t, f.Close()) - cfgmgr1, _ := testConfigManager(t, tmpcfg) + cfgmgr1, _, _ := testConfigManager(t, tmpcfg) - cfgmgr2, _ := testConfigManager(t, "") + cfgmgr2, _, _ := testConfigManager(t, "") cases := []struct { name string @@ -135,7 +136,7 @@ func TestConfigRemove(t *testing.T) { require.NoError(t, err) require.NoError(t, f.Close()) - cfgmgr, _ := testConfigManager(t, tmpcfg) + cfgmgr, _, _ := testConfigManager(t, tmpcfg) // remove and recreate the file in a very short time require.NoError(t, os.Remove(tmpcfg)) @@ -153,8 +154,147 @@ func TestConfigRemove(t *testing.T) { require.Eventually(t, func() bool { return cfgmgr.GetConfig().Proxy.Addr == "vv" }, time.Second, 100*time.Millisecond) } +func TestFilePath(t *testing.T) { + var ( + cfgmgr *ConfigManager + text fmt.Stringer + count int + ) + + tmpdir := t.TempDir() + checkLog := func(increased bool) { + // On linux, writing once will trigger 2 WRITE events. But on macOS, it only triggers once. + // So we always sleep 100ms to avoid missing any logs on the way. + time.Sleep(100 * time.Millisecond) + newCount := strings.Count(text.String(), "config file reloaded") + require.Equal(t, increased, newCount > count, fmt.Sprintf("now: %d, was: %d", newCount, count)) + count = newCount + } + + tests := []struct { + filename string + createFile func() + cleanFile func() + checker func(filename string) + }{ + { + // Test updating another file in the same directory won't make it reload. + filename: filepath.Join(tmpdir, "cfg"), + checker: func(filename string) { + tmplog := filepath.Join(tmpdir, "log") + f, err := os.Create(tmplog) + require.NoError(t, err) + require.NoError(t, f.Close()) + require.NoError(t, os.WriteFile(tmplog, []byte("hello"), 0644)) + newlog := filepath.Join(tmpdir, "log1") + require.NoError(t, os.Rename(tmplog, newlog)) + require.NoError(t, os.Remove(newlog)) + checkLog(false) + }, + }, + { + // Test case-insensitive. + filename: filepath.Join(tmpdir, "cfg"), + createFile: func() { + f, err := os.Create(filepath.Join(tmpdir, "CFG")) + require.NoError(t, err) + require.NoError(t, f.Close()) + // Linux is case-sensitive but macOS is case-insensitive. + // For linux, it creates another file. For macOS, it doesn't touch the file. + f, err = os.Create(filepath.Join(tmpdir, "cfg")) + require.NoError(t, err) + require.NoError(t, f.Close()) + }, + }, + { + // Test relative path. + // `event.Name` is `cfg` on MacOS, but it's `./cfg` on Linux. + filename: "cfg", + }, + { + // Test relative path. + filename: "./cfg", + }, + { + // Test uncleaned path. + filename: fmt.Sprintf("%s%c%ccfg", tmpdir, filepath.Separator, filepath.Separator), + }, + { + // Test removing and recreating the directory. + filename: "_tmp/cfg", + createFile: func() { + if err := os.Mkdir("_tmp", 0755); err != nil { + require.ErrorIs(t, err, os.ErrExist) + } + f, err := os.Create("_tmp/cfg") + require.NoError(t, err) + require.NoError(t, f.Close()) + }, + cleanFile: func() { + require.NoError(t, os.RemoveAll("_tmp")) + }, + checker: func(filename string) { + require.NoError(t, os.RemoveAll("_tmp")) + // To update `count`. + checkLog(false) + + require.NoError(t, os.Mkdir("_tmp", 0755)) + f, err := os.Create("_tmp/cfg") + require.NoError(t, err) + require.NoError(t, f.Close()) + checkLog(true) + }, + }, + { + // Test removing and recreating the file. + filename: "cfg", + checker: func(filename string) { + require.NoError(t, os.Remove(filename)) + checkLog(false) + + f, err := os.Create(filename) + require.NoError(t, err) + require.NoError(t, f.Close()) + checkLog(true) + }, + }, + } + + for _, test := range tests { + if test.createFile != nil { + test.createFile() + } else { + f, err := os.Create(test.filename) + require.NoError(t, err) + require.NoError(t, f.Close()) + } + + count = 0 + cfgmgr, text, _ = testConfigManager(t, test.filename) + checkLog(false) + + // Test write. + require.NoError(t, os.WriteFile(test.filename, []byte("proxy.pd-addrs = \"127.0.0.1:2379\""), 0644)) + checkLog(true) + + // Test other. + if test.checker != nil { + test.checker(test.filename) + } + + // Test remove. + if test.cleanFile != nil { + test.cleanFile() + } else { + // It doesn't matter whether it triggers reload or not. + require.NoError(t, os.Remove(test.filename)) + } + require.NoError(t, cfgmgr.Close()) + } +} + func TestChecksum(t *testing.T) { - cfgmgr, _ := testConfigManager(t, "") + cfgmgr, _, _ := testConfigManager(t, "") c1 := cfgmgr.GetConfigChecksum() require.NoError(t, cfgmgr.SetTOMLConfig([]byte(`proxy.addr = "gg"`))) c2 := cfgmgr.GetConfigChecksum() diff --git a/pkg/manager/config/manager.go b/pkg/manager/config/manager.go index b3597f12..cd3d46fb 100644 --- a/pkg/manager/config/manager.go +++ b/pkg/manager/config/manager.go @@ -101,12 +101,22 @@ func (e *ConfigManager) Init(ctx context.Context, logger *zap.Logger, configFile case <-nctx.Done(): return case err := <-e.wch.Errors: - e.logger.Info("failed to watch config file", zap.Error(err)) + e.logger.Warn("failed to watch config file", zap.Error(err)) case ev := <-e.wch.Events: e.handleFSEvent(ev, configFile) case <-ticker.C: + // There may be concurrent issues: + // 1. Remove the directory and the watcher removes the directory automatically + // 2. Create the directory and the file again within a tick + // 3. Add it to the watcher again, but the CREATE event is not sent + // + // Checking the watch list still have a concurrent issue because the watcher may remove the + // directory between WatchList and Add. We'll fix it later because it's complex to fix it entirely. + exists := len(e.wch.WatchList()) > 0 if err := e.wch.Add(parentDir); err != nil { - e.logger.Info("failed to rewatch config file", zap.Error(err)) + e.logger.Warn("failed to rewatch config file", zap.Error(err)) + } else if !exists { + e.logger.Info("config file reloaded", zap.Error(e.reloadConfigFile(configFile))) } } } @@ -122,14 +132,19 @@ func (e *ConfigManager) Init(ctx context.Context, logger *zap.Logger, configFile func (e *ConfigManager) Close() error { var wcherr error - e.cancel() + if e.cancel != nil { + e.cancel() + e.cancel = nil + } if e.wch != nil { wcherr = e.wch.Close() + e.wch = nil } e.sts.Lock() for _, ch := range e.sts.listeners { close(ch) } + e.sts.listeners = nil e.sts.Unlock() e.wg.Wait() return wcherr diff --git a/pkg/manager/config/manager_test.go b/pkg/manager/config/manager_test.go index da23831b..81d84b65 100644 --- a/pkg/manager/config/manager_test.go +++ b/pkg/manager/config/manager_test.go @@ -5,6 +5,7 @@ package config import ( "context" + "fmt" "testing" "github.com/pingcap/TiProxy/lib/config" @@ -12,8 +13,8 @@ import ( "github.com/stretchr/testify/require" ) -func testConfigManager(t *testing.T, configFile string, overlays ...*config.Config) (*ConfigManager, context.Context) { - logger := logger.CreateLoggerForTest(t) +func testConfigManager(t *testing.T, configFile string, overlays ...*config.Config) (*ConfigManager, fmt.Stringer, context.Context) { + logger, text := logger.CreateLoggerForTest(t) ctx, cancel := context.WithCancel(context.Background()) if ddl, ok := t.Deadline(); ok { @@ -29,5 +30,5 @@ func testConfigManager(t *testing.T, configFile string, overlays ...*config.Conf t.Cleanup(cancel) - return cfgmgr, ctx + return cfgmgr, text, ctx } diff --git a/pkg/manager/config/namespace_test.go b/pkg/manager/config/namespace_test.go index f0666ff6..9ca52622 100644 --- a/pkg/manager/config/namespace_test.go +++ b/pkg/manager/config/namespace_test.go @@ -14,7 +14,7 @@ import ( ) func TestBase(t *testing.T) { - cfgmgr, ctx := testConfigManager(t, "") + cfgmgr, _, ctx := testConfigManager(t, "") nsNum := 10 valNum := 30 @@ -74,7 +74,7 @@ func TestBase(t *testing.T) { } func TestBaseConcurrency(t *testing.T) { - cfgmgr, ctx := testConfigManager(t, "") + cfgmgr, _, ctx := testConfigManager(t, "") var wg waitgroup.WaitGroup batchNum := 16 diff --git a/pkg/manager/infosync/info_test.go b/pkg/manager/infosync/info_test.go index 5ec5a223..0e7c5ff9 100644 --- a/pkg/manager/infosync/info_test.go +++ b/pkg/manager/infosync/info_test.go @@ -207,7 +207,7 @@ type etcdTestSuite struct { } func newEtcdTestSuite(t *testing.T) *etcdTestSuite { - lg := logger.CreateLoggerForTest(t) + lg, _ := logger.CreateLoggerForTest(t) ts := &etcdTestSuite{ t: t, lg: lg, diff --git a/pkg/manager/router/backend_fetcher_test.go b/pkg/manager/router/backend_fetcher_test.go index d8b13124..aa204b19 100644 --- a/pkg/manager/router/backend_fetcher_test.go +++ b/pkg/manager/router/backend_fetcher_test.go @@ -104,7 +104,8 @@ func TestPDFetcher(t *testing.T) { } tpFetcher := newMockTpFetcher(t) - pf := NewPDFetcher(tpFetcher, logger.CreateLoggerForTest(t), newHealthCheckConfigForTest()) + lg, _ := logger.CreateLoggerForTest(t) + pf := NewPDFetcher(tpFetcher, lg, newHealthCheckConfigForTest()) for _, test := range tests { tpFetcher.infos = test.infos if test.ctx == nil { diff --git a/pkg/manager/router/backend_observer_test.go b/pkg/manager/router/backend_observer_test.go index a8532deb..41088260 100644 --- a/pkg/manager/router/backend_observer_test.go +++ b/pkg/manager/router/backend_observer_test.go @@ -147,7 +147,8 @@ func newObserverTestSuite(t *testing.T) *observerTestSuite { fetcher := &mockBackendFetcher{ backends: make(map[string]*BackendInfo), } - bo, err := NewBackendObserver(logger.CreateLoggerForTest(t), mer, nil, newHealthCheckConfigForTest(), fetcher) + lg, _ := logger.CreateLoggerForTest(t) + bo, err := NewBackendObserver(lg, mer, nil, newHealthCheckConfigForTest(), fetcher) require.NoError(t, err) return &observerTestSuite{ t: t, diff --git a/pkg/manager/router/router_test.go b/pkg/manager/router/router_test.go index 7d116c0b..c705068d 100644 --- a/pkg/manager/router/router_test.go +++ b/pkg/manager/router/router_test.go @@ -111,7 +111,8 @@ type routerTester struct { } func newRouterTester(t *testing.T) *routerTester { - router := NewScoreBasedRouter(logger.CreateLoggerForTest(t)) + lg, _ := logger.CreateLoggerForTest(t) + router := NewScoreBasedRouter(lg) t.Cleanup(router.Close) return &routerTester{ t: t, @@ -634,7 +635,8 @@ func TestConcurrency(t *testing.T) { Interval: 10 * time.Millisecond, } fetcher := &mockBackendFetcher{} - router := NewScoreBasedRouter(logger.CreateLoggerForTest(t)) + lg, _ := logger.CreateLoggerForTest(t) + router := NewScoreBasedRouter(lg) err := router.Init(nil, fetcher, healthCheckConfig) require.NoError(t, err) @@ -735,7 +737,7 @@ func TestRefresh(t *testing.T) { return backends, nil }) // Create a router with a very long health check interval. - lg := logger.CreateLoggerForTest(t) + lg, _ := logger.CreateLoggerForTest(t) rt := NewScoreBasedRouter(lg) cfg := config.NewDefaultHealthCheckConfig() cfg.Interval = time.Minute @@ -774,7 +776,7 @@ func TestObserveError(t *testing.T) { return backends, observeError }) // Create a router with a very short health check interval. - lg := logger.CreateLoggerForTest(t) + lg, _ := logger.CreateLoggerForTest(t) rt := NewScoreBasedRouter(lg) observer, err := StartBackendObserver(lg, rt, nil, newHealthCheckConfigForTest(), fetcher) require.NoError(t, err) @@ -829,7 +831,7 @@ func TestDisableHealthCheck(t *testing.T) { return backends, nil }) // Create a router with a very short health check interval. - lg := logger.CreateLoggerForTest(t) + lg, _ := logger.CreateLoggerForTest(t) rt := NewScoreBasedRouter(lg) err := rt.Init(nil, fetcher, &config.HealthCheck{Enable: false}) require.NoError(t, err) @@ -868,7 +870,8 @@ func TestSetBackendStatus(t *testing.T) { } func TestGetServerVersion(t *testing.T) { - rt := NewScoreBasedRouter(logger.CreateLoggerForTest(t)) + lg, _ := logger.CreateLoggerForTest(t) + rt := NewScoreBasedRouter(lg) t.Cleanup(rt.Close) backends := map[string]*backendHealth{ "0": { diff --git a/pkg/metrics/metrics_test.go b/pkg/metrics/metrics_test.go index 95f74a6e..0c934734 100644 --- a/pkg/metrics/metrics_test.go +++ b/pkg/metrics/metrics_test.go @@ -36,7 +36,7 @@ func TestPushMetrics(t *testing.T) { }), ) defer pgwOK.Close() - log := logger.CreateLoggerForTest(t) + log, _ := logger.CreateLoggerForTest(t) tests := []struct { metricsAddr string diff --git a/pkg/proxy/backend/backend_conn_mgr_test.go b/pkg/proxy/backend/backend_conn_mgr_test.go index e9885c5d..74a7f319 100644 --- a/pkg/proxy/backend/backend_conn_mgr_test.go +++ b/pkg/proxy/backend/backend_conn_mgr_test.go @@ -92,10 +92,11 @@ func newBackendMgrTester(t *testing.T, cfg ...cfgOverrider) *backendMgrTester { cfg.testSuiteConfig.enableRouteLogic = true }) ts, clean := newTestSuite(t, tc, cfg...) + lg, _ := logger.CreateLoggerForTest(t) tester := &backendMgrTester{ testSuite: ts, t: t, - lg: logger.CreateLoggerForTest(t), + lg: lg, } t.Cleanup(func() { clean() @@ -841,7 +842,8 @@ func TestGetBackendIO(t *testing.T) { } }, } - mgr := NewBackendConnManager(logger.CreateLoggerForTest(t), handler, 0, &BCConfig{}) + lg, _ := logger.CreateLoggerForTest(t) + mgr := NewBackendConnManager(lg, handler, 0, &BCConfig{}) var wg waitgroup.WaitGroup for i := 0; i <= len(listeners); i++ { wg.Run(func() { diff --git a/pkg/proxy/backend/common_test.go b/pkg/proxy/backend/common_test.go index aad19834..95e99308 100644 --- a/pkg/proxy/backend/common_test.go +++ b/pkg/proxy/backend/common_test.go @@ -46,7 +46,7 @@ func newTCPConnSuite(t *testing.T) *tcpConnSuite { } func (tc *tcpConnSuite) newConn(t *testing.T, enableRoute bool) func() { - lg := logger.CreateLoggerForTest(t) + lg, _ := logger.CreateLoggerForTest(t) var wg waitgroup.WaitGroup if !enableRoute { wg.Run(func() { diff --git a/pkg/proxy/backend/mock_proxy_test.go b/pkg/proxy/backend/mock_proxy_test.go index 05cd0c8c..3ae4db73 100644 --- a/pkg/proxy/backend/mock_proxy_test.go +++ b/pkg/proxy/backend/mock_proxy_test.go @@ -46,10 +46,11 @@ type mockProxy struct { } func newMockProxy(t *testing.T, cfg *proxyConfig) *mockProxy { + lg, _ := logger.CreateLoggerForTest(t) mp := &mockProxy{ proxyConfig: cfg, - logger: logger.CreateLoggerForTest(t).Named("mockProxy"), - BackendConnManager: NewBackendConnManager(logger.CreateLoggerForTest(t), cfg.handler, 0, &BCConfig{ + logger: lg.Named("mockProxy"), + BackendConnManager: NewBackendConnManager(lg, cfg.handler, 0, &BCConfig{ CheckBackendInterval: cfg.checkBackendInterval, }), } diff --git a/pkg/proxy/net/packetio_test.go b/pkg/proxy/net/packetio_test.go index 75466929..9d2945fd 100644 --- a/pkg/proxy/net/packetio_test.go +++ b/pkg/proxy/net/packetio_test.go @@ -18,7 +18,7 @@ import ( ) func testPipeConn(t *testing.T, a func(*testing.T, *PacketIO), b func(*testing.T, *PacketIO), loop int) { - lg := logger.CreateLoggerForTest(t) + lg, _ := logger.CreateLoggerForTest(t) testkit.TestPipeConn(t, func(t *testing.T, c net.Conn) { a(t, NewPacketIO(c, lg)) @@ -29,7 +29,7 @@ func testPipeConn(t *testing.T, a func(*testing.T, *PacketIO), b func(*testing.T } func testTCPConn(t *testing.T, a func(*testing.T, *PacketIO), b func(*testing.T, *PacketIO), loop int) { - lg := logger.CreateLoggerForTest(t) + lg, _ := logger.CreateLoggerForTest(t) testkit.TestTCPConn(t, func(t *testing.T, c net.Conn) { cli := NewPacketIO(c, lg) diff --git a/pkg/proxy/proxy_test.go b/pkg/proxy/proxy_test.go index d49476f2..720d39bb 100644 --- a/pkg/proxy/proxy_test.go +++ b/pkg/proxy/proxy_test.go @@ -17,7 +17,7 @@ import ( func TestGracefulShutdown(t *testing.T) { // Graceful shutdown finishes immediately if there's no connection. - lg := logger.CreateLoggerForTest(t) + lg, _ := logger.CreateLoggerForTest(t) hsHandler := backend.NewDefaultHandshakeHandler(nil, "") server, err := NewSQLServer(lg, config.ProxyServer{ ProxyServerOnline: config.ProxyServerOnline{