From c917e2c859b34af517309c4d1d6c3c840f654487 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dani=C3=ABl=20van=20Eeden?= Date: Tue, 16 Jun 2026 09:27:01 +0200 Subject: [PATCH 1/3] Modernize engine --- engine/chaos/cases/case_fake_job.go | 6 +- engine/chaos/cases/cases.go | 1 - engine/chaos/cases/dm/case.go | 8 +- engine/chaos/cases/dm/db.go | 2 +- engine/executor/cvs/cvstask.go | 2 +- engine/executor/dm/unitholder.go | 24 ++- engine/executor/dm/unitholder_test.go | 4 +- engine/executor/openapi_test.go | 6 +- engine/executor/worker/task_committer.go | 6 +- engine/executor/worker/task_runner.go | 2 +- engine/executor/worker/task_runner_test.go | 22 +-- engine/framework/base_jobmaster.go | 8 +- engine/framework/base_jobmaster_test.go | 2 +- engine/framework/common.go | 2 +- .../internal/eventloop/runner_test.go | 18 +-- .../framework/internal/master/mock_handle.go | 2 +- .../internal/master/worker_handle.go | 4 +- .../internal/master/worker_manager.go | 7 +- .../internal/master/worker_manager_test.go | 6 +- .../internal/worker/master_client_test.go | 6 +- engine/framework/master.go | 2 +- engine/framework/master_test.go | 6 +- engine/framework/message_router_test.go | 12 +- engine/framework/mock_master_impl.go | 4 +- engine/framework/mock_worker_util.go | 2 +- engine/framework/model/master.go | 2 +- engine/framework/model/master_test.go | 1 - engine/framework/model/worker.go | 4 +- engine/framework/registry/registry.go | 6 +- engine/framework/registry/registry_test.go | 6 +- engine/framework/worker.go | 22 +-- engine/framework/worker_test.go | 14 +- engine/internal/pkg/discovery/agent_test.go | 6 +- engine/jobmaster/cvsjob/cvs_job_master.go | 2 +- engine/jobmaster/dm/api.go | 18 +-- engine/jobmaster/dm/ddl_coordinator.go | 5 +- engine/jobmaster/dm/ddl_coordinator_test.go | 12 +- engine/jobmaster/dm/dm_jobmaster.go | 6 +- engine/jobmaster/dm/dm_jobmaster_test.go | 12 +- engine/jobmaster/dm/metadata/state.go | 6 +- engine/jobmaster/dm/task_manager.go | 6 +- engine/jobmaster/dm/task_manager_test.go | 6 +- engine/jobmaster/dm/worker_manager.go | 14 +- engine/jobmaster/dm/worker_manager_test.go | 8 +- engine/jobmaster/example/master_impl.go | 2 +- engine/jobmaster/fakejob/job_master.go | 2 +- engine/pkg/client/executor_group_test.go | 12 +- engine/pkg/client/internal/call_test.go | 12 +- engine/pkg/client/internal/leader_resolver.go | 6 +- .../client/internal/leader_resolver_test.go | 4 +- engine/pkg/client/test_util.go | 4 +- engine/pkg/containers/slice_queue_test.go | 22 ++- engine/pkg/deps/deps.go | 8 +- engine/pkg/dm/message_agent.go | 44 +++--- engine/pkg/dm/message_agent_test.go | 15 +- engine/pkg/dm/mock_message_agent.go | 6 +- engine/pkg/dm/ticker/ticker_test.go | 6 +- engine/pkg/errctx/center_test.go | 16 +- .../broker/broker_integration_test.go | 4 +- .../externalresource/broker/broker_test.go | 3 +- .../integration_test/mock_cluster.go | 12 +- .../internal/bucket/file_manager.go | 2 +- .../bucket/file_manager_integration_test.go | 8 +- .../internal/bucket/file_path_util.go | 2 +- .../bucket/resource_controller_test.go | 4 +- .../internal/local/file_manager.go | 2 +- .../internal/local/file_manager_test.go | 6 +- .../manager/gc_coordinator_test.go | 6 +- .../manager/gc_runner_test.go | 10 +- .../externalresource/manager/test_utils.go | 9 +- engine/pkg/externalresource/model/model.go | 4 +- engine/pkg/meta/client_test.go | 2 +- engine/pkg/meta/internal/etcdkv/connection.go | 2 +- .../meta/internal/etcdkv/etcd_impl_test.go | 8 +- engine/pkg/meta/internal/sqlkv/connection.go | 2 +- .../pkg/meta/internal/sqlkv/sql_impl_test.go | 30 ++-- engine/pkg/meta/mock/clientconn_mock.go | 6 +- .../pkg/meta/mock/simple_mockclient_test.go | 8 +- engine/pkg/meta/model/common.go | 10 +- engine/pkg/meta/model/config.go | 5 +- engine/pkg/meta/model/interfaces.go | 2 +- engine/pkg/notifier/notifier.go | 6 +- engine/pkg/notifier/notifier_test.go | 18 +-- engine/pkg/orm/client.go | 2 +- engine/pkg/orm/client_test.go | 140 +++++++++--------- engine/pkg/orm/log.go | 6 +- engine/pkg/orm/mock_test.go | 92 ++++++------ engine/pkg/orm/model/common.go | 2 +- engine/pkg/orm/model/executor.go | 6 +- engine/pkg/orm/model/jobop.go | 4 +- engine/pkg/p2p/message_sender.go | 8 +- .../pkg/p2p/mock_message_handler_manager.go | 2 +- engine/pkg/p2p/mock_message_sender.go | 6 +- engine/pkg/p2p/mock_message_sender_test.go | 12 +- engine/pkg/p2p/server.go | 4 +- engine/pkg/p2p/server_integration_test.go | 12 +- engine/pkg/rpcutil/middleware.go | 7 +- engine/servermaster/executor_manager.go | 6 +- engine/servermaster/executor_manager_test.go | 18 +-- engine/servermaster/http_test.go | 2 - engine/servermaster/jobmanager.go | 2 +- engine/servermaster/jobmanager_test.go | 57 +++---- engine/servermaster/jobop/backoff_test.go | 2 +- engine/servermaster/jobop/operator_test.go | 2 +- engine/servermaster/server_test.go | 18 +-- .../serverutil/watch_executors_test.go | 12 +- engine/servermaster/service_util_test.go | 2 +- engine/test/e2e/e2e_dm_test.go | 10 +- engine/test/e2e/e2e_node_chaos_test.go | 12 +- engine/test/mock/grpc.go | 6 +- engine/test/mock/test_server.go | 6 +- 111 files changed, 481 insertions(+), 627 deletions(-) diff --git a/engine/chaos/cases/case_fake_job.go b/engine/chaos/cases/case_fake_job.go index 80f9ed58c5..834abde405 100644 --- a/engine/chaos/cases/case_fake_job.go +++ b/engine/chaos/cases/case_fake_job.go @@ -95,7 +95,7 @@ func runFakeJobCase(ctx context.Context, cfg *config) error { mvcc := 0 interval := 60 * time.Second runTime := 10 - for i := 0; i < runTime; i++ { + for i := range runTime { value := fmt.Sprintf("update-value-index-%d", i) mvcc++ start := time.Now() @@ -119,7 +119,7 @@ func updateKeyAndCheck( ctx context.Context, cli *e2e.ChaosCli, jobID string, workerCount int, updateValue string, expectedMvcc int, ) error { - for i := 0; i < workerCount; i++ { + for i := range workerCount { err := cli.UpdateFakeJobKey(ctx, i, updateValue) if err != nil { return err @@ -127,7 +127,7 @@ func updateKeyAndCheck( } // retry 6 minutes at most finished := util.WaitSomething(60, time.Second*6, func() bool { - for jobIdx := 0; jobIdx < workerCount; jobIdx++ { + for jobIdx := range workerCount { err := cli.CheckFakeJobKey(ctx, jobID, jobIdx, expectedMvcc, updateValue) if err != nil { log.Warn("check fail job failed", zap.Error(err)) diff --git a/engine/chaos/cases/cases.go b/engine/chaos/cases/cases.go index dc185dc54e..fbe6f963b4 100644 --- a/engine/chaos/cases/cases.go +++ b/engine/chaos/cases/cases.go @@ -26,7 +26,6 @@ var cases = []caseFn{runFakeJobCase, runDMJobCases} func runCases(ctx context.Context, cfg *config) error { errg, ctx := errgroup.WithContext(ctx) for _, fn := range cases { - fn := fn errg.Go(func() error { return fn(ctx, cfg) }) diff --git a/engine/chaos/cases/dm/case.go b/engine/chaos/cases/dm/case.go index ed8100c21c..2f31b7aa8a 100644 --- a/engine/chaos/cases/dm/case.go +++ b/engine/chaos/cases/dm/case.go @@ -106,7 +106,7 @@ func NewCase(ctx context.Context, addr string, name string, cfgPath string) (*Ca for range c.sources { generators := make(map[string]sqlgen.SQLGenerator) mcps := make(map[string]*mcp.ModificationCandidatePool) - for i := 0; i < tableNum; i++ { + for i := range tableNum { tableName := fmt.Sprintf("tb%d", i) tableConfig := &sqlconfig.TableConfig{ DatabaseName: c.name, @@ -194,7 +194,7 @@ func (c *Case) genFullData() error { return err } sqls := make([]string, 0, rowNum) - for j := 0; j < rowNum; j++ { + for range rowNum { sql, uk, err := generator.GenInsertRow() if err != nil { return err @@ -244,7 +244,7 @@ func (c *Case) diffData(ctx context.Context) (bool, error) { } func (c *Case) diffDataLoop(ctx context.Context) error { - for i := 0; i < diffTimes; i++ { + for range diffTimes { select { case <-ctx.Done(): return nil @@ -329,7 +329,7 @@ func (c *Case) genIncrData(ctx context.Context) error { tableName := c.tables[rand.Intn(tableNum)] sqls := make([]string, 0, batch) - for i := 0; i < batch; i++ { + for range batch { sql, err := c.randDML(source, tableName, deleteKeys) if err != nil { return err diff --git a/engine/chaos/cases/dm/db.go b/engine/chaos/cases/dm/db.go index 71ca189d06..cf8f2adaf1 100644 --- a/engine/chaos/cases/dm/db.go +++ b/engine/chaos/cases/dm/db.go @@ -97,7 +97,7 @@ func (dc *dbConn) ExecuteSQLs(queries ...string) (int, error) { } ret, _, err := dc.con.ApplyRetryStrategy(tcontext.NewContext(ctx, log.L()), params, - func(tctx *tcontext.Context) (interface{}, error) { + func(tctx *tcontext.Context) (any, error) { ret, err2 := dc.con.ExecuteSQLWithIgnoreError(tctx, nil, "chaos-cases", ignoreExecSQLError, queries) return ret, err2 }) diff --git a/engine/executor/cvs/cvstask.go b/engine/executor/cvs/cvstask.go index c7582cb860..495e733042 100644 --- a/engine/executor/cvs/cvstask.go +++ b/engine/executor/cvs/cvstask.go @@ -72,7 +72,7 @@ func (c *connPool) getConn(addr string) (*grpc.ClientConn, error) { defer c.Unlock() arr, ok := c.pool[addr] if !ok { - for i := 0; i < 5; i++ { + for range 5 { conn, err := grpc.Dial(addr, grpc.WithInsecure()) if err != nil { return nil, err diff --git a/engine/executor/dm/unitholder.go b/engine/executor/dm/unitholder.go index 7f5d620430..dd8cbf80fe 100644 --- a/engine/executor/dm/unitholder.go +++ b/engine/executor/dm/unitholder.go @@ -43,7 +43,7 @@ type unitHolder interface { Pause(ctx context.Context) error Resume(ctx context.Context) error Stage() (metadata.TaskStage, *pb.ProcessResult) - Status(ctx context.Context) interface{} + Status(ctx context.Context) any // CheckAndUpdateStatus checks if the last update of source status is outdated, // if so, it will call Status. // this should be an async func. @@ -136,12 +136,10 @@ func (u *unitHolderImpl) Init(ctx context.Context) error { u.fieldMu.Unlock() resultCh := make(chan pb.ProcessResult, 1) - u.processWg.Add(1) - go func() { - defer u.processWg.Done() + u.processWg.Go(func() { u.unit.Process(runCtx, resultCh) u.fetchAndHandleResult(resultCh) - }() + }) return nil } @@ -183,12 +181,10 @@ func (u *unitHolderImpl) Resume(ctx context.Context) error { u.fieldMu.Unlock() resultCh := make(chan pb.ProcessResult, 1) - u.processWg.Add(1) - go func() { - defer u.processWg.Done() + u.processWg.Go(func() { u.unit.Resume(runCtx, resultCh) u.fetchAndHandleResult(resultCh) - }() + }) return nil } @@ -243,12 +239,12 @@ func (u *unitHolderImpl) Stage() (metadata.TaskStage, *pb.ProcessResult) { // Status implement UnitHolder.Status. Each invocation will try to query upstream // once and calculate the status. -func (u *unitHolderImpl) Status(ctx context.Context) interface{} { +func (u *unitHolderImpl) Status(ctx context.Context) any { // nil sourceStatus is supported return u.unit.Status(u.getSourceStatus()) } -func (u *unitHolderImpl) updateSourceStatus(ctx context.Context) interface{} { +func (u *unitHolderImpl) updateSourceStatus(ctx context.Context) any { sourceStatus, err := binlog.GetSourceStatus( tcontext.NewContext(ctx, u.logger), u.upstreamDB, @@ -279,13 +275,11 @@ func (u *unitHolderImpl) CheckAndUpdateStatus() { defer u.fieldMu.Unlock() if time.Since(u.sourceStatusCheckTime) > sourceStatusRefreshInterval { u.sourceStatusCheckTime = time.Now() - u.bgWg.Add(1) - go func() { - defer u.bgWg.Done() + u.bgWg.Go(func() { ctx, cancel := context.WithTimeout(context.Background(), sourceStatusCtxTimeOut) u.updateSourceStatus(ctx) cancel() - }() + }) } } diff --git a/engine/executor/dm/unitholder_test.go b/engine/executor/dm/unitholder_test.go index 569eddd5f8..a3a6d4d845 100644 --- a/engine/executor/dm/unitholder_test.go +++ b/engine/executor/dm/unitholder_test.go @@ -261,7 +261,7 @@ func (u *mockUnit) Update(ctx context.Context, cfg *config.SubTaskConfig) error return nil } -func (u *mockUnit) Status(sourceStatus *binlog.SourceStatus) interface{} { +func (u *mockUnit) Status(sourceStatus *binlog.SourceStatus) any { u.Lock() defer u.Unlock() return u.Called().Get(0) @@ -321,7 +321,7 @@ func (m *mockUnitHolder) Stage() (metadata.TaskStage, *pb.ProcessResult) { } // Status implement Holder.Status -func (m *mockUnitHolder) Status(ctx context.Context) interface{} { +func (m *mockUnitHolder) Status(ctx context.Context) any { m.Lock() defer m.Unlock() args := m.Called() diff --git a/engine/executor/openapi_test.go b/engine/executor/openapi_test.go index 9af73a8955..f1d28e7118 100644 --- a/engine/executor/openapi_test.go +++ b/engine/executor/openapi_test.go @@ -76,12 +76,10 @@ func TestJobAPIServer(t *testing.T) { wg := sync.WaitGroup{} stoppedJobs := make(chan engineModel.JobID, 16) - wg.Add(1) - go func() { - defer wg.Done() + wg.Go(func() { err := jobAPISrv.listenStoppedJobs(context.Background(), stoppedJobs) require.NoError(t, err) - }() + }) stoppedJobs <- "job1" require.Eventually(t, func() bool { diff --git a/engine/executor/worker/task_committer.go b/engine/executor/worker/task_committer.go index 21ac6976c6..6284e9c0f2 100644 --- a/engine/executor/worker/task_committer.go +++ b/engine/executor/worker/task_committer.go @@ -85,11 +85,9 @@ func newTaskCommitterWithClock( requestTTL: requestTTL, } - committer.wg.Add(1) - go func() { - defer committer.wg.Done() + committer.wg.Go(func() { committer.runTTLChecker() - }() + }) return committer } diff --git a/engine/executor/worker/task_runner.go b/engine/executor/worker/task_runner.go index 4632279daf..2c78cf8119 100644 --- a/engine/executor/worker/task_runner.go +++ b/engine/executor/worker/task_runner.go @@ -124,7 +124,7 @@ func (r *TaskRunner) cancelAll() { } r.canceled = true - r.tasks.Range(func(key, value interface{}) bool { + r.tasks.Range(func(key, value any) bool { id := key.(RunnableID) t := value.(*taskEntry) t.cancel() diff --git a/engine/executor/worker/task_runner_test.go b/engine/executor/worker/task_runner_test.go index afb0845cde..80ba789177 100644 --- a/engine/executor/worker/task_runner_test.go +++ b/engine/executor/worker/task_runner_test.go @@ -39,16 +39,14 @@ func TestTaskRunnerBasics(t *testing.T) { tr := NewTaskRunner(workerNum+1, 1) var wg sync.WaitGroup - wg.Add(1) - go func() { - defer wg.Done() + wg.Go(func() { err := tr.Run(ctx) require.Error(t, err) require.Regexp(t, "context canceled", err.Error()) - }() + }) var workers []*dummyWorker - for i := 0; i < workerNum; i++ { + for i := range workerNum { worker := &dummyWorker{ id: fmt.Sprintf("worker-%d", i), } @@ -95,13 +93,11 @@ func TestTaskRunnerSubmitTime(t *testing.T) { mockClock.Add(time.Hour) var wg sync.WaitGroup - wg.Add(1) - go func() { - defer wg.Done() + wg.Go(func() { err := tr.Run(ctx) require.Error(t, err) require.Regexp(t, "context canceled", err.Error()) - }() + }) require.Eventually(t, func() bool { return worker.SubmitTime() == clock.ToMono(submitTime) @@ -117,19 +113,17 @@ func TestTaskStopReceiver(t *testing.T) { tr := NewTaskRunner(workerNum+1, 1) var wg sync.WaitGroup - wg.Add(1) - go func() { - defer wg.Done() + wg.Go(func() { err := tr.Run(ctx) require.Error(t, err) require.Regexp(t, "context canceled", err.Error()) - }() + }) var ( workers []*dummyWorker running sync.Map ) - for i := 0; i < workerNum; i++ { + for i := range workerNum { worker := &dummyWorker{ id: fmt.Sprintf("worker-%d", i), } diff --git a/engine/framework/base_jobmaster.go b/engine/framework/base_jobmaster.go index 6d46c84a23..7054fafad8 100644 --- a/engine/framework/base_jobmaster.go +++ b/engine/framework/base_jobmaster.go @@ -70,7 +70,7 @@ type BaseJobMaster interface { CurrentEpoch() frameModel.Epoch // SendMessage sends a message of specific topic to jobmanager in a blocking or nonblocking way - SendMessage(ctx context.Context, topic p2p.Topic, message interface{}, nonblocking bool) error + SendMessage(ctx context.Context, topic p2p.Topic, message any, nonblocking bool) error // Exit should be called when jobmaster (in user logic) wants to exit. // exitReason: ExitReasonFinished/ExitReasonCanceled/ExitReasonFailed @@ -344,7 +344,7 @@ func (d *DefaultBaseJobMaster) GetEnabledBucketStorage() (bool, resModel.Resourc } // SendMessage delegates the SendMessage or inner worker -func (d *DefaultBaseJobMaster) SendMessage(ctx context.Context, topic p2p.Topic, message interface{}, nonblocking bool) error { +func (d *DefaultBaseJobMaster) SendMessage(ctx context.Context, topic p2p.Topic, message any, nonblocking bool) error { ctx, cancel := d.errCenter.WithCancelOnFirstError(ctx) defer cancel() @@ -394,7 +394,7 @@ func (j *jobMasterImplAsWorkerImpl) Tick(ctx context.Context) error { } func (j *jobMasterImplAsWorkerImpl) OnMasterMessage( - ctx context.Context, topic p2p.Topic, message interface{}, + ctx context.Context, topic p2p.Topic, message any, ) error { switch msg := message.(type) { case *frameModel.StatusChangeRequest: @@ -451,7 +451,7 @@ func (j *jobMasterImplAsMasterImpl) OnWorkerOffline(worker WorkerHandle, reason return j.inner.OnWorkerOffline(worker, reason) } -func (j *jobMasterImplAsMasterImpl) OnWorkerMessage(worker WorkerHandle, topic p2p.Topic, message interface{}) error { +func (j *jobMasterImplAsMasterImpl) OnWorkerMessage(worker WorkerHandle, topic p2p.Topic, message any) error { return j.inner.OnWorkerMessage(worker, topic, message) } diff --git a/engine/framework/base_jobmaster_test.go b/engine/framework/base_jobmaster_test.go index 4997d9c649..a1bd78390e 100644 --- a/engine/framework/base_jobmaster_test.go +++ b/engine/framework/base_jobmaster_test.go @@ -124,7 +124,7 @@ func (m *testJobMasterImpl) OnWorkerOffline(worker WorkerHandle, reason error) e return args.Error(0) } -func (m *testJobMasterImpl) OnWorkerMessage(worker WorkerHandle, topic p2p.Topic, message interface{}) error { +func (m *testJobMasterImpl) OnWorkerMessage(worker WorkerHandle, topic p2p.Topic, message any) error { m.mu.Lock() defer m.mu.Unlock() diff --git a/engine/framework/common.go b/engine/framework/common.go index fd93d8acbd..38369efc68 100644 --- a/engine/framework/common.go +++ b/engine/framework/common.go @@ -26,7 +26,7 @@ type ( WorkerType = frameModel.WorkerType // WorkerConfig stores worker config in any type - WorkerConfig = interface{} + WorkerConfig = any // WorkerHandle alias to master.WorkerHandle WorkerHandle = master.WorkerHandle diff --git a/engine/framework/internal/eventloop/runner_test.go b/engine/framework/internal/eventloop/runner_test.go index 45db21dd2d..e328ace423 100644 --- a/engine/framework/internal/eventloop/runner_test.go +++ b/engine/framework/internal/eventloop/runner_test.go @@ -118,14 +118,12 @@ func TestRunnerNormalPath(t *testing.T) { task.On("Close", mock.Anything).Return(nil).Once() var wg sync.WaitGroup - wg.Add(1) - go func() { - defer wg.Done() + wg.Go(func() { err := runner.Run(context.Background()) require.Error(t, err) require.Regexp(t, "injected error", err) - }() + }) require.Eventually(t, func() bool { return task.status.Load() == toyTaskRunning @@ -153,14 +151,12 @@ func TestRunnerForcefulExit(t *testing.T) { task.On("Close", mock.Anything).Return(nil).Once() var wg sync.WaitGroup - wg.Add(1) - go func() { - defer wg.Done() + wg.Go(func() { err := runner.Run(context.Background()) require.Error(t, err) require.Regexp(t, "ErrWorkerSuicide", err) - }() + }) require.Eventually(t, func() bool { return task.status.Load() == toyTaskRunning @@ -208,13 +204,11 @@ func TestRunnerStopByCancel(t *testing.T) { task.On("Stop", mock.Anything).Return(nil).Once() var wg sync.WaitGroup - wg.Add(1) - go func() { - defer wg.Done() + wg.Go(func() { err := runner.Run(context.Background()) require.Error(t, err) require.Regexp(t, "worker is canceled", err) - }() + }) require.Eventually(t, func() bool { return task.status.Load() == toyTaskRunning diff --git a/engine/framework/internal/master/mock_handle.go b/engine/framework/internal/master/mock_handle.go index 9772c28886..baa1aad87b 100644 --- a/engine/framework/internal/master/mock_handle.go +++ b/engine/framework/internal/master/mock_handle.go @@ -81,7 +81,7 @@ type mockRunningHandle struct { } // SendMessage implements RunningHandle.SendMessage -func (rh mockRunningHandle) SendMessage(ctx context.Context, topic p2p.Topic, message interface{}, nonblocking bool) error { +func (rh mockRunningHandle) SendMessage(ctx context.Context, topic p2p.Topic, message any, nonblocking bool) error { h := rh.handler if h.IsTombstone { return errors.ErrSendingMessageToTombstone.GenWithStackByCause(h.WorkerID) diff --git a/engine/framework/internal/master/worker_handle.go b/engine/framework/internal/master/worker_handle.go index b79891cb3e..3b0dc9435e 100644 --- a/engine/framework/internal/master/worker_handle.go +++ b/engine/framework/internal/master/worker_handle.go @@ -45,7 +45,7 @@ type RunningHandle interface { SendMessage( ctx context.Context, topic p2p.Topic, - message interface{}, + message any, nonblocking bool, ) error } @@ -94,7 +94,7 @@ func (h *runningHandleImpl) Unwrap() RunningHandle { func (h *runningHandleImpl) SendMessage( ctx context.Context, topic p2p.Topic, - message interface{}, + message any, nonblocking bool, ) error { var err error diff --git a/engine/framework/internal/master/worker_manager.go b/engine/framework/internal/master/worker_manager.go index 36f07b4cdc..fddc164067 100644 --- a/engine/framework/internal/master/worker_manager.go +++ b/engine/framework/internal/master/worker_manager.go @@ -121,13 +121,11 @@ func NewWorkerManager( timeouts: timeoutConfig, } - ret.wg.Add(1) - go func() { - defer ret.wg.Done() + ret.wg.Go(func() { if err := ret.runBackgroundChecker(); err != nil { ret.errCenter.OnError(err) } - }() + }) return ret } @@ -489,7 +487,6 @@ func (m *WorkerManager) checkWorkerEntriesOnce() error { } for workerID, entry := range m.workerEntries { - entry := entry state := entry.State() if state == workerEntryOffline || state == workerEntryTombstone { // Prevent repeated delivery of the workerOffline event. diff --git a/engine/framework/internal/master/worker_manager_test.go b/engine/framework/internal/master/worker_manager_test.go index 7bc1a5afb5..b1b486617f 100644 --- a/engine/framework/internal/master/worker_manager_test.go +++ b/engine/framework/internal/master/worker_manager_test.go @@ -559,9 +559,7 @@ func TestWorkerSendsStaleHeartbeat(t *testing.T) { ctx, cancel := context.WithCancel(context.Background()) var wg sync.WaitGroup - wg.Add(1) - go func() { - defer wg.Done() + wg.Go(func() { for { select { case <-ctx.Done(): @@ -570,7 +568,7 @@ func TestWorkerSendsStaleHeartbeat(t *testing.T) { suite.SimulateHeartbeat("worker-1", 1, wEpoch-1, "executor-1", false) } } - }() + }) event = suite.WaitForEvent(t, "worker-1") require.Equal(t, workerOfflineEvent, event.Tp) diff --git a/engine/framework/internal/worker/master_client_test.go b/engine/framework/internal/worker/master_client_test.go index 2d15c844fb..b9c505ff70 100644 --- a/engine/framework/internal/worker/master_client_test.go +++ b/engine/framework/internal/worker/master_client_test.go @@ -91,15 +91,13 @@ func (h *masterClientTestHelper) PopHeartbeat(t *testing.T) *frameModel.Heartbea } func (h *masterClientTestHelper) SimulateWorkerClose(timeout time.Duration) { - h.wg.Add(1) - go func() { - defer h.wg.Done() + h.wg.Go(func() { ctx, cancel := context.WithTimeout(context.Background(), timeout) defer cancel() h.closeErrCh <- h.Client.WaitClosed(ctx) - }() + }) } func (h *masterClientTestHelper) WaitWorkerClosed(t *testing.T) error { diff --git a/engine/framework/master.go b/engine/framework/master.go index b9a6988098..40c0bc8839 100644 --- a/engine/framework/master.go +++ b/engine/framework/master.go @@ -122,7 +122,7 @@ type MasterImpl interface { OnWorkerOffline(worker WorkerHandle, reason error) error // OnWorkerMessage is called when a customized message is received. - OnWorkerMessage(worker WorkerHandle, topic p2p.Topic, message interface{}) error + OnWorkerMessage(worker WorkerHandle, topic p2p.Topic, message any) error // OnWorkerStatusUpdated is called as the consequence of worker's UpdateStatus. // Return: diff --git a/engine/framework/master_test.go b/engine/framework/master_test.go index 00f7454bf0..0eb7f7410a 100644 --- a/engine/framework/master_test.go +++ b/engine/framework/master_test.go @@ -101,9 +101,7 @@ func TestMasterPollAndClose(t *testing.T) { master.On("Tick", mock.Anything).Return(nil) var wg sync.WaitGroup - wg.Add(1) - go func() { - defer wg.Done() + wg.Go(func() { for { err := master.Poll(ctx) if err != nil { @@ -113,7 +111,7 @@ func TestMasterPollAndClose(t *testing.T) { } require.NoError(t, err) } - }() + }) require.Eventually(t, func() bool { return master.TickCount() > 10 diff --git a/engine/framework/message_router_test.go b/engine/framework/message_router_test.go index d49ea868bc..a98987d68b 100644 --- a/engine/framework/message_router_test.go +++ b/engine/framework/message_router_test.go @@ -61,21 +61,17 @@ func testMessageRouter(t *testing.T, suite *messageSuite) { ctx, cancel := context.WithCancel(context.Background()) var wg sync.WaitGroup - wg.Add(1) - go func() { - defer wg.Done() + wg.Go(func() { _ = pool.Run(ctx) - }() + }) - wg.Add(1) - go func() { - defer wg.Done() + wg.Go(func() { for { if err := router.Tick(ctx); err != nil { return } } - }() + }) require.Eventually(t, func() bool { if int(msgCounter.Load()) != len(suite.expected) { diff --git a/engine/framework/mock_master_impl.go b/engine/framework/mock_master_impl.go index ad604453af..d99e3db631 100644 --- a/engine/framework/mock_master_impl.go +++ b/engine/framework/mock_master_impl.go @@ -218,7 +218,7 @@ func (m *MockMasterImpl) OnWorkerOffline(worker WorkerHandle, reason error) erro } // OnWorkerMessage implements MasterImpl.OnWorkerMessage -func (m *MockMasterImpl) OnWorkerMessage(worker WorkerHandle, topic p2p.Topic, message interface{}) error { +func (m *MockMasterImpl) OnWorkerMessage(worker WorkerHandle, topic p2p.Topic, message any) error { m.mu.Lock() defer m.mu.Unlock() @@ -283,7 +283,7 @@ func (m *MockWorkerHandler) Unwrap() master.RunningHandle { } // SendMessage implements RunningHandle.SendMessage -func (m *MockWorkerHandler) SendMessage(ctx context.Context, topic p2p.Topic, message interface{}, nonblocking bool) error { +func (m *MockWorkerHandler) SendMessage(ctx context.Context, topic p2p.Topic, message any, nonblocking bool) error { args := m.Called(ctx, topic, message, nonblocking) return args.Error(0) } diff --git a/engine/framework/mock_worker_util.go b/engine/framework/mock_worker_util.go index b7e44b9905..f67681b93f 100644 --- a/engine/framework/mock_worker_util.go +++ b/engine/framework/mock_worker_util.go @@ -88,7 +88,7 @@ func MockBaseWorkerCheckSendMessage( t *testing.T, worker *DefaultBaseWorker, topic p2p.Topic, - message interface{}, + message any, ) { masterNode := worker.masterClient.MasterNode() got, ok := worker.messageSender.(*p2p.MockMessageSender).TryPop(masterNode, topic) diff --git a/engine/framework/model/master.go b/engine/framework/model/master.go index 63d6f593da..7965e35a12 100644 --- a/engine/framework/model/master.go +++ b/engine/framework/model/master.go @@ -69,7 +69,7 @@ func (e MasterMetaExt) Value() (driver.Value, error) { } // Scan implements sql.Scanner. -func (e *MasterMetaExt) Scan(rawInput interface{}) error { +func (e *MasterMetaExt) Scan(rawInput any) error { // Zero the fields. *e = MasterMetaExt{} diff --git a/engine/framework/model/master_test.go b/engine/framework/model/master_test.go index 0ea8ef3624..fbd04b1806 100644 --- a/engine/framework/model/master_test.go +++ b/engine/framework/model/master_test.go @@ -98,7 +98,6 @@ func TestMasterMetaExtScan(t *testing.T) { } for i := range cases { - i := i t.Run(fmt.Sprintf("subcase-%d", i), func(t *testing.T) { t.Parallel() var ext MasterMetaExt diff --git a/engine/framework/model/worker.go b/engine/framework/model/worker.go index 14df407af7..7f7aa0354b 100644 --- a/engine/framework/model/worker.go +++ b/engine/framework/model/worker.go @@ -105,8 +105,8 @@ func (s *WorkerStatus) Unmarshal(bytes []byte) error { } // Map is used for update the orm model -func (s *WorkerStatus) Map() map[string]interface{} { - return map[string]interface{}{ +func (s *WorkerStatus) Map() map[string]any { + return map[string]any{ "project_id": s.ProjectID, "job_id": s.JobID, "id": s.ID, diff --git a/engine/framework/registry/registry.go b/engine/framework/registry/registry.go index 0f9db23e6f..f4cc06c51a 100644 --- a/engine/framework/registry/registry.go +++ b/engine/framework/registry/registry.go @@ -162,11 +162,11 @@ var ( nameOfBaseJobMaster = getTypeNameOfVarPtr(new(framework.BaseJobMaster)) ) -func getTypeNameOfVarPtr(v interface{}) string { +func getTypeNameOfVarPtr(v any) string { return reflect.TypeOf(v).Elem().Name() } -func implHasMember(impl interface{}, memberName string) bool { +func implHasMember(impl any, memberName string) bool { defer func() { if v := recover(); v != nil { log.Panic("wrong use of implHasMember", @@ -176,7 +176,7 @@ func implHasMember(impl interface{}, memberName string) bool { return reflect.ValueOf(impl).Elem().FieldByName(memberName) != reflect.Value{} } -func setImplMember(impl interface{}, memberName string, value interface{}) { +func setImplMember(impl any, memberName string, value any) { defer func() { if v := recover(); v != nil { log.Panic("wrong use of setImplMember", diff --git a/engine/framework/registry/registry_test.go b/engine/framework/registry/registry_test.go index 4272362425..026075fb98 100644 --- a/engine/framework/registry/registry_test.go +++ b/engine/framework/registry/registry_test.go @@ -100,7 +100,7 @@ func TestImplHasMember(t *testing.T) { type myImpl struct { MyMember int } - type myIface interface{} + type myIface any var iface myIface = &myImpl{} require.True(t, implHasMember(iface, "MyMember")) @@ -110,12 +110,12 @@ func TestImplHasMember(t *testing.T) { func TestSetImplMember(t *testing.T) { t.Parallel() - type MyBase interface{} + type MyBase any type myImpl struct { MyBase } - type myImplIface interface{} + type myImplIface any var iface myImplIface = &myImpl{} diff --git a/engine/framework/worker.go b/engine/framework/worker.go index df61679a93..c4f99d0f32 100644 --- a/engine/framework/worker.go +++ b/engine/framework/worker.go @@ -113,7 +113,7 @@ type BaseWorker interface { UpdateStatus(ctx context.Context, status frameModel.WorkerStatus) error // SendMessage sends a message of specific topic to master in a blocking or nonblocking way - SendMessage(ctx context.Context, topic p2p.Topic, message interface{}, nonblocking bool) error + SendMessage(ctx context.Context, topic p2p.Topic, message any, nonblocking bool) error // OpenStorage creates a resource and return the resource handle OpenStorage( @@ -299,14 +299,12 @@ func (w *DefaultBaseWorker) doPreInit(ctx context.Context) (retErr error) { w.cancelPool = cancelPool w.cancelMu.Unlock() - w.wg.Add(1) - go func() { - defer w.wg.Done() + w.wg.Go(func() { err := w.pool.Run(poolCtx) w.Logger().Info("workerpool exited", zap.String("worker-id", w.id), zap.Error(err)) - }() + }) initTime := w.clock.Mono() rctx, ok := runtime.ToRuntimeCtx(ctx) @@ -487,7 +485,7 @@ func (w *DefaultBaseWorker) UpdateStatus(ctx context.Context, status frameModel. func (w *DefaultBaseWorker) SendMessage( ctx context.Context, topic p2p.Topic, - message interface{}, + message any, nonblocking bool, ) error { var err error @@ -553,21 +551,17 @@ func (w *DefaultBaseWorker) startBackgroundTasks() { w.cancelBgTasks = cancel w.cancelMu.Unlock() - w.wg.Add(1) - go func() { - defer w.wg.Done() + w.wg.Go(func() { if err := w.runHeartbeatWorker(ctx); err != nil { w.onError(err) } - }() + }) - w.wg.Add(1) - go func() { - defer w.wg.Done() + w.wg.Go(func() { if err := w.runWatchDog(ctx); err != nil { w.onError(err) } - }() + }) } func (w *DefaultBaseWorker) runHeartbeatWorker(ctx context.Context) error { diff --git a/engine/framework/worker_test.go b/engine/framework/worker_test.go index 9583ca6de8..5acaff63ea 100644 --- a/engine/framework/worker_test.go +++ b/engine/framework/worker_test.go @@ -138,7 +138,7 @@ func TestWorkerHeartbeatPingPong(t *testing.T) { worker.On("Tick", mock.Anything).Return(nil) var lastHeartbeatSendTime clock.MonotonicTime - for i := 0; i < heartbeatPingPongTestRepeatTimes; i++ { + for range heartbeatPingPongTestRepeatTimes { err := worker.Poll(ctx) require.NoError(t, err) @@ -394,11 +394,9 @@ func TestWorkerGracefulExit(t *testing.T) { require.Regexp(t, ".*fake error.*", err) var wg sync.WaitGroup - wg.Add(1) - go func() { - defer wg.Done() + wg.Go(func() { require.NoError(t, worker.NotifyExit(ctx, err)) - }() + }) for { // Make the heartbeat worker tick. @@ -465,14 +463,12 @@ func TestWorkerGracefulExitWhileTimeout(t *testing.T) { wg sync.WaitGroup ) - wg.Add(1) - go func() { - defer wg.Done() + wg.Go(func() { defer done.Store(true) err := worker.NotifyExit(ctx, err) require.Error(t, err) require.Regexp(t, "context deadline exceeded", err) - }() + }) for { // Make the heartbeat worker tick. diff --git a/engine/internal/pkg/discovery/agent_test.go b/engine/internal/pkg/discovery/agent_test.go index f496a719bc..cd8798e66a 100644 --- a/engine/internal/pkg/discovery/agent_test.go +++ b/engine/internal/pkg/discovery/agent_test.go @@ -72,13 +72,11 @@ func TestAgent(t *testing.T) { defer cancel() var wg sync.WaitGroup - wg.Add(1) - go func() { - defer wg.Done() + wg.Go(func() { err := agent.Run(ctx) require.ErrorIs(t, err, context.Canceled) - }() + }) initialSnap := Snapshot{ "master-1": Node{ diff --git a/engine/jobmaster/cvsjob/cvs_job_master.go b/engine/jobmaster/cvsjob/cvs_job_master.go index c4e9d0e7f9..74cf12f7de 100644 --- a/engine/jobmaster/cvsjob/cvs_job_master.go +++ b/engine/jobmaster/cvsjob/cvs_job_master.go @@ -118,7 +118,7 @@ func (jm *JobMaster) InitImpl(ctx context.Context) (err error) { } log.Info("cvs jobmaster list file success", zap.Any("id", jm.workerID), zap.Any("file number", filesNum)) // todo: store the jobmaster information into the metastore - for idx := 0; idx < filesNum; idx++ { + for idx := range filesNum { jm.jobStatus.FileInfos[idx] = &SyncFileInfo{Idx: idx} jm.syncFilesInfo[idx] = &WorkerInfo{ needCreate: *atomic.NewBool(true), diff --git a/engine/jobmaster/dm/api.go b/engine/jobmaster/dm/api.go index 960ebd5205..6fe753a8e7 100644 --- a/engine/jobmaster/dm/api.go +++ b/engine/jobmaster/dm/api.go @@ -103,9 +103,7 @@ func (jm *JobMaster) QueryJobStatus(ctx context.Context, tasks []string) (*JobSt unitState, existUnitState = state.(*metadata.UnitState) for _, task := range tasks { taskID := task - wg.Add(1) - go func() { - defer wg.Done() + wg.Go(func() { var ( queryStatusResp *dmpkg.QueryStatusResponse @@ -150,7 +148,7 @@ func (jm *JobMaster) QueryJobStatus(ctx context.Context, tasks []string) (*JobSt Duration: duration, } mu.Unlock() - }() + }) } wg.Wait() @@ -234,9 +232,7 @@ func (jm *JobMaster) Binlog(ctx context.Context, req *dmpkg.BinlogRequest) (*dmp ) for _, task := range req.Sources { taskID := task - wg.Add(1) - go func() { - defer wg.Done() + wg.Go(func() { req := &dmpkg.BinlogTaskRequest{ Op: req.Op, BinlogPos: req.BinlogPos, @@ -246,7 +242,7 @@ func (jm *JobMaster) Binlog(ctx context.Context, req *dmpkg.BinlogRequest) (*dmp mu.Lock() binlogResp.Results[taskID] = resp mu.Unlock() - }() + }) } wg.Wait() return binlogResp, nil @@ -277,9 +273,7 @@ func (jm *JobMaster) BinlogSchema(ctx context.Context, req *dmpkg.BinlogSchemaRe ) for _, task := range req.Sources { taskID := task - wg.Add(1) - go func() { - defer wg.Done() + wg.Go(func() { req := &dmpkg.BinlogSchemaTaskRequest{ Op: req.Op, Source: taskID, @@ -295,7 +289,7 @@ func (jm *JobMaster) BinlogSchema(ctx context.Context, req *dmpkg.BinlogSchemaRe mu.Lock() binlogSchemaResponse.Results[taskID] = resp mu.Unlock() - }() + }) } wg.Wait() return binlogSchemaResponse diff --git a/engine/jobmaster/dm/ddl_coordinator.go b/engine/jobmaster/dm/ddl_coordinator.go index 08682f947f..57af0b5201 100644 --- a/engine/jobmaster/dm/ddl_coordinator.go +++ b/engine/jobmaster/dm/ddl_coordinator.go @@ -15,6 +15,7 @@ package dm import ( "context" + "maps" "strings" "sync" @@ -618,9 +619,7 @@ func (g *shardGroup) allTableLarger(tp tableType) bool { } func (g *shardGroup) resolveTables() { - for sourceTable, conflictStmt := range g.conflictTables { - g.normalTables[sourceTable] = conflictStmt - } + maps.Copy(g.normalTables, g.conflictTables) g.conflictTables = make(map[metadata.SourceTable]string) // TODO: redirect for conflict worker. } diff --git a/engine/jobmaster/dm/ddl_coordinator_test.go b/engine/jobmaster/dm/ddl_coordinator_test.go index b4e9b04d53..bc7dde147f 100644 --- a/engine/jobmaster/dm/ddl_coordinator_test.go +++ b/engine/jobmaster/dm/ddl_coordinator_test.go @@ -17,6 +17,7 @@ import ( "context" "encoding/json" "fmt" + "strings" "testing" "github.com/pingcap/log" @@ -838,14 +839,15 @@ func TestGCDroppedColumns(t *testing.T) { } func genCreateStmt(cols ...string) string { - str := "CREATE TABLE tbl(" + var str strings.Builder + str.WriteString("CREATE TABLE tbl(") for idx, col := range cols { if idx == 0 { - str += col + str.WriteString(col) } else { - str += ", " + col + str.WriteString(", " + col) } } - str += ")" - return str + str.WriteString(")") + return str.String() } diff --git a/engine/jobmaster/dm/dm_jobmaster.go b/engine/jobmaster/dm/dm_jobmaster.go index c98b417a30..4df40b082a 100644 --- a/engine/jobmaster/dm/dm_jobmaster.go +++ b/engine/jobmaster/dm/dm_jobmaster.go @@ -296,7 +296,7 @@ func (jm *JobMaster) OnWorkerStatusUpdated(worker framework.WorkerHandle, newSta } // OnJobManagerMessage implements JobMasterImpl.OnJobManagerMessage -func (jm *JobMaster) OnJobManagerMessage(topic p2p.Topic, message interface{}) error { +func (jm *JobMaster) OnJobManagerMessage(topic p2p.Topic, message any) error { // TODO: receive user request return nil } @@ -307,12 +307,12 @@ func (jm *JobMaster) OnOpenAPIInitialized(router *gin.RouterGroup) { } // OnWorkerMessage implements JobMasterImpl.OnWorkerMessage -func (jm *JobMaster) OnWorkerMessage(worker framework.WorkerHandle, topic p2p.Topic, message interface{}) error { +func (jm *JobMaster) OnWorkerMessage(worker framework.WorkerHandle, topic p2p.Topic, message any) error { return nil } // OnMasterMessage implements JobMasterImpl.OnMasterMessage -func (jm *JobMaster) OnMasterMessage(ctx context.Context, topic p2p.Topic, message interface{}) error { +func (jm *JobMaster) OnMasterMessage(ctx context.Context, topic p2p.Topic, message any) error { return nil } diff --git a/engine/jobmaster/dm/dm_jobmaster_test.go b/engine/jobmaster/dm/dm_jobmaster_test.go index 127623222d..4d257a4b36 100644 --- a/engine/jobmaster/dm/dm_jobmaster_test.go +++ b/engine/jobmaster/dm/dm_jobmaster_test.go @@ -192,7 +192,7 @@ func (t *testDMJobmasterSuite) TestDMJobmaster() { mockCheckpointAgent := &MockCheckpointAgent{} checkpoint.NewCheckpointAgent = func(string, *zap.Logger) checkpoint.Agent { return mockCheckpointAgent } mockMessageAgent := &dmpkg.MockMessageAgent{} - dmpkg.NewMessageAgent = func(id string, commandHandler interface{}, messageHandlerManager p2p.MessageHandlerManager, pLogger *zap.Logger) dmpkg.MessageAgent { + dmpkg.NewMessageAgent = func(id string, commandHandler any, messageHandlerManager p2p.MessageHandlerManager, pLogger *zap.Logger) dmpkg.MessageAgent { return mockMessageAgent } defer func() { @@ -284,7 +284,7 @@ func (t *testDMJobmasterSuite) TestDMJobmaster() { Result: &dmpb.ProcessResult{IsCanceled: false}, Status: loadStatusBytes, } - jm.workerManager.workerStatusMap.Range(func(key, val interface{}) bool { + jm.workerManager.workerStatusMap.Range(func(key, val any) bool { if val.(runtime.WorkerStatus).ID == worker1 { taskStatus1.Task = key.(string) } else { @@ -382,11 +382,9 @@ func (t *testDMJobmasterSuite) TestDMJobmaster() { mockMessageAgent.On("SendMessage").Return(nil).Twice() mockBaseJobmaster.On("Exit").Return(nil).Once() var wg sync.WaitGroup - wg.Add(1) - go func() { - defer wg.Done() + wg.Go(func() { require.NoError(t.T(), jm.OnCancel(context.Background())) - }() + }) require.Eventually(t.T(), func() bool { mockMessageAgent.Lock() if len(mockMessageAgent.Calls) == 4 { @@ -419,7 +417,7 @@ func TestDuplicateFinishedState(t *testing.T) { mockCheckpointAgent := &MockCheckpointAgent{} checkpoint.NewCheckpointAgent = func(string, *zap.Logger) checkpoint.Agent { return mockCheckpointAgent } mockMessageAgent := &dmpkg.MockMessageAgent{} - dmpkg.NewMessageAgent = func(id string, commandHandler interface{}, messageHandlerManager p2p.MessageHandlerManager, pLogger *zap.Logger) dmpkg.MessageAgent { + dmpkg.NewMessageAgent = func(id string, commandHandler any, messageHandlerManager p2p.MessageHandlerManager, pLogger *zap.Logger) dmpkg.MessageAgent { return mockMessageAgent } defer func() { diff --git a/engine/jobmaster/dm/metadata/state.go b/engine/jobmaster/dm/metadata/state.go index dd949f31bc..ab8e8feec0 100644 --- a/engine/jobmaster/dm/metadata/state.go +++ b/engine/jobmaster/dm/metadata/state.go @@ -26,7 +26,7 @@ import ( ) // state represents the state which need to be stored in metadata. -type state interface{} +type state any // stateFactory creates a type of state. type stateFactory interface { @@ -158,12 +158,12 @@ func (f *frameworkMetaStore) cloneState() (state, error) { return clone, nil } -var stateTp = reflect.TypeOf((*state)(nil)).Elem() +var stateTp = reflect.TypeFor[state]() // checkAllFieldsIsPublic check all fields of a state is public. func checkAllFieldsIsPublic(state state) bool { v := reflect.ValueOf(state) - if v.Kind() == reflect.Ptr { + if v.Kind() == reflect.Pointer { v = v.Elem() } if v.Kind() != reflect.Struct { diff --git a/engine/jobmaster/dm/task_manager.go b/engine/jobmaster/dm/task_manager.go index 5009e21d43..c65b8091cb 100644 --- a/engine/jobmaster/dm/task_manager.go +++ b/engine/jobmaster/dm/task_manager.go @@ -131,7 +131,7 @@ func (tm *TaskManager) UpdateTaskStatus(taskStatus runtime.TaskStatus) { // TaskStatus return the task status. func (tm *TaskManager) TaskStatus() map[string]runtime.TaskStatus { result := make(map[string]runtime.TaskStatus) - tm.tasks.Range(func(key, value interface{}) bool { + tm.tasks.Range(func(key, value any) bool { result[key.(string)] = value.(runtime.TaskStatus) return true }) @@ -204,7 +204,7 @@ func (tm *TaskManager) checkAndOperateTasks(ctx context.Context, job *metadata.J // remove all tasks, usually happened when delete jobs. func (tm *TaskManager) onJobDel() { tm.logger.Info("clear all task status") - tm.tasks.Range(func(key, value interface{}) bool { + tm.tasks.Range(func(key, value any) bool { tm.tasks.Delete(key) tm.gaugeVec.DeleteLabelValues(tm.jobID, key.(string)) return true @@ -213,7 +213,7 @@ func (tm *TaskManager) onJobDel() { // remove deleted task status, usually happened when update-job delete some tasks. func (tm *TaskManager) removeTaskStatus(job *metadata.Job) { - tm.tasks.Range(func(key, value interface{}) bool { + tm.tasks.Range(func(key, value any) bool { taskID := key.(string) if _, ok := job.Tasks[taskID]; !ok { tm.logger.Info("remove task status", zap.String("task_id", taskID)) diff --git a/engine/jobmaster/dm/task_manager_test.go b/engine/jobmaster/dm/task_manager_test.go index cf00b08a0b..4df2f95600 100644 --- a/engine/jobmaster/dm/task_manager_test.go +++ b/engine/jobmaster/dm/task_manager_test.go @@ -377,10 +377,8 @@ func (t *testDMJobmasterSuite) TestTaskManager() { defer cancel() var wg sync.WaitGroup - wg.Add(1) // run task manager - go func() { - defer wg.Done() + wg.Go(func() { t := time.NewTicker(50 * time.Millisecond) for { select { @@ -390,7 +388,7 @@ func (t *testDMJobmasterSuite) TestTaskManager() { taskManager.DoTick(ctx) } } - }() + }) syncStatus1 := runtime.TaskStatus{ Unit: frameModel.WorkerDMSync, diff --git a/engine/jobmaster/dm/worker_manager.go b/engine/jobmaster/dm/worker_manager.go index a628e77a00..2468848f33 100644 --- a/engine/jobmaster/dm/worker_manager.go +++ b/engine/jobmaster/dm/worker_manager.go @@ -113,7 +113,7 @@ func (wm *WorkerManager) UpdateWorkerStatus(workerStatus runtime.WorkerStatus) { // WorkerStatus return the worker status. func (wm *WorkerManager) WorkerStatus() map[string]runtime.WorkerStatus { result := make(map[string]runtime.WorkerStatus) - wm.workerStatusMap.Range(func(key, value interface{}) bool { + wm.workerStatusMap.Range(func(key, value any) bool { result[key.(string)] = value.(runtime.WorkerStatus) return true }) @@ -152,7 +152,7 @@ func (wm *WorkerManager) TickImpl(ctx context.Context) error { // remove offline worker status, usually happened when worker is offline. func (wm *WorkerManager) removeOfflineWorkers() { - wm.workerStatusMap.Range(func(key, value interface{}) bool { + wm.workerStatusMap.Range(func(key, value any) bool { worker := value.(runtime.WorkerStatus) if worker.IsOffline() { wm.logger.Info("remove offline worker status", zap.String("task_id", worker.TaskID)) @@ -168,7 +168,7 @@ func (wm *WorkerManager) removeOfflineWorkers() { // stop all workers, usually happened when delete jobs. func (wm *WorkerManager) onJobDel(ctx context.Context) error { var recordError error - wm.workerStatusMap.Range(func(key, value interface{}) bool { + wm.workerStatusMap.Range(func(key, value any) bool { workerStatus := value.(runtime.WorkerStatus) if workerStatus.IsTombStone() { return true @@ -185,7 +185,7 @@ func (wm *WorkerManager) onJobDel(ctx context.Context) error { // stop unneeded workers, usually happened when update-job delete some tasks. func (wm *WorkerManager) stopUnneededWorkers(ctx context.Context, job *metadata.Job) error { var recordError error - wm.workerStatusMap.Range(func(key, value interface{}) bool { + wm.workerStatusMap.Range(func(key, value any) bool { taskID := key.(string) if _, ok := job.Tasks[taskID]; !ok { workerStatus := value.(runtime.WorkerStatus) @@ -205,7 +205,7 @@ func (wm *WorkerManager) stopUnneededWorkers(ctx context.Context, job *metadata. // stop outdated workers, usually happened when update job cfgs. func (wm *WorkerManager) stopOutdatedWorkers(ctx context.Context, job *metadata.Job) error { var recordError error - wm.workerStatusMap.Range(func(key, value interface{}) bool { + wm.workerStatusMap.Range(func(key, value any) bool { taskID := key.(string) workerStatus := value.(runtime.WorkerStatus) task, ok := job.Tasks[taskID] @@ -418,7 +418,7 @@ func (wm *WorkerManager) stopWorker(ctx context.Context, taskID string, workerID } func (wm *WorkerManager) removeWorkerStatusByWorkerID(workerID frameModel.WorkerID) { - wm.workerStatusMap.Range(func(key, value interface{}) bool { + wm.workerStatusMap.Range(func(key, value any) bool { if value.(runtime.WorkerStatus).ID == workerID { wm.workerStatusMap.Delete(key) return false @@ -429,7 +429,7 @@ func (wm *WorkerManager) removeWorkerStatusByWorkerID(workerID frameModel.Worker func (wm *WorkerManager) allTombStone() bool { result := true - wm.workerStatusMap.Range(func(key, value interface{}) bool { + wm.workerStatusMap.Range(func(key, value any) bool { workerStatus := value.(runtime.WorkerStatus) if !workerStatus.IsTombStone() { result = false diff --git a/engine/jobmaster/dm/worker_manager_test.go b/engine/jobmaster/dm/worker_manager_test.go index 3a3462f108..b046de773e 100644 --- a/engine/jobmaster/dm/worker_manager_test.go +++ b/engine/jobmaster/dm/worker_manager_test.go @@ -488,10 +488,8 @@ func (t *testDMJobmasterSuite) TestWorkerManager() { workerAgent.On("CreateWorker").Return(worker2, nil).Once() var wg sync.WaitGroup - wg.Add(1) // run worker manager - go func() { - defer wg.Done() + wg.Go(func() { t := time.NewTicker(50 * time.Millisecond) for { select { @@ -501,7 +499,7 @@ func (t *testDMJobmasterSuite) TestWorkerManager() { workerManager.DoTick(ctx) } } - }() + }) // first check require.Eventually(t.T(), func() bool { @@ -618,7 +616,7 @@ type MockWorkerAgent struct { } func (mockAgent *MockWorkerAgent) CreateWorker( - workerType framework.WorkerType, taskCfg interface{}, + workerType framework.WorkerType, taskCfg any, opts ...framework.CreateWorkerOpt, ) (frameModel.WorkerID, error) { mockAgent.Lock() diff --git a/engine/jobmaster/example/master_impl.go b/engine/jobmaster/example/master_impl.go index 2af2747657..a8e431dbb3 100644 --- a/engine/jobmaster/example/master_impl.go +++ b/engine/jobmaster/example/master_impl.go @@ -98,7 +98,7 @@ func (e *exampleMaster) OnWorkerOffline(worker framework.WorkerHandle, reason er return nil } -func (e *exampleMaster) OnWorkerMessage(worker framework.WorkerHandle, topic p2p.Topic, message interface{}) error { +func (e *exampleMaster) OnWorkerMessage(worker framework.WorkerHandle, topic p2p.Topic, message any) error { log.Info("OnWorkerMessage") return nil } diff --git a/engine/jobmaster/fakejob/job_master.go b/engine/jobmaster/fakejob/job_master.go index efc42993c9..1a15cca260 100644 --- a/engine/jobmaster/fakejob/job_master.go +++ b/engine/jobmaster/fakejob/job_master.go @@ -466,7 +466,7 @@ func (m *Master) OnWorkerOffline(worker framework.WorkerHandle, reason error) er } // OnWorkerMessage implements MasterImpl.OnWorkerMessage -func (m *Master) OnWorkerMessage(worker framework.WorkerHandle, topic p2p.Topic, message interface{}) error { +func (m *Master) OnWorkerMessage(worker framework.WorkerHandle, topic p2p.Topic, message any) error { log.Info("FakeMaster: OnWorkerMessage", zap.String("topic", topic), zap.Any("message", message)) diff --git a/engine/pkg/client/executor_group_test.go b/engine/pkg/client/executor_group_test.go index ae68a141ad..2f8979324b 100644 --- a/engine/pkg/client/executor_group_test.go +++ b/engine/pkg/client/executor_group_test.go @@ -104,14 +104,12 @@ func TestGetExecutorBlocked(t *testing.T) { ctx, cancel := context.WithCancel(context.Background()) var wg sync.WaitGroup - wg.Add(1) - go func() { - defer wg.Done() + wg.Go(func() { defer cancel() cli, err := group.GetExecutorClientB(ctx, "executor-1") require.NoError(t, err) require.NotNil(t, cli) - }() + }) time.Sleep(10 * time.Millisecond) err := group.AddExecutor("executor-1", "test-addr:1234") @@ -202,12 +200,10 @@ func TestGetExecutorBCanceled(t *testing.T) { ctx, cancel := context.WithCancel(context.Background()) var wg sync.WaitGroup - wg.Add(1) - go func() { - defer wg.Done() + wg.Go(func() { _, err := group.GetExecutorClientB(ctx, "executor-1") require.Error(t, err) - }() + }) time.Sleep(10 * time.Millisecond) cancel() diff --git a/engine/pkg/client/internal/call_test.go b/engine/pkg/client/internal/call_test.go index ca82928f25..286662f36a 100644 --- a/engine/pkg/client/internal/call_test.go +++ b/engine/pkg/client/internal/call_test.go @@ -59,15 +59,13 @@ func TestCallFuncCancel(t *testing.T) { ctx, cancel := context.WithCancel(context.Background()) var wg sync.WaitGroup - wg.Add(1) - go func() { - defer wg.Done() + wg.Go(func() { resp, err := call.Do(ctx) require.Nil(t, resp) require.Error(t, err) require.ErrorIs(t, err, context.Canceled) - }() + }) cancel() wg.Wait() @@ -84,15 +82,13 @@ func TestCallRetryCancel(t *testing.T) { ctx, cancel := context.WithCancel(context.Background()) var wg sync.WaitGroup - wg.Add(1) - go func() { - defer wg.Done() + wg.Go(func() { resp, err := call.Do(ctx) require.Nil(t, resp) require.Error(t, err) require.ErrorIs(t, err, context.Canceled) - }() + }) cancel() wg.Wait() diff --git a/engine/pkg/client/internal/leader_resolver.go b/engine/pkg/client/internal/leader_resolver.go index 704bf5728a..631c8d3075 100644 --- a/engine/pkg/client/internal/leader_resolver.go +++ b/engine/pkg/client/internal/leader_resolver.go @@ -75,11 +75,9 @@ func newLeaderResolverWithFollowerSorter( doneCh: make(chan struct{}), FollowerSorter: followerSorter, } - ret.wg.Add(1) - go func() { - defer ret.wg.Done() + ret.wg.Go(func() { ret.bgUpdateServerList() - }() + }) return ret } diff --git a/engine/pkg/client/internal/leader_resolver_test.go b/engine/pkg/client/internal/leader_resolver_test.go index 23d19b9b0f..b3d66f1e4a 100644 --- a/engine/pkg/client/internal/leader_resolver_test.go +++ b/engine/pkg/client/internal/leader_resolver_test.go @@ -110,7 +110,7 @@ func TestLeaderResolverFrequentUpdate(t *testing.T) { _, err := leaderResolver.Build(resolver.Target{}, mockConn, resolver.BuildOptions{}) require.NoError(t, err) - for i := 0; i < 1000; i++ { + for range 1000 { leaderResolver.UpdateServerList(map[string]bool{ "leader": true, "follower-1": false, @@ -150,7 +150,7 @@ func TestLeaderResolverUpdateAfterClose(t *testing.T) { // Updating the server list after the resolver is closed // should not panic or deadlock. - for i := 0; i < 1000; i++ { + for range 1000 { leaderResolver.UpdateServerList(map[string]bool{ "leader": true, "follower-1": false, diff --git a/engine/pkg/client/test_util.go b/engine/pkg/client/test_util.go index a0f068c19e..36f369d633 100644 --- a/engine/pkg/client/test_util.go +++ b/engine/pkg/client/test_util.go @@ -31,7 +31,7 @@ func matchPreDispatchArgs(args *DispatchTaskArgs) gomock.Matcher { return &preDispatchArgsMatcher{args: args} } -func (m *preDispatchArgsMatcher) Matches(x interface{}) bool { +func (m *preDispatchArgsMatcher) Matches(x any) bool { // TODO match ProjectInfo req, ok := x.(*enginepb.PreDispatchTaskRequest) if !ok { @@ -77,7 +77,7 @@ func matchConfirmDispatch(requestID *string, workerID string) gomock.Matcher { } } -func (m *confirmDispatchMatcher) Matches(x interface{}) bool { +func (m *confirmDispatchMatcher) Matches(x any) bool { req, ok := x.(*enginepb.ConfirmDispatchTaskRequest) if !ok { return false diff --git a/engine/pkg/containers/slice_queue_test.go b/engine/pkg/containers/slice_queue_test.go index 6077bed0c2..269e8f18e1 100644 --- a/engine/pkg/containers/slice_queue_test.go +++ b/engine/pkg/containers/slice_queue_test.go @@ -71,12 +71,12 @@ func TestSliceQueueManyElements(t *testing.T) { const numElems = 10000 q := NewSliceQueue[int]() - for i := 0; i < numElems; i++ { + for i := range numElems { q.Push(i) } require.Equal(t, numElems, q.Size()) - for i := 0; i < numElems; i++ { + for i := range numElems { val, ok := q.Pop() require.True(t, ok) require.Equal(t, i, val) @@ -84,12 +84,12 @@ func TestSliceQueueManyElements(t *testing.T) { require.Equal(t, 0, q.Size()) // Repeat the test - for i := 0; i < numElems; i++ { + for i := range numElems { q.Push(i) } require.Equal(t, numElems, q.Size()) - for i := 0; i < numElems; i++ { + for i := range numElems { val, ok := q.Pop() require.True(t, ok) require.Equal(t, i, val) @@ -102,18 +102,14 @@ func TestSliceQueueConcurrentWriteAndRead(t *testing.T) { q := NewSliceQueue[int]() var wg sync.WaitGroup - wg.Add(1) - go func() { - defer wg.Done() + wg.Go(func() { - for i := 0; i < numElems; i++ { + for i := range numElems { q.Push(i) } - }() + }) - wg.Add(1) - go func() { - defer wg.Done() + wg.Go(func() { counter := 0 for { @@ -131,7 +127,7 @@ func TestSliceQueueConcurrentWriteAndRead(t *testing.T) { } } } - }() + }) wg.Wait() require.Equal(t, 0, q.Size()) diff --git a/engine/pkg/deps/deps.go b/engine/pkg/deps/deps.go index 689da3774f..7019cdb087 100644 --- a/engine/pkg/deps/deps.go +++ b/engine/pkg/deps/deps.go @@ -36,7 +36,7 @@ func NewDeps() *Deps { } // Provide accepts a constructor and build a value into container -func (d *Deps) Provide(constructor interface{}) error { +func (d *Deps) Provide(constructor any) error { return d.container.Provide(constructor) } @@ -44,7 +44,7 @@ func (d *Deps) Provide(constructor interface{}) error { // `func(arg1 Type1, arg2 Type2,...) (ret, error)`. // The arguments to the function is automatically filled with // the dependency injection functionality. -func (d *Deps) Construct(fn interface{}) (interface{}, error) { +func (d *Deps) Construct(fn any) (any, error) { fnTp := reflect.TypeOf(fn) if fnTp.NumOut() != 2 { log.Panic("Unexpected input type", zap.Any("type", reflect.TypeOf(fn))) @@ -73,10 +73,10 @@ func (d *Deps) Construct(fn interface{}) (interface{}, error) { } // Fill injects dependencies from Deps to params -func (d *Deps) Fill(params interface{}) error { +func (d *Deps) Fill(params any) error { invokeFnTp := reflect.FuncOf( []reflect.Type{reflect.TypeOf(params).Elem()}, - []reflect.Type{reflect.TypeOf(new(error))}, + []reflect.Type{reflect.TypeFor[*error]()}, false) invokeFn := reflect.MakeFunc(invokeFnTp, func(args []reflect.Value) (results []reflect.Value) { defer func() { diff --git a/engine/pkg/dm/message_agent.go b/engine/pkg/dm/message_agent.go index dc752c1d2d..2cd747cc5c 100644 --- a/engine/pkg/dm/message_agent.go +++ b/engine/pkg/dm/message_agent.go @@ -77,12 +77,12 @@ type message struct { ID messageID Type messageType Command string - Payload interface{} + Payload any } // client defines an interface that supports send message type client interface { - SendMessage(ctx context.Context, topic p2p.Topic, message interface{}, nonblocking bool) error + SendMessage(ctx context.Context, topic p2p.Topic, message any, nonblocking bool) error } // messageMatcher implement a simple synchronous request/response message matcher since the lib currently only support asynchronous message. @@ -108,11 +108,11 @@ func (m *messageMatcher) sendRequest( clientCtx context.Context, topic p2p.Topic, command string, - req interface{}, + req any, client client, -) (interface{}, error) { +) (any, error) { msg := message{ID: m.allocID(), Type: requestTp, Command: command, Payload: req} - respCh := make(chan interface{}, 1) + respCh := make(chan any, 1) m.pendings.Store(msg.ID, respCh) defer m.pendings.Delete(msg.ID) @@ -132,20 +132,20 @@ func (m *messageMatcher) sendRequest( } // sendResponse sends a response with message ID. -func (m *messageMatcher) sendResponse(ctx context.Context, topic p2p.Topic, id messageID, command string, resp interface{}, client client) error { +func (m *messageMatcher) sendResponse(ctx context.Context, topic p2p.Topic, id messageID, command string, resp any, client client) error { msg := message{ID: id, Type: responseTp, Command: command, Payload: resp} return client.SendMessage(ctx, topic, msg, false /* nonblock */) } // onResponse receives and pairs a response message. -func (m *messageMatcher) onResponse(id messageID, resp interface{}) error { +func (m *messageMatcher) onResponse(id messageID, resp any) error { respCh, ok := m.pendings.Load(id) if !ok { return errors.Errorf("request %d not found", id) } select { - case respCh.(chan interface{}) <- resp: + case respCh.(chan any) <- resp: return nil default: } @@ -163,8 +163,8 @@ type MessageAgent interface { // RemoveClient is used when client is offline permanently, or the new client // with this clientID should be treated as a different client. RemoveClient(clientID string) error - SendMessage(ctx context.Context, clientID string, command string, msg interface{}) error - SendRequest(ctx context.Context, clientID string, command string, req interface{}) (interface{}, error) + SendMessage(ctx context.Context, clientID string, command string, msg any) error + SendRequest(ctx context.Context, clientID string, command string, req any) (any, error) } type clientGroup struct { @@ -188,7 +188,7 @@ type MessageAgentImpl struct { clients clientGroup // when receive message/request/response, // the corresponding processing method of commandHandler will be called according to the command name. - commandHandler interface{} + commandHandler any id string } @@ -198,7 +198,7 @@ type MessageAgentImpl struct { // MessageFuncType: func(ctx context.Context, msg *interface{}) error {} // RequestFuncType(1): func(ctx context.Context, req *interface{}) (resp *interface{}, err error) {} // RequestFuncType(2): func(ctx context.Context, req *interface{}) (resp *interface{}) {} -func NewMessageAgentImpl(id string, commandHandler interface{}, messageHandlerManager p2p.MessageHandlerManager, pLogger *zap.Logger) MessageAgent { +func NewMessageAgentImpl(id string, commandHandler any, messageHandlerManager p2p.MessageHandlerManager, pLogger *zap.Logger) MessageAgent { agent := &MessageAgentImpl{ messageMatcher: newMessageMatcher(), clients: clientGroup{ @@ -223,12 +223,10 @@ func NewMessageAgentImpl(id string, commandHandler interface{}, messageHandlerMa }, ) agent.ctx, agent.cancel = context.WithCancel(context.Background()) - agent.wg.Add(1) - go func() { - defer agent.wg.Done() + agent.wg.Go(func() { err := agent.pool.Run(agent.ctx) agent.logger.Info("workerpool exited", zap.Error(err)) - }() + }) return agent } @@ -308,7 +306,7 @@ func (agent *MessageAgentImpl) getClient(clientID string) (client, error) { } // SendMessage send message asynchronously. -func (agent *MessageAgentImpl) SendMessage(ctx context.Context, clientID string, command string, msg interface{}) error { +func (agent *MessageAgentImpl) SendMessage(ctx context.Context, clientID string, command string, msg any) error { client, err := agent.getClient(clientID) if err != nil { return err @@ -322,7 +320,7 @@ func (agent *MessageAgentImpl) SendMessage(ctx context.Context, clientID string, // SendRequest send request synchronously. // caller should add its own retry mechanism if needed. // caller should persist the request itself if needed. -func (agent *MessageAgentImpl) SendRequest(ctx context.Context, clientID string, command string, req interface{}) (interface{}, error) { +func (agent *MessageAgentImpl) SendRequest(ctx context.Context, clientID string, command string, req any) (any, error) { agent.clients.mu.RLock() client, ok := agent.clients.clients[clientID] clientCtx, ok2 := agent.clients.ctxs[clientID] @@ -341,7 +339,7 @@ func (agent *MessageAgentImpl) SendRequest(ctx context.Context, clientID string, } // sendResponse send response asynchronously. -func (agent *MessageAgentImpl) sendResponse(ctx context.Context, clientID string, msgID messageID, command string, resp interface{}) error { +func (agent *MessageAgentImpl) sendResponse(ctx context.Context, clientID string, msgID messageID, command string, resp any) error { client, err := agent.getClient(clientID) if err != nil { return err @@ -356,7 +354,7 @@ func (agent *MessageAgentImpl) sendResponse(ctx context.Context, clientID string // Forward the response to the corresponding request. // According to the command, the corresponding message processing function of commandHandler will be called. // According to the command, the corresponding request processing function of commandHandler will be called, and send the response to caller. -func (agent *MessageAgentImpl) onMessage(topic string, msg interface{}) error { +func (agent *MessageAgentImpl) onMessage(topic string, msg any) error { agent.logger.Debug("on message", zap.String("topic", topic), zap.Any("msg", msg)) m, ok := msg.(*message) if !ok { @@ -375,7 +373,7 @@ func (agent *MessageAgentImpl) onMessage(topic string, msg interface{}) error { } // handleResponse receive response. -func (agent *MessageAgentImpl) handleResponse(id messageID, command string, resp interface{}) error { +func (agent *MessageAgentImpl) handleResponse(id messageID, command string, resp any) error { handler := reflect.ValueOf(agent.commandHandler).MethodByName(command) if !handler.IsValid() { return errors.Errorf("response handler for command %s not found", command) @@ -394,7 +392,7 @@ func (agent *MessageAgentImpl) handleResponse(id messageID, command string, resp } // handleRequest receive request, call request handler and send response. -func (agent *MessageAgentImpl) handleRequest(clientID string, msgID messageID, command string, req interface{}) error { +func (agent *MessageAgentImpl) handleRequest(clientID string, msgID messageID, command string, req any) error { handler := reflect.ValueOf(agent.commandHandler).MethodByName(command) if !handler.IsValid() { return errors.Errorf("request handler for command %s not found", command) @@ -425,7 +423,7 @@ func (agent *MessageAgentImpl) handleRequest(clientID string, msgID messageID, c } // handle message receive message and call message handler. -func (agent *MessageAgentImpl) handleMessage(command string, msg interface{}) error { +func (agent *MessageAgentImpl) handleMessage(command string, msg any) error { handler := reflect.ValueOf(agent.commandHandler).MethodByName(command) if !handler.IsValid() { return errors.Errorf("message handler for command %s not found", command) diff --git a/engine/pkg/dm/message_agent_test.go b/engine/pkg/dm/message_agent_test.go index d4f61739f5..bc50b75e13 100644 --- a/engine/pkg/dm/message_agent_test.go +++ b/engine/pkg/dm/message_agent_test.go @@ -38,14 +38,12 @@ func TestAllocID(t *testing.T) { require.Equal(t, messageID(3), messageMatcher.allocID()) var wg sync.WaitGroup - for i := 0; i < 10; i++ { - wg.Add(1) - go func() { - defer wg.Done() - for i := 0; i < 100; i++ { + for range 10 { + wg.Go(func() { + for range 100 { messageMatcher.allocID() } - }() + }) } wg.Wait() require.Equal(t, messageID(1004), messageMatcher.allocID()) @@ -56,8 +54,7 @@ func TestMessageMatcher(t *testing.T) { messageMatcher := newMessageMatcher() mockClient := &MockClient{} - ctx, cancel := context.WithCancel(context.Background()) - defer cancel() + ctx := t.Context() clientCtx := context.Background() @@ -291,7 +288,7 @@ type MockClient struct { mock.Mock } -func (s *MockClient) SendMessage(ctx context.Context, topic p2p.Topic, message interface{}, nonblocking bool) error { +func (s *MockClient) SendMessage(ctx context.Context, topic p2p.Topic, message any, nonblocking bool) error { s.Lock() defer s.Unlock() args := s.Called() diff --git a/engine/pkg/dm/mock_message_agent.go b/engine/pkg/dm/mock_message_agent.go index baaf8417e2..918a48456f 100644 --- a/engine/pkg/dm/mock_message_agent.go +++ b/engine/pkg/dm/mock_message_agent.go @@ -35,7 +35,7 @@ func GenerateTopic(senderID, receiverID string) string { } // GenerateResponse generate mock response message. -func GenerateResponse(id messageID, command string, msg interface{}) interface{} { +func GenerateResponse(id messageID, command string, msg any) any { resp := message{ID: id, Type: responseTp, Command: command, Payload: msg} // nolint:errcheck bytes, _ := json.Marshal(resp) @@ -58,14 +58,14 @@ func (m *MockMessageAgent) UpdateClient(clientID string, client client) error { func (m *MockMessageAgent) RemoveClient(clientID string) error { return nil } // SendMessage implement MessageAgent.SendMessage. -func (m *MockMessageAgent) SendMessage(ctx context.Context, clientID string, command string, msg interface{}) error { +func (m *MockMessageAgent) SendMessage(ctx context.Context, clientID string, command string, msg any) error { m.Lock() defer m.Unlock() return m.Called().Error(0) } // SendRequest implement MessageAgent.SendRequest. -func (m *MockMessageAgent) SendRequest(ctx context.Context, clientID string, command string, req interface{}) (interface{}, error) { +func (m *MockMessageAgent) SendRequest(ctx context.Context, clientID string, command string, req any) (any, error) { m.Lock() defer m.Unlock() args := m.Called(ctx, clientID, command, req) diff --git a/engine/pkg/dm/ticker/ticker_test.go b/engine/pkg/dm/ticker/ticker_test.go index f0f50d9f19..06788f5581 100644 --- a/engine/pkg/dm/ticker/ticker_test.go +++ b/engine/pkg/dm/ticker/ticker_test.go @@ -34,10 +34,8 @@ func TestDefaultTicker(t *testing.T) { tickError := errors.New("tick error") dummyTicker.SetResult([]error{tickError, tickError, nil}) - wg.Add(1) // run task manager - go func() { - defer wg.Done() + wg.Go(func() { t := time.NewTicker(50 * time.Millisecond) for { select { @@ -47,7 +45,7 @@ func TestDefaultTicker(t *testing.T) { dummyTicker.DoTick(ctx) } } - }() + }) // first tick when start require.Eventually(t, dummyTicker.ResultAllMeet, 5*time.Second, 100*time.Millisecond) diff --git a/engine/pkg/errctx/center_test.go b/engine/pkg/errctx/center_test.go index 11675a4ad4..50d5e14b79 100644 --- a/engine/pkg/errctx/center_test.go +++ b/engine/pkg/errctx/center_test.go @@ -26,17 +26,15 @@ func TestErrCenterMultipleErrCtx(t *testing.T) { center := NewErrCenter() var wg sync.WaitGroup - for i := 0; i < 10; i++ { - wg.Add(1) - go func() { - defer wg.Done() + for range 10 { + wg.Go(func() { ctx, cancel := center.WithCancelOnFirstError(context.Background()) defer cancel() <-ctx.Done() require.Error(t, ctx.Err()) require.EqualError(t, ctx.Err(), "fake error") - }() + }) } center.OnError(errors.New("fake error")) @@ -53,15 +51,13 @@ func TestErrCenterSingleErrCtx(t *testing.T) { defer cancel() var wg sync.WaitGroup - for i := 0; i < 10; i++ { - wg.Add(1) - go func() { - defer wg.Done() + for range 10 { + wg.Go(func() { <-ctx.Done() require.Error(t, ctx.Err()) require.EqualError(t, ctx.Err(), "fake error") - }() + }) } center.OnError(errors.New("fake error")) diff --git a/engine/pkg/externalresource/broker/broker_integration_test.go b/engine/pkg/externalresource/broker/broker_integration_test.go index 7d66cbcc6e..2eac389ec1 100644 --- a/engine/pkg/externalresource/broker/broker_integration_test.go +++ b/engine/pkg/externalresource/broker/broker_integration_test.go @@ -371,13 +371,13 @@ func TestIntegrationBrokerGCClosedWorker(t *testing.T) { expectedGCWorkerCnt := int32(0) wg := sync.WaitGroup{} - for worker := 0; worker < workerCount; worker++ { + for worker := range workerCount { gc := rand.Intn(2) == 0 workerID := fmt.Sprintf("worker-%d", worker) resCount := rand.Intn(maxResNumPerWorker) + 1 persistedResCount := 0 - for res := 0; res < resCount; res++ { + for res := range resCount { resID := fmt.Sprintf("/s3/test-%d", res) isPersisted := rand.Intn(2) == 0 if isPersisted { diff --git a/engine/pkg/externalresource/broker/broker_test.go b/engine/pkg/externalresource/broker/broker_test.go index 8d325fb59f..6fdc1364e9 100644 --- a/engine/pkg/externalresource/broker/broker_test.go +++ b/engine/pkg/externalresource/broker/broker_test.go @@ -47,8 +47,7 @@ func newBroker(t *testing.T) (*DefaultBroker, *manager.MockClient, string) { } func TestNewBroker(t *testing.T) { - ctx, cancel := context.WithCancel(context.Background()) - defer cancel() + ctx := t.Context() c := client.NewMockServerMasterClient(gomock.NewController(t)) diff --git a/engine/pkg/externalresource/integration_test/mock_cluster.go b/engine/pkg/externalresource/integration_test/mock_cluster.go index 07d1938083..5d4987290d 100644 --- a/engine/pkg/externalresource/integration_test/mock_cluster.go +++ b/engine/pkg/externalresource/integration_test/mock_cluster.go @@ -82,23 +82,19 @@ func (c *mockCluster) Start(t *testing.T) { ctx, cancel := context.WithCancel(context.Background()) c.cancel = cancel - c.wg.Add(1) - go func() { - defer c.wg.Done() + c.wg.Go(func() { err := c.gcCoordinator.Run(ctx) require.Error(t, err) require.True(t, errors.Is(err, context.Canceled)) - }() + }) - c.wg.Add(1) - go func() { - defer c.wg.Done() + c.wg.Go(func() { err := c.gcRunner.Run(ctx) require.Error(t, err) require.True(t, errors.Is(err, context.Canceled)) - }() + }) } func (c *mockCluster) Stop() { diff --git a/engine/pkg/externalresource/internal/bucket/file_manager.go b/engine/pkg/externalresource/internal/bucket/file_manager.go index 0639b31b92..9cda4688a0 100644 --- a/engine/pkg/externalresource/internal/bucket/file_manager.go +++ b/engine/pkg/externalresource/internal/bucket/file_manager.go @@ -263,7 +263,7 @@ func (m *FileManager) SetPersisted( return nil } -func (m *FileManager) validateExecutor(creator model.ExecutorID, res interface{}) { +func (m *FileManager) validateExecutor(creator model.ExecutorID, res any) { if creator != m.executorID { log.Panic("inconsistent executor ID of bucket file", zap.Any("resource", res), diff --git a/engine/pkg/externalresource/internal/bucket/file_manager_integration_test.go b/engine/pkg/externalresource/internal/bucket/file_manager_integration_test.go index d9e3ccd6ec..dadee7b31b 100644 --- a/engine/pkg/externalresource/internal/bucket/file_manager_integration_test.go +++ b/engine/pkg/externalresource/internal/bucket/file_manager_integration_test.go @@ -112,7 +112,7 @@ func TestIntegrationS3FileManagerRemoveTemporaryResources(t *testing.T) { WorkerID: worker, } - for i := 0; i < numTemporaryResources; i++ { + for i := range numTemporaryResources { _, err := fm.CreateResource(ctx, internal.ResourceIdent{ ResourceScope: scope, Name: fmt.Sprintf("temp-resource-%d", i), @@ -120,7 +120,7 @@ func TestIntegrationS3FileManagerRemoveTemporaryResources(t *testing.T) { require.NoError(t, err) } - for i := 0; i < numPersistedResources; i++ { + for i := range numPersistedResources { ident := internal.ResourceIdent{ ResourceScope: scope, Name: fmt.Sprintf("persisted-resource-%d", i), @@ -138,7 +138,7 @@ func TestIntegrationS3FileManagerRemoveTemporaryResources(t *testing.T) { Executor: MockExecutorID, WorkerID: worker, } - for i := 0; i < numPersistedResources; i++ { + for i := range numPersistedResources { ident := internal.ResourceIdent{ ResourceScope: scope, Name: fmt.Sprintf("persisted-resource-%d", i), @@ -147,7 +147,7 @@ func TestIntegrationS3FileManagerRemoveTemporaryResources(t *testing.T) { require.NoError(t, err) } - for i := 0; i < numTemporaryResources; i++ { + for i := range numTemporaryResources { _, err := fm.GetPersistedResource(ctx, internal.ResourceIdent{ ResourceScope: scope, Name: fmt.Sprintf("temp-resource-%d", i), diff --git a/engine/pkg/externalresource/internal/bucket/file_path_util.go b/engine/pkg/externalresource/internal/bucket/file_path_util.go index 5899717d30..4bbba9fa59 100644 --- a/engine/pkg/externalresource/internal/bucket/file_path_util.go +++ b/engine/pkg/externalresource/internal/bucket/file_path_util.go @@ -46,7 +46,7 @@ func getPathPredByPersistedResources( ) pathPredFunc { return func(path string) bool { resPath := "" - for i := 0; i < prefixCnt; i++ { + for range prefixCnt { prefix, newPath, ok := strings.Cut(path, "/") if !ok { return false diff --git a/engine/pkg/externalresource/internal/bucket/resource_controller_test.go b/engine/pkg/externalresource/internal/bucket/resource_controller_test.go index 4478a91919..4a475842b1 100644 --- a/engine/pkg/externalresource/internal/bucket/resource_controller_test.go +++ b/engine/pkg/externalresource/internal/bucket/resource_controller_test.go @@ -36,7 +36,7 @@ func TestS3ResourceController(t *testing.T) { defer cancel() temproraryResNames := make([]resModel.ResourceName, numTemporaryResources) - for i := 0; i < numTemporaryResources; i++ { + for i := range numTemporaryResources { resID := fmt.Sprintf("/s3/temporary-resource-%d", i) _, resName, err := resModel.ParseResourceID(resID) require.NoError(t, err) @@ -45,7 +45,7 @@ func TestS3ResourceController(t *testing.T) { persistedResNames := make([]resModel.ResourceName, numPersistedResources) persistedResMetas := []*resModel.ResourceMeta{} - for i := 0; i < numPersistedResources; i++ { + for i := range numPersistedResources { resID := fmt.Sprintf("/s3/persisted-resource-%d", i) _, resName, err := resModel.ParseResourceID(resID) require.NoError(t, err) diff --git a/engine/pkg/externalresource/internal/local/file_manager.go b/engine/pkg/externalresource/internal/local/file_manager.go index 081d1e27e0..bd88bcc833 100644 --- a/engine/pkg/externalresource/internal/local/file_manager.go +++ b/engine/pkg/externalresource/internal/local/file_manager.go @@ -320,7 +320,7 @@ func PreCheckConfig(config resModel.LocalFileConfig) error { return nil } -func (m *FileManager) validateExecutor(creator model.ExecutorID, res interface{}) { +func (m *FileManager) validateExecutor(creator model.ExecutorID, res any) { // Defensive verification to ensure that local resources are not accessible across nodes. if creator != m.executorID { log.Panic("inconsistent executor ID of local file", diff --git a/engine/pkg/externalresource/internal/local/file_manager_test.go b/engine/pkg/externalresource/internal/local/file_manager_test.go index 333f9df24d..6418a9a1d6 100644 --- a/engine/pkg/externalresource/internal/local/file_manager_test.go +++ b/engine/pkg/externalresource/internal/local/file_manager_test.go @@ -135,7 +135,7 @@ func TestFileManagerManyWorkers(t *testing.T) { fm := NewLocalFileManager("", resModel.LocalFileConfig{BaseDir: dir}) ctx := context.Background() - for i := 0; i < numWorkers; i++ { + for i := range numWorkers { // For each worker, first create a persisted resource res, err := fm.CreateResource(ctx, newResourceIdentForTesting("", fmt.Sprintf("worker-%d", i), @@ -174,13 +174,13 @@ func TestFileManagerManyWorkers(t *testing.T) { } // Garbage collects about half the workers' temporary files. - for i := 0; i < numWorkers/2; i++ { + for i := range numWorkers / 2 { workerID := fmt.Sprintf("worker-%d", i) err := fm.RemoveTemporaryFiles(ctx, internal.ResourceScope{WorkerID: workerID}) require.NoError(t, err) } - for i := 0; i < numWorkers; i++ { + for i := range numWorkers { workerID := fmt.Sprintf("worker-%d", i) resourceID1 := fmt.Sprintf("resource-%d-1", i) require.DirExists(t, filepath.Join(dir, workerID, ResourceNameToFilePathName(resourceID1))) diff --git a/engine/pkg/externalresource/manager/gc_coordinator_test.go b/engine/pkg/externalresource/manager/gc_coordinator_test.go index 04d98ec0a3..330f44f03c 100644 --- a/engine/pkg/externalresource/manager/gc_coordinator_test.go +++ b/engine/pkg/externalresource/manager/gc_coordinator_test.go @@ -67,12 +67,10 @@ func newGCTestHelper() *gcTestHelper { } func (h *gcTestHelper) Start() { - h.wg.Add(1) - go func() { - defer h.wg.Done() + h.wg.Go(func() { h.errCh <- h.Coord.Run(h.ctx) - }() + }) } func (h *gcTestHelper) Close() { diff --git a/engine/pkg/externalresource/manager/gc_runner_test.go b/engine/pkg/externalresource/manager/gc_runner_test.go index d4b71cae35..da186185ee 100644 --- a/engine/pkg/externalresource/manager/gc_runner_test.go +++ b/engine/pkg/externalresource/manager/gc_runner_test.go @@ -77,12 +77,10 @@ func newGCRunnerTestHelperWithMeta(meta pkgOrm.ResourceClient) *gcRunnerTestHelp } func (h *gcRunnerTestHelper) Start() { - h.wg.Add(1) - go func() { - defer h.wg.Done() + h.wg.Go(func() { h.errCh <- h.Runner.Run(h.ctx) - }() + }) } func (h *gcRunnerTestHelper) Close() { @@ -257,7 +255,7 @@ func TestGCRunnerMultiple(t *testing.T) { resources := []string{"/local/resource", "/s3/resource"} const numResources = 1000 - for i := 0; i < numResources; i++ { + for i := range numResources { err := helper.Meta.CreateResource(context.Background(), &resModel.ResourceMeta{ ID: fmt.Sprintf("%s-%d", resources[rand.Intn(2)], i), Job: "job-1", @@ -369,7 +367,7 @@ func testGCExecutors(t *testing.T, helper *gcRunnerTestHelper) { require.NoError(t, err) } const numResources = 1000 - for i := 0; i < numResources; i++ { + for i := range numResources { workerID := rand.Intn(4) err := helper.Meta.CreateResource(context.Background(), &resModel.ResourceMeta{ ID: fmt.Sprintf("%s-%d", resources[rand.Intn(2)], i), diff --git a/engine/pkg/externalresource/manager/test_utils.go b/engine/pkg/externalresource/manager/test_utils.go index dcc8574367..52d1337906 100644 --- a/engine/pkg/externalresource/manager/test_utils.go +++ b/engine/pkg/externalresource/manager/test_utils.go @@ -15,6 +15,7 @@ package manager import ( "context" + "maps" "sync" "testing" "time" @@ -99,9 +100,7 @@ func (p *MockExecutorInfoProvider) WatchExecutors( defer p.mu.Unlock() executors := make(map[model.ExecutorID]string, len(p.executorSet)) - for id, addr := range p.executorSet { - executors[id] = addr - } + maps.Copy(executors, p.executorSet) return executors, p.notifier.NewReceiver(), nil } @@ -157,9 +156,7 @@ func (jp *MockJobStatusProvider) WatchJobStatuses( defer jp.mu.Unlock() snapCopy := make(JobStatusesSnapshot, len(jp.jobInfos)) - for k, v := range jp.jobInfos { - snapCopy[k] = v - } + maps.Copy(snapCopy, jp.jobInfos) return snapCopy, jp.notifier.NewReceiver(), nil } diff --git a/engine/pkg/externalresource/model/model.go b/engine/pkg/externalresource/model/model.go index fd12d45ecb..c847009845 100644 --- a/engine/pkg/externalresource/model/model.go +++ b/engine/pkg/externalresource/model/model.go @@ -122,8 +122,8 @@ func (m *ResourceMeta) ToQueryResourceResponse() *pb.QueryResourceResponse { } // Map is used in gorm update -func (m *ResourceMeta) Map() map[string]interface{} { - return map[string]interface{}{ +func (m *ResourceMeta) Map() map[string]any { + return map[string]any{ "project_id": m.ProjectID, "tenant_id": m.TenantID, "id": m.ID, diff --git a/engine/pkg/meta/client_test.go b/engine/pkg/meta/client_test.go index 19a348ee7e..7eb2786d03 100644 --- a/engine/pkg/meta/client_test.go +++ b/engine/pkg/meta/client_test.go @@ -37,7 +37,7 @@ func (c *errorClientConn) StoreType() metaModel.StoreType { return metaModel.StoreType("unknown") } -func (c *errorClientConn) GetConn() (interface{}, error) { +func (c *errorClientConn) GetConn() (any, error) { return nil, nil } diff --git a/engine/pkg/meta/internal/etcdkv/connection.go b/engine/pkg/meta/internal/etcdkv/connection.go index 0daf9f7510..5c382b9b33 100644 --- a/engine/pkg/meta/internal/etcdkv/connection.go +++ b/engine/pkg/meta/internal/etcdkv/connection.go @@ -48,7 +48,7 @@ type clientConnImpl struct { } // GetConn implements GetConn of ClientConn -func (cc *clientConnImpl) GetConn() (interface{}, error) { +func (cc *clientConnImpl) GetConn() (any, error) { cc.rwLock.RLock() defer cc.rwLock.RUnlock() diff --git a/engine/pkg/meta/internal/etcdkv/etcd_impl_test.go b/engine/pkg/meta/internal/etcdkv/etcd_impl_test.go index fe836981f8..7263c2d972 100644 --- a/engine/pkg/meta/internal/etcdkv/etcd_impl_test.go +++ b/engine/pkg/meta/internal/etcdkv/etcd_impl_test.go @@ -532,10 +532,8 @@ func testGenerator(t *testing.T, kvcli metaModel.KVClient) { require.GreaterOrEqual(t, firstEpoch, int64(0)) var wg sync.WaitGroup - for i := 0; i < 100; i++ { - wg.Add(1) - go func() { - defer wg.Done() + for range 100 { + wg.Go(func() { epoch, err := kvcli.GenEpoch(ctx) require.Nil(t, err) require.GreaterOrEqual(t, epoch, int64(0)) @@ -544,7 +542,7 @@ func testGenerator(t *testing.T, kvcli metaModel.KVClient) { epoch, err = kvcli.GenEpoch(ctx) require.Nil(t, err) require.Greater(t, epoch, oldEpoch) - }() + }) } wg.Wait() diff --git a/engine/pkg/meta/internal/sqlkv/connection.go b/engine/pkg/meta/internal/sqlkv/connection.go index 022ab59e6e..ddb275d061 100644 --- a/engine/pkg/meta/internal/sqlkv/connection.go +++ b/engine/pkg/meta/internal/sqlkv/connection.go @@ -51,7 +51,7 @@ type clientConnImpl struct { // GetConn implements GetConn of ClientConn // Return *sql.DB if no error -func (cc *clientConnImpl) GetConn() (interface{}, error) { +func (cc *clientConnImpl) GetConn() (any, error) { cc.rwLock.RLock() defer cc.rwLock.RUnlock() diff --git a/engine/pkg/meta/internal/sqlkv/sql_impl_test.go b/engine/pkg/meta/internal/sqlkv/sql_impl_test.go index 710868caf4..ce7e76f1e5 100644 --- a/engine/pkg/meta/internal/sqlkv/sql_impl_test.go +++ b/engine/pkg/meta/internal/sqlkv/sql_impl_test.go @@ -41,12 +41,12 @@ const ( ) type tCase struct { - caseName string // case name - fn string // function name - inputs []interface{} // function args + caseName string // case name + fn string // function name + inputs []any // function args - output interface{} // function output - err error // function error + output any // function output + err error // function error mockExpectResFn func(mock sqlmock.Sqlmock) // sqlmock expectation } @@ -100,7 +100,7 @@ func TestPut(t *testing.T) { testCases := []tCase{ { fn: "Put", - inputs: []interface{}{ + inputs: []any{ "key0", "value0", }, @@ -136,7 +136,7 @@ func TestGet(t *testing.T) { { caseName: "RecordNotFoundErrReturnEmptyResp", fn: "Get", - inputs: []interface{}{ + inputs: []any{ "key0", }, output: &metaModel.GetResponse{ @@ -153,7 +153,7 @@ func TestGet(t *testing.T) { { caseName: "NormalGet", fn: "Get", - inputs: []interface{}{ + inputs: []any{ "key0", }, output: &metaModel.GetResponse{ @@ -175,7 +175,7 @@ func TestGet(t *testing.T) { { caseName: "RangeGet", fn: "Get", - inputs: []interface{}{ + inputs: []any{ "key0", metaModel.WithRange("key999"), }, @@ -203,7 +203,7 @@ func TestGet(t *testing.T) { { caseName: "FromKeyGet", fn: "Get", - inputs: []interface{}{ + inputs: []any{ "key0", metaModel.WithFromKey(), }, @@ -226,7 +226,7 @@ func TestGet(t *testing.T) { { caseName: "PrefixGet", fn: "Get", - inputs: []interface{}{ + inputs: []any{ "key0", metaModel.WithPrefix(), }, @@ -266,7 +266,7 @@ func TestDelete(t *testing.T) { testCases := []tCase{ { fn: "Delete", - inputs: []interface{}{ + inputs: []any{ "key0", }, output: &metaModel.DeleteResponse{ @@ -280,7 +280,7 @@ func TestDelete(t *testing.T) { }, { fn: "Delete", - inputs: []interface{}{ + inputs: []any{ "key0", metaModel.WithRange("key999"), }, @@ -296,7 +296,7 @@ func TestDelete(t *testing.T) { }, { fn: "Delete", - inputs: []interface{}{ + inputs: []any{ "key0", metaModel.WithFromKey(), }, @@ -311,7 +311,7 @@ func TestDelete(t *testing.T) { }, { fn: "Delete", - inputs: []interface{}{ + inputs: []any{ "key0", metaModel.WithPrefix(), }, diff --git a/engine/pkg/meta/mock/clientconn_mock.go b/engine/pkg/meta/mock/clientconn_mock.go index 8777400e37..878bba1ac5 100644 --- a/engine/pkg/meta/mock/clientconn_mock.go +++ b/engine/pkg/meta/mock/clientconn_mock.go @@ -43,7 +43,7 @@ func (c *mockClientConn) StoreType() metaModel.StoreType { return metaModel.StoreTypeMockKV } -func (c *mockClientConn) GetConn() (interface{}, error) { +func (c *mockClientConn) GetConn() (any, error) { log.Panic("SHOULD not call GetConn for mock client conn") return nil, nil } @@ -77,7 +77,7 @@ func (c *sqliteClientConn) StoreType() metaModel.StoreType { return metaModel.StoreTypeSQLite } -func (c *sqliteClientConn) GetConn() (interface{}, error) { +func (c *sqliteClientConn) GetConn() (any, error) { if c.db != nil { return c.db, nil } @@ -111,7 +111,7 @@ func (c *dbClientConn) StoreType() metaModel.StoreType { return metaModel.StoreTypeMySQL } -func (c *dbClientConn) GetConn() (interface{}, error) { +func (c *dbClientConn) GetConn() (any, error) { if c.db != nil { return c.db, nil } diff --git a/engine/pkg/meta/mock/simple_mockclient_test.go b/engine/pkg/meta/mock/simple_mockclient_test.go index c4cb7718fb..f76bd12659 100644 --- a/engine/pkg/meta/mock/simple_mockclient_test.go +++ b/engine/pkg/meta/mock/simple_mockclient_test.go @@ -179,10 +179,8 @@ func testGenerator(t *testing.T, kvcli metaModel.KVClient) { require.GreaterOrEqual(t, firstEpoch, int64(0)) var wg sync.WaitGroup - for i := 0; i < 100; i++ { - wg.Add(1) - go func() { - defer wg.Done() + for range 100 { + wg.Go(func() { epoch, err := kvcli.GenEpoch(ctx) require.Nil(t, err) require.GreaterOrEqual(t, epoch, int64(0)) @@ -191,7 +189,7 @@ func testGenerator(t *testing.T, kvcli metaModel.KVClient) { epoch, err = kvcli.GenEpoch(ctx) require.Nil(t, err) require.Greater(t, epoch, oldEpoch) - }() + }) } wg.Wait() diff --git a/engine/pkg/meta/model/common.go b/engine/pkg/meta/model/common.go index f0d90fe8c8..537e78c6c5 100644 --- a/engine/pkg/meta/model/common.go +++ b/engine/pkg/meta/model/common.go @@ -15,6 +15,7 @@ package model import ( "fmt" + "strings" "github.com/pingcap/tiflow/engine/model" "github.com/pingcap/tiflow/engine/pkg/tenant" @@ -80,13 +81,14 @@ type GetResponse struct { // String only for debug func (resp *GetResponse) String() string { - s := fmt.Sprintf("header:[%s];kvs:[", resp.Header) + var s strings.Builder + s.WriteString(fmt.Sprintf("header:[%s];kvs:[", resp.Header)) for _, kv := range resp.Kvs { - s += kv.String() + s.WriteString(kv.String()) } - s += "];" - return s + s.WriteString("];") + return s.String() } // DeleteResponse . diff --git a/engine/pkg/meta/model/config.go b/engine/pkg/meta/model/config.go index 2c5ae8bd03..65891833ae 100644 --- a/engine/pkg/meta/model/config.go +++ b/engine/pkg/meta/model/config.go @@ -15,6 +15,7 @@ package model import ( "crypto/tls" + "maps" "strings" validation "github.com/go-ozzo/ozzo-validation/v4" @@ -153,9 +154,7 @@ func GenerateDSNByParams(storeConf *StoreConfig, pairs map[string]string) (strin dsnCfg.Params["writeTimeout"] = storeConf.WriteTimeout dsnCfg.Params["timeout"] = storeConf.DialTimeout - for k, v := range pairs { - dsnCfg.Params[k] = v - } + maps.Copy(dsnCfg.Params, pairs) return dsnCfg.FormatDSN(), nil } diff --git a/engine/pkg/meta/model/interfaces.go b/engine/pkg/meta/model/interfaces.go index 79ddef8481..322f9624b9 100644 --- a/engine/pkg/meta/model/interfaces.go +++ b/engine/pkg/meta/model/interfaces.go @@ -87,7 +87,7 @@ type ClientConn interface { // For the fisrt return param if no error happens: // For StoreTypeEtcd, it returns *clientv3.Client // For StoreTypeMySQL/StoreTypeSQLite, it returns *sql.DB - GetConn() (interface{}, error) + GetConn() (any, error) // Close closes the underlying connection and releases some resources Close() error diff --git a/engine/pkg/notifier/notifier.go b/engine/pkg/notifier/notifier.go index cf6ba251c2..be5d7f448a 100644 --- a/engine/pkg/notifier/notifier.go +++ b/engine/pkg/notifier/notifier.go @@ -83,11 +83,9 @@ func NewNotifier[T any]() *Notifier[T] { synchronizeCh: make(chan struct{}), } - ret.wg.Add(1) - go func() { - defer ret.wg.Done() + ret.wg.Go(func() { ret.run() - }() + }) return ret } diff --git a/engine/pkg/notifier/notifier_test.go b/engine/pkg/notifier/notifier_test.go index 5e90fc17a5..a2ab27b6e7 100644 --- a/engine/pkg/notifier/notifier_test.go +++ b/engine/pkg/notifier/notifier_test.go @@ -34,10 +34,8 @@ func TestNotifierBasics(t *testing.T) { ) var wg sync.WaitGroup - for i := 0; i < numReceivers; i++ { - wg.Add(1) - go func() { - defer wg.Done() + for range numReceivers { + wg.Go(func() { r := n.NewReceiver() defer r.Close() @@ -55,7 +53,7 @@ func TestNotifierBasics(t *testing.T) { } lastEv = ev } - }() + }) } for i := 1; i <= numEvents; i++ { @@ -78,17 +76,15 @@ func TestNotifierClose(t *testing.T) { ) var wg sync.WaitGroup - for i := 0; i < numReceivers; i++ { - wg.Add(1) - go func() { - defer wg.Done() + for range numReceivers { + wg.Go(func() { r := n.NewReceiver() defer r.Close() _, ok := <-r.C require.False(t, ok) - }() + }) } time.Sleep(1 * time.Second) @@ -102,7 +98,7 @@ func TestReceiverClose(t *testing.T) { r := n.NewReceiver() // Send enough events to make sure the receiver channel is full. - for i := 0; i < 64; i++ { + for i := range 64 { n.Notify(i) } time.Sleep(time.Second) diff --git a/engine/pkg/orm/client.go b/engine/pkg/orm/client.go index 90f07bb7a8..1e66eb7877 100644 --- a/engine/pkg/orm/client.go +++ b/engine/pkg/orm/client.go @@ -28,7 +28,7 @@ import ( "gorm.io/gorm/clause" ) -var globalModels = []interface{}{ +var globalModels = []any{ &model.ProjectInfo{}, &model.ProjectOperation{}, &frameModel.MasterMeta{}, diff --git a/engine/pkg/orm/client_test.go b/engine/pkg/orm/client_test.go index 20d9b6d994..a3c55782be 100644 --- a/engine/pkg/orm/client_test.go +++ b/engine/pkg/orm/client_test.go @@ -42,11 +42,11 @@ const ( ) type tCase struct { - fn string // function name - inputs []interface{} // function args + fn string // function name + inputs []any // function args - output interface{} // function output - err error // function error + output any // function output + err error // function error mockExpectResFn func(mock sqlmock.Sqlmock) // sqlmock expectation } @@ -99,7 +99,7 @@ func TestProject(t *testing.T) { testCases := []tCase{ { fn: "CreateProject", - inputs: []interface{}{ + inputs: []any{ &model.ProjectInfo{ Model: model.Model{ CreatedAt: createdAt, @@ -116,7 +116,7 @@ func TestProject(t *testing.T) { }, { fn: "CreateProject", - inputs: []interface{}{ + inputs: []any{ &model.ProjectInfo{ Model: model.Model{ SeqID: 1, @@ -135,7 +135,7 @@ func TestProject(t *testing.T) { }, { fn: "DeleteProject", - inputs: []interface{}{ + inputs: []any{ "p111", }, err: errors.ErrMetaOpFail.GenWithStackByArgs(), @@ -145,7 +145,7 @@ func TestProject(t *testing.T) { }, { fn: "DeleteProject", - inputs: []interface{}{ + inputs: []any{ "p111", }, mockExpectResFn: func(mock sqlmock.Sqlmock) { @@ -154,7 +154,7 @@ func TestProject(t *testing.T) { }, { fn: "QueryProjects", - inputs: []interface{}{}, + inputs: []any{}, output: []*model.ProjectInfo{ { Model: model.Model{ @@ -184,7 +184,7 @@ func TestProject(t *testing.T) { }, { fn: "QueryProjects", - inputs: []interface{}{}, + inputs: []any{}, err: errors.ErrMetaOpFail.GenWithStackByArgs(), mockExpectResFn: func(mock sqlmock.Sqlmock) { mock.ExpectQuery("SELECT [*] FROM `project_infos`").WillReturnError(errors.New("QueryProjects error")) @@ -193,7 +193,7 @@ func TestProject(t *testing.T) { { // SELECT * FROM `project_infos` WHERE project_id = '111-222-333' ORDER BY `project_infos`.`id` LIMIT 1 fn: "GetProjectByID", - inputs: []interface{}{ + inputs: []any{ "111-222-333", }, output: &model.ProjectInfo{ @@ -215,7 +215,7 @@ func TestProject(t *testing.T) { }, { fn: "GetProjectByID", - inputs: []interface{}{ + inputs: []any{ "p111", }, err: errors.ErrMetaOpFail.GenWithStackByArgs(), @@ -248,7 +248,7 @@ func TestProjectOperation(t *testing.T) { { // SELECT * FROM `project_operations` WHERE project_id = '111' fn: "QueryProjectOperations", - inputs: []interface{}{ + inputs: []any{ "p111", }, output: []*model.ProjectOperation{ @@ -276,7 +276,7 @@ func TestProjectOperation(t *testing.T) { }, { fn: "QueryProjectOperations", - inputs: []interface{}{ + inputs: []any{ "p111", }, err: errors.ErrMetaOpFail.GenWithStackByArgs(), @@ -287,7 +287,7 @@ func TestProjectOperation(t *testing.T) { { // SELECT * FROM `project_operations` WHERE project_id = '111' AND created_at >= '2022-04-13 23:51:42.46' AND created_at <= '2022-04-13 23:51:42.46' fn: "QueryProjectOperationsByTimeRange", - inputs: []interface{}{ + inputs: []any{ "p111", TimeRange{ start: tm, @@ -319,7 +319,7 @@ func TestProjectOperation(t *testing.T) { }, { fn: "QueryProjectOperationsByTimeRange", - inputs: []interface{}{ + inputs: []any{ "p111", TimeRange{ start: tm, @@ -367,7 +367,7 @@ func TestJob(t *testing.T) { testCases := []tCase{ { fn: "InsertJob", - inputs: []interface{}{ + inputs: []any{ &frameModel.MasterMeta{ Model: model.Model{ CreatedAt: createdAt, @@ -397,7 +397,7 @@ func TestJob(t *testing.T) { }, { fn: "InsertJob", - inputs: []interface{}{ + inputs: []any{ &frameModel.MasterMeta{ Model: model.Model{ CreatedAt: createdAt, @@ -425,7 +425,7 @@ func TestJob(t *testing.T) { }, { fn: "UpsertJob", - inputs: []interface{}{ + inputs: []any{ &frameModel.MasterMeta{ ProjectID: "p111", ID: "j111", @@ -444,7 +444,7 @@ func TestJob(t *testing.T) { }, { fn: "DeleteJob", - inputs: []interface{}{ + inputs: []any{ "j111", }, err: errors.ErrMetaOpFail.GenWithStackByArgs(), @@ -457,7 +457,7 @@ func TestJob(t *testing.T) { { // DELETE FROM `master_meta` WHERE project_id = '111-222-334' AND job_id = '111' fn: "DeleteJob", - inputs: []interface{}{ + inputs: []any{ "j112", }, output: &ormResult{ @@ -471,7 +471,7 @@ func TestJob(t *testing.T) { }, { fn: "UpdateJob", - inputs: []interface{}{ + inputs: []any{ "j111", (&frameModel.MasterMeta{ ProjectID: "p111", @@ -492,7 +492,7 @@ func TestJob(t *testing.T) { }, { fn: "UpdateJob", - inputs: []interface{}{ + inputs: []any{ "j111", (&frameModel.MasterMeta{ ProjectID: "p111", @@ -513,7 +513,7 @@ func TestJob(t *testing.T) { }, { fn: "UpdateJob", - inputs: []interface{}{ + inputs: []any{ "j111", (&frameModel.MasterMeta{ ProjectID: "p111", @@ -536,7 +536,7 @@ func TestJob(t *testing.T) { }, { fn: "UpdateJob", - inputs: []interface{}{ + inputs: []any{ "j111", (&frameModel.MasterMeta{ ProjectID: "p111", @@ -560,7 +560,7 @@ func TestJob(t *testing.T) { { // SELECT * FROM `master_meta` WHERE project_id = '111-222-333' AND job_id = '111' ORDER BY `master_meta`.`id` LIMIT 1 fn: "GetJobByID", - inputs: []interface{}{ + inputs: []any{ "j111", }, output: &frameModel.MasterMeta{ @@ -592,7 +592,7 @@ func TestJob(t *testing.T) { }, { fn: "GetJobByID", - inputs: []interface{}{ + inputs: []any{ "j111", }, err: errors.ErrMetaOpFail.GenWithStackByArgs(), @@ -604,7 +604,7 @@ func TestJob(t *testing.T) { { // SELECT * FROM `master_meta` WHERE project_id = '111-222-333' fn: "QueryJobsByProjectID", - inputs: []interface{}{ + inputs: []any{ "p111", }, output: []*frameModel.MasterMeta{ @@ -636,7 +636,7 @@ func TestJob(t *testing.T) { }, { fn: "QueryJobsByProjectID", - inputs: []interface{}{ + inputs: []any{ "p111", }, err: errors.ErrMetaOpFail.GenWithStackByArgs(), @@ -648,7 +648,7 @@ func TestJob(t *testing.T) { { // SELECT * FROM `master_meta` WHERE project_id = '111-222-333' AND job_status = 1 fn: "QueryJobsByState", - inputs: []interface{}{ + inputs: []any{ "p111", 1, }, @@ -682,7 +682,7 @@ func TestJob(t *testing.T) { }, { fn: "QueryJobsByState", - inputs: []interface{}{ + inputs: []any{ "p111", 1, }, @@ -721,7 +721,7 @@ func TestWorker(t *testing.T) { // UPDATE `updated_at`=VALUES(`updated_at`),`project_id`=VALUES(`project_id`),`job_id`=VALUES(`job_id`),`id`=VALUES(`id`), // `type`=VALUES(`type`),`state`=VALUES(`state`),`epoch`=VALUES(`epoch`),`error_message`=VALUES(`error_message`),`extend_bytes`=VALUES(`extend_bytes`) fn: "UpsertWorker", - inputs: []interface{}{ + inputs: []any{ &frameModel.WorkerStatus{ Model: model.Model{ CreatedAt: createdAt, @@ -743,7 +743,7 @@ func TestWorker(t *testing.T) { }, { fn: "UpsertWorker", - inputs: []interface{}{ + inputs: []any{ &frameModel.WorkerStatus{ Model: model.Model{ SeqID: 1, @@ -768,7 +768,7 @@ func TestWorker(t *testing.T) { }, { fn: "DeleteWorker", - inputs: []interface{}{ + inputs: []any{ "j111", "w222", }, @@ -781,7 +781,7 @@ func TestWorker(t *testing.T) { { // DELETE FROM `worker_statuses` WHERE project_id = '111-222-334' AND job_id = '111' AND worker_id = '222' fn: "DeleteWorker", - inputs: []interface{}{ + inputs: []any{ "j112", "w223", }, @@ -796,7 +796,7 @@ func TestWorker(t *testing.T) { { // 'UPDATE `worker_statuses` SET `epoch`=?,`error-message`=?,`extend-bytes`=?,`id`=?,`job_id`=?,`project_id`=?,`status`=?,`type`=?,`updated_at`=? WHERE job_id = ? && id = ?' fn: "UpdateWorker", - inputs: []interface{}{ + inputs: []any{ &frameModel.WorkerStatus{ ProjectID: "p111", JobID: "j111", @@ -816,7 +816,7 @@ func TestWorker(t *testing.T) { // SELECT * FROM `worker_statuses` WHERE project_id = '111-222-333' AND job_id = '111' AND // worker_id = '222' ORDER BY `worker_statuses`.`id` LIMIT 1 fn: "GetWorkerByID", - inputs: []interface{}{ + inputs: []any{ "j111", "w222", }, @@ -846,7 +846,7 @@ func TestWorker(t *testing.T) { }, { fn: "GetWorkerByID", - inputs: []interface{}{ + inputs: []any{ "j111", "w222", }, @@ -859,7 +859,7 @@ func TestWorker(t *testing.T) { { // SELECT * FROM `worker_statuses` WHERE project_id = '111-222-333' AND job_id = '111' fn: "QueryWorkersByMasterID", - inputs: []interface{}{ + inputs: []any{ "j111", }, output: []*frameModel.WorkerStatus{ @@ -890,7 +890,7 @@ func TestWorker(t *testing.T) { }, { fn: "QueryWorkersByMasterID", - inputs: []interface{}{ + inputs: []any{ "j111", }, err: errors.ErrMetaOpFail.GenWithStackByArgs(), @@ -902,7 +902,7 @@ func TestWorker(t *testing.T) { { // SELECT * FROM `worker_statuses` WHERE project_id = '111-222-333' AND job_id = '111' AND worker_statuses = 1 fn: "QueryWorkersByState", - inputs: []interface{}{ + inputs: []any{ "j111", 1, }, @@ -934,7 +934,7 @@ func TestWorker(t *testing.T) { }, { fn: "QueryWorkersByState", - inputs: []interface{}{ + inputs: []any{ "j111", 1, }, @@ -968,7 +968,7 @@ func TestResource(t *testing.T) { testCases := []tCase{ { fn: "CreateResource", - inputs: []interface{}{ + inputs: []any{ &resModel.ResourceMeta{ Model: model.Model{ SeqID: 1, @@ -999,7 +999,7 @@ func TestResource(t *testing.T) { }, { fn: "CreateResource", - inputs: []interface{}{ + inputs: []any{ &resModel.ResourceMeta{ Model: model.Model{ SeqID: 1, @@ -1027,7 +1027,7 @@ func TestResource(t *testing.T) { }, { fn: "UpsertResource", - inputs: []interface{}{ + inputs: []any{ &resModel.ResourceMeta{ Model: model.Model{ SeqID: 1, @@ -1048,7 +1048,7 @@ func TestResource(t *testing.T) { }, { fn: "UpsertResource", - inputs: []interface{}{ + inputs: []any{ &resModel.ResourceMeta{ Model: model.Model{ SeqID: 1, @@ -1073,7 +1073,7 @@ func TestResource(t *testing.T) { }, { fn: "DeleteResource", - inputs: []interface{}{ + inputs: []any{ ResourceKey{ JobID: "j111", ID: "r222", @@ -1087,7 +1087,7 @@ func TestResource(t *testing.T) { }, { fn: "DeleteResource", - inputs: []interface{}{ + inputs: []any{ ResourceKey{ JobID: "j111", ID: "r223", @@ -1104,7 +1104,7 @@ func TestResource(t *testing.T) { { // 'UPDATE `resource_meta` SET `deleted`=?,`executor_id`=?,`id`=?,`job_id`=?,`project_id`=?,`worker_id`=?,`updated_at`=? WHERE id = ?' fn: "UpdateResource", - inputs: []interface{}{ + inputs: []any{ &resModel.ResourceMeta{ ProjectID: "p111", ID: "w111", @@ -1120,7 +1120,7 @@ func TestResource(t *testing.T) { }, { fn: "GetResourceByID", - inputs: []interface{}{ + inputs: []any{ ResourceKey{ JobID: "j111", ID: "r222", @@ -1150,7 +1150,7 @@ func TestResource(t *testing.T) { }, { fn: "GetResourceByID", - inputs: []interface{}{ + inputs: []any{ ResourceKey{ JobID: "j111", ID: "r222", @@ -1164,7 +1164,7 @@ func TestResource(t *testing.T) { }, { fn: "QueryResourcesByJobID", - inputs: []interface{}{ + inputs: []any{ "j111", }, output: []*resModel.ResourceMeta{ @@ -1193,7 +1193,7 @@ func TestResource(t *testing.T) { }, { fn: "QueryResourcesByJobID", - inputs: []interface{}{ + inputs: []any{ "j111", }, err: errors.ErrMetaOpFail.GenWithStackByArgs(), @@ -1204,7 +1204,7 @@ func TestResource(t *testing.T) { }, { fn: "QueryResourcesByExecutorIDs", - inputs: []interface{}{ + inputs: []any{ engineModel.ExecutorID("e444"), }, output: []*resModel.ResourceMeta{ @@ -1233,7 +1233,7 @@ func TestResource(t *testing.T) { }, { fn: "QueryResourcesByExecutorIDs", - inputs: []interface{}{ + inputs: []any{ engineModel.ExecutorID("e444"), engineModel.ExecutorID("e555"), }, @@ -1280,7 +1280,7 @@ func TestResource(t *testing.T) { }, { fn: "QueryResourcesByExecutorIDs", - inputs: []interface{}{ + inputs: []any{ engineModel.ExecutorID("e444"), }, err: errors.ErrMetaOpFail.GenWithStackByArgs(), @@ -1291,7 +1291,7 @@ func TestResource(t *testing.T) { }, { fn: "SetGCPendingByJobs", - inputs: []interface{}{ + inputs: []any{ "job-1", "job-2", "job-3", @@ -1310,7 +1310,7 @@ func TestResource(t *testing.T) { }, { fn: "DeleteResourcesByTypeAndExecutorIDs", - inputs: []interface{}{ + inputs: []any{ resModel.ResourceTypeLocalFile, engineModel.ExecutorID("executor-1"), }, @@ -1324,7 +1324,7 @@ func TestResource(t *testing.T) { }, { fn: "DeleteResourcesByTypeAndExecutorIDs", - inputs: []interface{}{ + inputs: []any{ resModel.ResourceTypeLocalFile, engineModel.ExecutorID("executor-1"), engineModel.ExecutorID("executor-2"), @@ -1445,7 +1445,7 @@ func TestJobOp(t *testing.T) { // SetJobCanceling successfully { fn: "SetJobCanceling", - inputs: []interface{}{ + inputs: []any{ "job-111", }, output: &ormResult{ @@ -1469,7 +1469,7 @@ func TestJobOp(t *testing.T) { // SetJobCanceling does nothing because cancelling op exists { fn: "SetJobCanceling", - inputs: []interface{}{ + inputs: []any{ "job-111", }, output: &ormResult{ @@ -1495,7 +1495,7 @@ func TestJobOp(t *testing.T) { // SetJobCanceling returns error if job is already cancelled { fn: "SetJobCanceling", - inputs: []interface{}{ + inputs: []any{ "job-111", }, output: &ormResult{ @@ -1522,7 +1522,7 @@ func TestJobOp(t *testing.T) { // SetJobCanceling updates job operation to canceling if exists a noop job operation { fn: "SetJobCanceling", - inputs: []interface{}{ + inputs: []any{ "job-111", }, output: &ormResult{ @@ -1549,7 +1549,7 @@ func TestJobOp(t *testing.T) { // SetJobCanceled { fn: "SetJobCanceled", - inputs: []interface{}{ + inputs: []any{ "job-111", }, output: &ormResult{ @@ -1565,7 +1565,7 @@ func TestJobOp(t *testing.T) { // QueryJobOp { fn: "QueryJobOp", - inputs: []interface{}{ + inputs: []any{ "job-1", }, output: &model.JobOp{ @@ -1588,7 +1588,7 @@ func TestJobOp(t *testing.T) { // QueryJobOpsByStatus { fn: "QueryJobOpsByStatus", - inputs: []interface{}{ + inputs: []any{ model.JobOpStatusCanceling, }, output: []*model.JobOp{ @@ -1649,7 +1649,7 @@ func TestExecutorClient(t *testing.T) { testCases := []tCase{ { fn: "CreateExecutor", - inputs: []interface{}{ + inputs: []any{ executor, }, output: &ormResult{ @@ -1663,7 +1663,7 @@ func TestExecutorClient(t *testing.T) { }, { fn: "UpdateExecutor", - inputs: []interface{}{ + inputs: []any{ executor, }, output: &ormResult{ @@ -1677,7 +1677,7 @@ func TestExecutorClient(t *testing.T) { }, { fn: "DeleteExecutor", - inputs: []interface{}{ + inputs: []any{ executor.ID, }, output: &ormResult{ @@ -1690,7 +1690,7 @@ func TestExecutorClient(t *testing.T) { }, { fn: "QueryExecutors", - inputs: []interface{}{}, + inputs: []any{}, output: []*model.Executor{executor}, mockExpectResFn: func(mock sqlmock.Sqlmock) { mock.ExpectQuery(regexp.QuoteMeta("SELECT * FROM `executors`")). diff --git a/engine/pkg/orm/log.go b/engine/pkg/orm/log.go index 97044f2dca..a777072fc6 100644 --- a/engine/pkg/orm/log.go +++ b/engine/pkg/orm/log.go @@ -68,15 +68,15 @@ func (l *ormLogger) LogMode(logger.LogLevel) logger.Interface { return l } -func (l *ormLogger) Info(ctx context.Context, format string, args ...interface{}) { +func (l *ormLogger) Info(ctx context.Context, format string, args ...any) { l.lg.Info(fmt.Sprintf(format, args...)) } -func (l *ormLogger) Warn(ctx context.Context, format string, args ...interface{}) { +func (l *ormLogger) Warn(ctx context.Context, format string, args ...any) { l.lg.Warn(fmt.Sprintf(format, args...)) } -func (l *ormLogger) Error(ctx context.Context, format string, args ...interface{}) { +func (l *ormLogger) Error(ctx context.Context, format string, args ...any) { l.lg.Error(fmt.Sprintf(format, args...)) } diff --git a/engine/pkg/orm/mock_test.go b/engine/pkg/orm/mock_test.go index dae46531aa..ceaf7d6440 100644 --- a/engine/pkg/orm/mock_test.go +++ b/engine/pkg/orm/mock_test.go @@ -39,7 +39,7 @@ func TestGenEpochMock(t *testing.T) { defer cancel() var epoch int64 - for j := 0; j < 10; j++ { + for range 10 { epoch, err = mock.GenEpoch(ctx) require.NoError(t, err) } @@ -47,11 +47,11 @@ func TestGenEpochMock(t *testing.T) { } type mCase struct { - fn string // function name - inputs []interface{} // function args + fn string // function name + inputs []any // function args - output interface{} // function output - err error // function error + output any // function output + err error // function error } func TestInitializeMock(t *testing.T) { @@ -74,7 +74,7 @@ func TestProjectMock(t *testing.T) { testCases := []mCase{ { fn: "CreateProject", - inputs: []interface{}{ + inputs: []any{ &model.ProjectInfo{ Model: model.Model{ CreatedAt: createdAt, @@ -87,7 +87,7 @@ func TestProjectMock(t *testing.T) { }, { fn: "CreateProject", - inputs: []interface{}{ + inputs: []any{ &model.ProjectInfo{ Model: model.Model{ SeqID: 2, @@ -101,19 +101,19 @@ func TestProjectMock(t *testing.T) { }, { fn: "DeleteProject", - inputs: []interface{}{ + inputs: []any{ "p111", }, }, { fn: "DeleteProject", - inputs: []interface{}{ + inputs: []any{ "p114", }, }, { fn: "QueryProjects", - inputs: []interface{}{}, + inputs: []any{}, output: []*model.ProjectInfo{ { // FIXME: ?? @@ -132,7 +132,7 @@ func TestProjectMock(t *testing.T) { { // SELECT * FROM `project_infos` WHERE project_id = '111-222-333' ORDER BY `project_infos`.`id` LIMIT 1 fn: "GetProjectByID", - inputs: []interface{}{ + inputs: []any{ "p112", }, output: &model.ProjectInfo{ @@ -147,7 +147,7 @@ func TestProjectMock(t *testing.T) { }, { fn: "GetProjectByID", - inputs: []interface{}{ + inputs: []any{ "p113", }, err: errors.ErrMetaEntryNotFound.GenWithStackByArgs(), @@ -173,7 +173,7 @@ func TestProjectOperationMock(t *testing.T) { testCases := []mCase{ { fn: "CreateProjectOperation", - inputs: []interface{}{ + inputs: []any{ &model.ProjectOperation{ ProjectID: "p111", Operation: "Submit", @@ -184,7 +184,7 @@ func TestProjectOperationMock(t *testing.T) { }, { fn: "CreateProjectOperation", - inputs: []interface{}{ + inputs: []any{ &model.ProjectOperation{ ProjectID: "p111", Operation: "Pause", @@ -196,7 +196,7 @@ func TestProjectOperationMock(t *testing.T) { { // SELECT * FROM `project_operations` WHERE project_id = '111' fn: "QueryProjectOperations", - inputs: []interface{}{ + inputs: []any{ "p111", }, output: []*model.ProjectOperation{ @@ -219,7 +219,7 @@ func TestProjectOperationMock(t *testing.T) { { // SELECT * FROM `project_operations` WHERE project_id = '111' AND created_at >= '2022-04-13 23:51:42.46' AND created_at <= '2022-04-13 23:51:42.46' fn: "QueryProjectOperationsByTimeRange", - inputs: []interface{}{ + inputs: []any{ "p111", TimeRange{ start: tm2, @@ -256,7 +256,7 @@ func TestJobMock(t *testing.T) { testCases := []mCase{ { fn: "UpsertJob", - inputs: []interface{}{ + inputs: []any{ &frameModel.MasterMeta{ Model: model.Model{ CreatedAt: createdAt, @@ -275,7 +275,7 @@ func TestJobMock(t *testing.T) { }, { fn: "UpsertJob", - inputs: []interface{}{ + inputs: []any{ &frameModel.MasterMeta{ ProjectID: "p111", ID: "j111", @@ -289,7 +289,7 @@ func TestJobMock(t *testing.T) { }, { fn: "DeleteJob", - inputs: []interface{}{ + inputs: []any{ "j112", }, output: ormResult{ @@ -299,7 +299,7 @@ func TestJobMock(t *testing.T) { { // DELETE FROM `master_meta` WHERE project_id = '111-222-334' AND job_id = '111' fn: "DeleteJob", - inputs: []interface{}{ + inputs: []any{ "j113", }, output: ormResult{ @@ -309,7 +309,7 @@ func TestJobMock(t *testing.T) { { // SELECT * FROM `master_meta` WHERE project_id = '111-222-333' AND job_id = '111' ORDER BY `master_meta`.`id` LIMIT 1 fn: "GetJobByID", - inputs: []interface{}{ + inputs: []any{ "j111", }, output: &frameModel.MasterMeta{ @@ -330,7 +330,7 @@ func TestJobMock(t *testing.T) { }, { fn: "GetJobByID", - inputs: []interface{}{ + inputs: []any{ "j113", }, err: errors.ErrMetaEntryNotFound.GenWithStackByArgs(), @@ -338,7 +338,7 @@ func TestJobMock(t *testing.T) { { // SELECT * FROM `master_meta` WHERE project_id = '111-222-333' fn: "QueryJobsByProjectID", - inputs: []interface{}{ + inputs: []any{ "p111", }, output: []*frameModel.MasterMeta{ @@ -361,7 +361,7 @@ func TestJobMock(t *testing.T) { }, { fn: "QueryJobsByProjectID", - inputs: []interface{}{ + inputs: []any{ "p113", }, output: []*frameModel.MasterMeta{}, @@ -369,7 +369,7 @@ func TestJobMock(t *testing.T) { { // SELECT * FROM `master_meta` WHERE project_id = '111-222-333' AND job_status = 1 fn: "QueryJobsByState", - inputs: []interface{}{ + inputs: []any{ "j111", 2, }, @@ -393,7 +393,7 @@ func TestJobMock(t *testing.T) { }, { fn: "QueryJobsByState", - inputs: []interface{}{ + inputs: []any{ "j113", 1, }, @@ -422,7 +422,7 @@ func TestWorkerMock(t *testing.T) { // `worker_statuses`,`worker_err_msg`,`worker_config`,`id`) VALUES ('2022-04-14 11:35:06.119','2022-04-14 11:35:06.119', // '111-222-333','111','222',1,1,'error','',1) fn: "UpsertWorker", - inputs: []interface{}{ + inputs: []any{ &frameModel.WorkerStatus{ Model: model.Model{ CreatedAt: createdAt, @@ -440,7 +440,7 @@ func TestWorkerMock(t *testing.T) { }, { fn: "UpsertWorker", - inputs: []interface{}{ + inputs: []any{ &frameModel.WorkerStatus{ Model: model.Model{ CreatedAt: createdAt, @@ -458,7 +458,7 @@ func TestWorkerMock(t *testing.T) { }, { fn: "DeleteWorker", - inputs: []interface{}{ + inputs: []any{ "j111", "w223", }, @@ -469,7 +469,7 @@ func TestWorkerMock(t *testing.T) { { // DELETE FROM `worker_statuses` WHERE project_id = '111-222-334' AND job_id = '111' AND worker_id = '222' fn: "DeleteWorker", - inputs: []interface{}{ + inputs: []any{ "j112", "w224", }, @@ -481,7 +481,7 @@ func TestWorkerMock(t *testing.T) { // SELECT * FROM `worker_statuses` WHERE project_id = '111-222-333' AND job_id = '111' AND // worker_id = '222' ORDER BY `worker_statuses`.`id` LIMIT 1 fn: "GetWorkerByID", - inputs: []interface{}{ + inputs: []any{ "j111", "w222", }, @@ -502,7 +502,7 @@ func TestWorkerMock(t *testing.T) { }, { fn: "GetWorkerByID", - inputs: []interface{}{ + inputs: []any{ "j111", "w225", }, @@ -511,7 +511,7 @@ func TestWorkerMock(t *testing.T) { { // SELECT * FROM `worker_statuses` WHERE project_id = '111-222-333' AND job_id = '111' fn: "QueryWorkersByMasterID", - inputs: []interface{}{ + inputs: []any{ "j111", }, output: []*frameModel.WorkerStatus{ @@ -533,7 +533,7 @@ func TestWorkerMock(t *testing.T) { }, { fn: "QueryWorkersByMasterID", - inputs: []interface{}{ + inputs: []any{ "j113", }, output: []*frameModel.WorkerStatus{}, @@ -541,7 +541,7 @@ func TestWorkerMock(t *testing.T) { { // SELECT * FROM `worker_statuses` WHERE project_id = '111-222-333' AND job_id = '111' AND worker_statuses = 1 fn: "QueryWorkersByState", - inputs: []interface{}{ + inputs: []any{ "j111", 1, }, @@ -564,7 +564,7 @@ func TestWorkerMock(t *testing.T) { }, { fn: "QueryWorkersByState", - inputs: []interface{}{ + inputs: []any{ "j111", 4, }, @@ -590,7 +590,7 @@ func TestResourceMock(t *testing.T) { testCases := []mCase{ { fn: "UpsertResource", - inputs: []interface{}{ + inputs: []any{ &resModel.ResourceMeta{ Model: model.Model{ CreatedAt: createdAt, @@ -607,7 +607,7 @@ func TestResourceMock(t *testing.T) { }, { fn: "UpsertResource", - inputs: []interface{}{ + inputs: []any{ &resModel.ResourceMeta{ Model: model.Model{ CreatedAt: createdAt, @@ -624,7 +624,7 @@ func TestResourceMock(t *testing.T) { }, { fn: "DeleteResource", - inputs: []interface{}{ + inputs: []any{ ResourceKey{ JobID: "j111", ID: "r334", @@ -636,7 +636,7 @@ func TestResourceMock(t *testing.T) { }, { fn: "DeleteResource", - inputs: []interface{}{ + inputs: []any{ ResourceKey{ JobID: "j111", ID: "r335", @@ -648,7 +648,7 @@ func TestResourceMock(t *testing.T) { }, { fn: "GetResourceByID", - inputs: []interface{}{ + inputs: []any{ ResourceKey{ JobID: "j111", ID: "r333", @@ -670,7 +670,7 @@ func TestResourceMock(t *testing.T) { }, { fn: "GetResourceByID", - inputs: []interface{}{ + inputs: []any{ ResourceKey{ JobID: "j111", ID: "r335", @@ -680,7 +680,7 @@ func TestResourceMock(t *testing.T) { }, { fn: "QueryResourcesByJobID", - inputs: []interface{}{ + inputs: []any{ "j111", }, output: []*resModel.ResourceMeta{ @@ -701,14 +701,14 @@ func TestResourceMock(t *testing.T) { }, { fn: "QueryResourcesByJobID", - inputs: []interface{}{ + inputs: []any{ "j112", }, output: []*resModel.ResourceMeta{}, }, { fn: "QueryResourcesByExecutorIDs", - inputs: []interface{}{ + inputs: []any{ engineModel.ExecutorID("e444"), }, output: []*resModel.ResourceMeta{ @@ -729,7 +729,7 @@ func TestResourceMock(t *testing.T) { }, { fn: "QueryResourcesByExecutorIDs", - inputs: []interface{}{ + inputs: []any{ engineModel.ExecutorID("e444"), }, output: []*resModel.ResourceMeta{}, diff --git a/engine/pkg/orm/model/common.go b/engine/pkg/orm/model/common.go index 8bd190e839..b4a82fd6cd 100644 --- a/engine/pkg/orm/model/common.go +++ b/engine/pkg/orm/model/common.go @@ -26,4 +26,4 @@ type Model struct { } // KeyValueMap alias to key value map when updating data in gorm -type KeyValueMap = map[string]interface{} +type KeyValueMap = map[string]any diff --git a/engine/pkg/orm/model/executor.go b/engine/pkg/orm/model/executor.go index f0c0f4c107..29b29e875c 100644 --- a/engine/pkg/orm/model/executor.go +++ b/engine/pkg/orm/model/executor.go @@ -42,7 +42,7 @@ func (s LabelSet) ToMap() map[string]string { } // Scan implements the sql.Scanner interface. -func (s *LabelSet) Scan(rawInput interface{}) error { +func (s *LabelSet) Scan(rawInput any) error { *s = make(LabelSet) if rawInput == nil { return nil @@ -88,8 +88,8 @@ type Executor struct { } // Map is used in gorm update. -func (e *Executor) Map() map[string]interface{} { - return map[string]interface{}{ +func (e *Executor) Map() map[string]any { + return map[string]any{ "id": e.ID, "name": e.Name, "address": e.Address, diff --git a/engine/pkg/orm/model/jobop.go b/engine/pkg/orm/model/jobop.go index 5b1f814b5d..8e3598122d 100644 --- a/engine/pkg/orm/model/jobop.go +++ b/engine/pkg/orm/model/jobop.go @@ -46,8 +46,8 @@ type JobOp struct { } // Map is used for update in orm model -func (op *JobOp) Map() map[string]interface{} { - return map[string]interface{}{ +func (op *JobOp) Map() map[string]any { + return map[string]any{ "op": op.Op, } } diff --git a/engine/pkg/p2p/message_sender.go b/engine/pkg/p2p/message_sender.go index 1d9eebbd4a..4b53a08472 100644 --- a/engine/pkg/p2p/message_sender.go +++ b/engine/pkg/p2p/message_sender.go @@ -28,10 +28,10 @@ type MessageSender interface { // SendToNode sends a message to a given node. Returns whether it is successful and a possible error. // A `would-block` error will not be returned. (false, nil) would be returned instead. - SendToNode(ctx context.Context, targetNodeID NodeID, topic Topic, message interface{}) (bool, error) + SendToNode(ctx context.Context, targetNodeID NodeID, topic Topic, message any) (bool, error) // SendToNodeB sends a message to a given node in a blocking way - SendToNodeB(ctx context.Context, targetNodeID NodeID, topic Topic, message interface{}) error + SendToNodeB(ctx context.Context, targetNodeID NodeID, topic Topic, message any) error } type messageSenderImpl struct { @@ -46,7 +46,7 @@ func NewMessageSender(router MessageRouter) MessageSender { // SendToNodeB implements MessageSender.SendToNodeB // Note the blocking send may have performance issue, BE CAUTION when using this function. func (m *messageSenderImpl) SendToNodeB( - ctx context.Context, targetNodeID NodeID, topic Topic, message interface{}, + ctx context.Context, targetNodeID NodeID, topic Topic, message any, ) error { client := m.router.GetClient(targetNodeID) if client == nil { @@ -58,7 +58,7 @@ func (m *messageSenderImpl) SendToNodeB( return err } -func (m *messageSenderImpl) SendToNode(ctx context.Context, targetNodeID NodeID, topic Topic, message interface{}) (bool, error) { +func (m *messageSenderImpl) SendToNode(ctx context.Context, targetNodeID NodeID, topic Topic, message any) (bool, error) { client := m.router.GetClient(targetNodeID) if client == nil { return false, nil diff --git a/engine/pkg/p2p/mock_message_handler_manager.go b/engine/pkg/p2p/mock_message_handler_manager.go index d78fb52f9e..3b3ddf8593 100644 --- a/engine/pkg/p2p/mock_message_handler_manager.go +++ b/engine/pkg/p2p/mock_message_handler_manager.go @@ -63,7 +63,7 @@ func (m *MockMessageHandlerManager) AssertNoHandler(t *testing.T, topic Topic) { // InvokeHandler gets the handler of given topic and invoke the handler to // simulate to send message from given sender -func (m *MockMessageHandlerManager) InvokeHandler(t *testing.T, topic Topic, senderID NodeID, message interface{}) error { +func (m *MockMessageHandlerManager) InvokeHandler(t *testing.T, topic Topic, senderID NodeID, message any) error { m.mu.RLock() defer m.mu.RUnlock() diff --git a/engine/pkg/p2p/mock_message_sender.go b/engine/pkg/p2p/mock_message_sender.go index c4c70dc051..64942bed52 100644 --- a/engine/pkg/p2p/mock_message_sender.go +++ b/engine/pkg/p2p/mock_message_sender.go @@ -50,7 +50,7 @@ func (m *MockMessageSender) SendToNodeB( ctx context.Context, targetNodeID NodeID, topic Topic, - message interface{}, + message any, ) error { m.mu.Lock() defer m.mu.Unlock() @@ -77,7 +77,7 @@ func (m *MockMessageSender) SendToNode( _ context.Context, targetNodeID NodeID, topic Topic, - message interface{}, + message any, ) (bool, error) { m.mu.Lock() defer m.mu.Unlock() @@ -104,7 +104,7 @@ func (m *MockMessageSender) SendToNode( } // TryPop tries to get a message from message sender -func (m *MockMessageSender) TryPop(targetNodeID NodeID, topic Topic) (interface{}, bool) { +func (m *MockMessageSender) TryPop(targetNodeID NodeID, topic Topic) (any, bool) { m.mu.Lock() defer m.mu.Unlock() diff --git a/engine/pkg/p2p/mock_message_sender_test.go b/engine/pkg/p2p/mock_message_sender_test.go index 4d714b0f2f..9c0902114e 100644 --- a/engine/pkg/p2p/mock_message_sender_test.go +++ b/engine/pkg/p2p/mock_message_sender_test.go @@ -33,11 +33,11 @@ func TestMockMessageSender(t *testing.T) { _, ok := sender.TryPop("dummy", "dummy") require.False(t, ok) - for i := 0; i < 50; i++ { + for i := range 50 { topicID := fmt.Sprintf("topic-%d", i) - for j := 0; j < 50; j++ { + for j := range 50 { nodeID := fmt.Sprintf("node-%d", j) - for k := 0; k < 50; k++ { + for k := range 50 { ok, err := sender.SendToNode(context.TODO(), nodeID, topicID, &msgForTesting{k}) require.True(t, ok) require.NoError(t, err) @@ -45,11 +45,11 @@ func TestMockMessageSender(t *testing.T) { } } - for i := 0; i < 50; i++ { + for i := range 50 { topicID := fmt.Sprintf("topic-%d", i) - for j := 0; j < 50; j++ { + for j := range 50 { nodeID := fmt.Sprintf("node-%d", j) - for k := 0; k < 50; k++ { + for k := range 50 { msg, ok := sender.TryPop(nodeID, topicID) require.True(t, ok) require.Equal(t, &msgForTesting{k}, msg) diff --git a/engine/pkg/p2p/server.go b/engine/pkg/p2p/server.go index 4b1c3ca01d..109c38a9c0 100644 --- a/engine/pkg/p2p/server.go +++ b/engine/pkg/p2p/server.go @@ -41,9 +41,9 @@ type ( type ( // TypeInformation is used to hold type data - TypeInformation = interface{} + TypeInformation = any // MessageValue is used to hold message object - MessageValue = interface{} + MessageValue = any // HandlerFunc alias to message handler function HandlerFunc = func(sender NodeID, value MessageValue) error ) diff --git a/engine/pkg/p2p/server_integration_test.go b/engine/pkg/p2p/server_integration_test.go index 67d4c2002c..a558ebf326 100644 --- a/engine/pkg/p2p/server_integration_test.go +++ b/engine/pkg/p2p/server_integration_test.go @@ -58,13 +58,11 @@ func TestMessageRPCServiceBasics(t *testing.T) { require.NoError(t, err) var wg sync.WaitGroup - wg.Add(1) - go func() { - defer wg.Done() + wg.Go(func() { err := messageSrvc.Serve(ctx, l) require.Error(t, err) require.Regexp(t, ".*canceled.*", err.Error()) - }() + }) var called atomic.Bool handlerManager := messageSrvc.MakeHandlerManager() @@ -78,13 +76,11 @@ func TestMessageRPCServiceBasics(t *testing.T) { require.True(t, ok) client := p2pImpl.NewGrpcMessageClient("test-client-1", clientConfigForUnitTesting) - wg.Add(1) - go func() { - defer wg.Done() + wg.Go(func() { err := client.Run(ctx, "tcp", addr, "test-node-1", &security.Credential{} /* no TLS */) require.Error(t, err) require.Regexp(t, ".*canceled.*", err.Error()) - }() + }) _, err = client.SendMessage(ctx, "test-topic-1", &msgContent{}) require.NoError(t, err) diff --git a/engine/pkg/rpcutil/middleware.go b/engine/pkg/rpcutil/middleware.go index 65513159d7..d375ba88f9 100644 --- a/engine/pkg/rpcutil/middleware.go +++ b/engine/pkg/rpcutil/middleware.go @@ -16,6 +16,7 @@ package rpcutil import ( "context" "reflect" + "slices" "strings" "time" @@ -208,10 +209,8 @@ func NormalizeError() grpc.UnaryServerInterceptor { // allowList is a list of methods that will be logged. limiter is used to limit the log rate. func Logger(allowList []string, limiter *rate.Limiter) grpc.UnaryServerInterceptor { allow := func(method string) bool { - for _, m := range allowList { - if m == method { - return true - } + if slices.Contains(allowList, method) { + return true } return limiter.Allow() } diff --git a/engine/servermaster/executor_manager.go b/engine/servermaster/executor_manager.go index 8da176b398..5a0dd26a4c 100644 --- a/engine/servermaster/executor_manager.go +++ b/engine/servermaster/executor_manager.go @@ -106,9 +106,7 @@ func (e *ExecutorManagerImpl) removeExecutorLocked(id model.ExecutorID) error { // // We use ttl mechanism to manage the executor's life cycle. So we can tolerate // that a tombstone executor may be left in the database. - e.wg.Add(1) - go func() { - defer e.wg.Done() + e.wg.Go(func() { ctx, cancel := context.WithTimeout(context.Background(), time.Second*5) defer cancel() @@ -116,7 +114,7 @@ func (e *ExecutorManagerImpl) removeExecutorLocked(id model.ExecutorID) error { if err := e.metaClient.DeleteExecutor(ctx, id); err != nil { log.Warn("failed to delete executor from database", zap.String("id", string(id)), zap.Error(err)) } - }() + }) return nil } diff --git a/engine/servermaster/executor_manager_test.go b/engine/servermaster/executor_manager_test.go index af8bbc3a1b..a0c6259fc4 100644 --- a/engine/servermaster/executor_manager_test.go +++ b/engine/servermaster/executor_manager_test.go @@ -79,11 +79,9 @@ func TestExecutorManager(t *testing.T) { metaClient.EXPECT().DeleteExecutor(gomock.Any(), executor.ID).Times(1).Return(nil) var wg sync.WaitGroup - wg.Add(1) - go func() { - defer wg.Done() + wg.Go(func() { mgr.Run(ctx) - }() + }) require.Eventually(t, func() bool { return mgr.ExecutorCount(model.Running) == 0 @@ -170,9 +168,7 @@ func TestExecutorManagerWatch(t *testing.T) { require.NoError(t, err) ctxIn, cancelIn := context.WithCancel(ctx) - wg.Add(1) - go func() { - defer wg.Done() + wg.Go(func() { ticker := time.NewTicker(time.Millisecond) defer ticker.Stop() for { @@ -184,7 +180,7 @@ func TestExecutorManagerWatch(t *testing.T) { require.NoError(t, err) } } - }() + }) return cancelIn } @@ -197,11 +193,9 @@ func TestExecutorManagerWatch(t *testing.T) { metaClient.EXPECT().DeleteExecutor(gomock.Any(), executorID2).Times(1).Return(nil) var mgrWg sync.WaitGroup - mgrWg.Add(1) - go func() { - defer mgrWg.Done() + mgrWg.Go(func() { mgr.Run(ctx) - }() + }) // mgr.Start will reset executors first, so there will be two online events. event = <-stream.C diff --git a/engine/servermaster/http_test.go b/engine/servermaster/http_test.go index 5ad2ba82b9..e6ec433ffb 100644 --- a/engine/servermaster/http_test.go +++ b/engine/servermaster/http_test.go @@ -120,7 +120,6 @@ func TestRegisterRoutes(t *testing.T) { } for i, tc := range testCases { - tc := tc t.Run(fmt.Sprintf("case-%d", i), func(t *testing.T) { t.Parallel() req := httptest.NewRequest(tc.method, tc.path, nil) @@ -182,7 +181,6 @@ func TestShouldForwardJobAPI(t *testing.T) { } for i, tc := range testCases { - tc := tc t.Run(fmt.Sprintf("case-%d", i), func(t *testing.T) { t.Parallel() req, err := http.NewRequestWithContext(ctx, tc.method, tc.path, nil) diff --git a/engine/servermaster/jobmanager.go b/engine/servermaster/jobmanager.go index e1e8e6c5a9..9792e71d07 100644 --- a/engine/servermaster/jobmanager.go +++ b/engine/servermaster/jobmanager.go @@ -757,7 +757,7 @@ func (jm *JobManagerImpl) OnWorkerOffline(worker framework.WorkerHandle, reason } // OnWorkerMessage implements frame.MasterImpl.OnWorkerMessage -func (jm *JobManagerImpl) OnWorkerMessage(worker framework.WorkerHandle, topic p2p.Topic, message interface{}) error { +func (jm *JobManagerImpl) OnWorkerMessage(worker framework.WorkerHandle, topic p2p.Topic, message any) error { log.Info("on worker message", zap.Any("id", worker.ID()), zap.Any("topic", topic), zap.Any("message", message)) return nil } diff --git a/engine/servermaster/jobmanager_test.go b/engine/servermaster/jobmanager_test.go index 45eecd8136..2679d3b1e8 100644 --- a/engine/servermaster/jobmanager_test.go +++ b/engine/servermaster/jobmanager_test.go @@ -68,8 +68,7 @@ func prepareMockJobManager( func TestJobManagerCreateJob(t *testing.T) { t.Parallel() - ctx, cancel := context.WithCancel(context.Background()) - defer cancel() + ctx := t.Context() masterID := "create-job-test" mockMaster, mgr := prepareMockJobManager(ctx, t, masterID) @@ -109,7 +108,7 @@ func TestJobManagerCreateJob(t *testing.T) { // delete a finished job, re-create job with the same id will meet error err = mockMaster.GetFrameMetaClient().UpdateJob(ctx, job.Id, - map[string]interface{}{ + map[string]any{ "state": frameModel.MasterStateFinished, }, ) @@ -135,8 +134,7 @@ func (m *mockBaseMasterCreateWorkerFailed) CreateWorker( func TestCreateWorkerReturnError(t *testing.T) { t.Parallel() - ctx, cancel := context.WithCancel(context.Background()) - defer cancel() + ctx := t.Context() masterImpl := framework.NewMockMasterImpl(t, "", "create-worker-with-error") framework.MockMasterPrepareMeta(ctx, t, masterImpl) @@ -166,8 +164,7 @@ func TestCreateWorkerReturnError(t *testing.T) { func TestJobManagerCancelJob(t *testing.T) { t.Parallel() - ctx, cancel := context.WithCancel(context.Background()) - defer cancel() + ctx := t.Context() masterID := "cancel-job-test" mockMaster, mgr := prepareMockJobManager(ctx, t, masterID) @@ -195,7 +192,7 @@ func TestJobManagerCancelJob(t *testing.T) { require.NoError(t, err) require.Equal(t, pb.Job_Canceling, job.State) - for i := 0; i < 5; i++ { + for i := range 5 { err = mgr.jobOperator.Tick(ctx) require.NoError(t, err) require.Equal(t, i+1, mockWorkerHandle.SendMessageCount()) @@ -210,8 +207,7 @@ func TestJobManagerCancelJob(t *testing.T) { func TestJobManagerDeleteJob(t *testing.T) { t.Parallel() - ctx, cancel := context.WithCancel(context.Background()) - defer cancel() + ctx := t.Context() masterID := "delete-job-test" mockMaster, mgr := prepareMockJobManager(ctx, t, masterID) @@ -238,8 +234,7 @@ func TestJobManagerDeleteJob(t *testing.T) { func TestJobManagerGetJob(t *testing.T) { t.Parallel() - ctx, cancel := context.WithCancel(context.Background()) - defer cancel() + ctx := t.Context() testCases := []struct { meta *frameModel.MasterMeta @@ -316,8 +311,7 @@ func TestJobManagerGetJob(t *testing.T) { func TestJobManagerOnlineJob(t *testing.T) { t.Parallel() - ctx, cancel := context.WithCancel(context.Background()) - defer cancel() + ctx := t.Context() mockMaster := framework.NewMockMasterImpl(t, "", "submit-job-test") framework.MockMasterPrepareMeta(ctx, t, mockMaster) @@ -356,8 +350,7 @@ func TestJobManagerOnlineJob(t *testing.T) { func TestJobManagerRecover(t *testing.T) { t.Parallel() - ctx, cancel := context.WithCancel(context.Background()) - defer cancel() + ctx := t.Context() mockMaster := framework.NewMockMasterImpl(t, "", "job-manager-recover-test") framework.MockMasterPrepareMeta(ctx, t, mockMaster) @@ -394,8 +387,7 @@ func TestJobManagerRecover(t *testing.T) { func TestJobManagerTickExceedQuota(t *testing.T) { t.Parallel() - ctx, cancel := context.WithCancel(context.Background()) - defer cancel() + ctx := t.Context() masterImpl := framework.NewMockMasterImpl(t, "", "create-worker-with-error") framework.MockMasterPrepareMeta(ctx, t, masterImpl) @@ -428,8 +420,7 @@ func TestJobManagerTickExceedQuota(t *testing.T) { func TestJobManagerWatchJobStatuses(t *testing.T) { t.Parallel() - ctx, cancel := context.WithCancel(context.Background()) - defer cancel() + ctx := t.Context() masterID := "delete-job-test" mockMaster, mgr := prepareMockJobManager(ctx, t, masterID) @@ -544,8 +535,7 @@ func TestGetJobDetailFromJobMaster(t *testing.T) { func TestListJobsPagination(t *testing.T) { t.Parallel() - ctx, cancel := context.WithCancel(context.Background()) - defer cancel() + ctx := t.Context() mockMaster := framework.NewMockMasterImpl(t, "", "job-manager-list-jobs-test") masterMeta := mockMaster.DefaultBaseMaster.MasterMeta() @@ -556,7 +546,7 @@ func TestListJobsPagination(t *testing.T) { const totalJobCount = 2000 jobIDs := make([]string, 0, totalJobCount) - for i := 0; i < totalJobCount; i++ { + for i := range totalJobCount { jobID := fmt.Sprintf("job-%04d", i) jobIDs = append(jobIDs, jobID) cli := metadata.NewMasterMetadataClient(jobID, mockMaster.GetFrameMetaClient()) @@ -580,7 +570,7 @@ func TestListJobsPagination(t *testing.T) { resp, err := mgr.ListJobs(ctx, &pb.ListJobsRequest{}) require.NoError(t, err) require.Len(t, resp.Jobs, defaultListPageSize) - for i := 0; i < defaultListPageSize; i++ { + for i := range defaultListPageSize { require.Equal(t, jobIDs[i], resp.Jobs[i].Id) } require.Equal(t, jobIDs[defaultListPageSize-1], resp.NextPageToken) @@ -613,8 +603,7 @@ func TestListJobsPagination(t *testing.T) { func TestListJobWithFilter(t *testing.T) { t.Parallel() - ctx, cancel := context.WithCancel(context.Background()) - defer cancel() + ctx := t.Context() mockMaster := framework.NewMockMasterImpl(t, "", "job-manager-list-jobs-test") masterMeta := mockMaster.DefaultBaseMaster.MasterMeta() @@ -641,7 +630,7 @@ func TestListJobWithFilter(t *testing.T) { const totalJobCount = maxListPageSize countByType := make(map[frameModel.WorkerType]int) countByState := make(map[frameModel.MasterState]int) - for i := 0; i < totalJobCount; i++ { + for i := range totalJobCount { jobID := fmt.Sprintf("job-%04d", i) cli := metadata.NewMasterMetadataClient("job-1", mockMaster.GetFrameMetaClient()) masterMeta := &frameModel.MasterMeta{ @@ -684,8 +673,7 @@ func TestListJobWithFilter(t *testing.T) { func TestOnWorkerDispatchedFastFail(t *testing.T) { t.Parallel() - ctx, cancel := context.WithCancel(context.Background()) - defer cancel() + ctx := t.Context() masterID := "job-fast-fail-test" mockMaster, mgr := prepareMockJobManager(ctx, t, masterID) @@ -710,8 +698,7 @@ func TestOnWorkerDispatchedFastFail(t *testing.T) { func TestJobOperatorBgLoop(t *testing.T) { t.Parallel() - ctx, cancel := context.WithCancel(context.Background()) - defer cancel() + ctx := t.Context() masterID := "job-operator-bg-loop-test" mockMaster, mgr := prepareMockJobManager(ctx, t, masterID) @@ -732,7 +719,7 @@ func TestJobOperatorBgLoop(t *testing.T) { return nil }) wg.Go(func() error { - for i := 0; i < 6; i++ { + for range 6 { mgr.jobOperatorNotifier.Notify() time.Sleep(time.Millisecond * 50) } @@ -763,8 +750,7 @@ func dispatchJobAndMeetError( func TestJobManagerIterPendingJobs(t *testing.T) { t.Parallel() - ctx, cancel := context.WithCancel(context.Background()) - defer cancel() + ctx := t.Context() masterImpl := framework.NewMockMasterImpl(t, "", "iter-pending-jobs-test") framework.MockMasterPrepareMeta(ctx, t, masterImpl) @@ -832,8 +818,7 @@ func TestJobManagerIterPendingJobs(t *testing.T) { func TestFailoverWithCreateWorkerOpt(t *testing.T) { t.Parallel() - ctx, cancel := context.WithCancel(context.Background()) - defer cancel() + ctx := t.Context() selectors := []*label.Selector{ {Key: "name", Target: "executor.*", Op: label.OpRegex}, diff --git a/engine/servermaster/jobop/backoff_test.go b/engine/servermaster/jobop/backoff_test.go index 4082864300..c3d0f8a90a 100644 --- a/engine/servermaster/jobop/backoff_test.go +++ b/engine/servermaster/jobop/backoff_test.go @@ -45,7 +45,7 @@ func TestJobBackoff(t *testing.T) { require.True(t, bkf.Allow()) // simulate consecutive failures - for i := 0; i < 10; i++ { + for range 10 { bkf.Fail() } require.False(t, bkf.Allow()) diff --git a/engine/servermaster/jobop/operator_test.go b/engine/servermaster/jobop/operator_test.go index e1660c6b24..daa3f61001 100644 --- a/engine/servermaster/jobop/operator_test.go +++ b/engine/servermaster/jobop/operator_test.go @@ -101,7 +101,7 @@ func TestJobOperator(t *testing.T) { err = oper.MarkJobCanceling(ctx, jobID) require.NoError(t, err) - for i := 0; i < 3; i++ { + for i := range 3 { err = oper.Tick(ctx) require.NoError(t, err) router.checkCancelCalls(t, jobID, i+1) diff --git a/engine/servermaster/server_test.go b/engine/servermaster/server_test.go index f73a22665e..434f506019 100644 --- a/engine/servermaster/server_test.go +++ b/engine/servermaster/server_test.go @@ -94,11 +94,9 @@ func TestServe(t *testing.T) { ctx, cancel := context.WithCancel(context.Background()) var wg sync.WaitGroup - wg.Add(1) - go func() { - defer wg.Done() + wg.Go(func() { _ = s.serve(ctx) - }() + }) require.Eventually(t, func() bool { conn, err := net.Dial("tcp", cfg.Addr) @@ -204,11 +202,9 @@ func TestCollectMetric(t *testing.T) { ctx, cancel := context.WithCancel(context.Background()) var wg sync.WaitGroup - wg.Add(1) - go func() { - defer wg.Done() + wg.Go(func() { _ = s.serve(ctx) - }() + }) jobManager := &mockJobManager{ jobs: map[pb.Job_State][]*pb.Job{ @@ -284,11 +280,9 @@ func TestHTTPErrorHandler(t *testing.T) { defer cancel() var wg sync.WaitGroup - wg.Add(1) - go func() { - defer wg.Done() + wg.Go(func() { _ = s.serve(ctx) - }() + }) require.Eventually(t, func() bool { conn, err := net.Dial("tcp", cfg.Addr) diff --git a/engine/servermaster/serverutil/watch_executors_test.go b/engine/servermaster/serverutil/watch_executors_test.go index 8b1305f985..2bd7adf15a 100644 --- a/engine/servermaster/serverutil/watch_executors_test.go +++ b/engine/servermaster/serverutil/watch_executors_test.go @@ -128,13 +128,11 @@ func TestWatchExecutors(t *testing.T) { } var wg sync.WaitGroup - wg.Add(1) - go func() { - defer wg.Done() + wg.Go(func() { err := WatchExecutors(ctx, watcher, user) require.ErrorIs(t, err, context.Canceled) - }() + }) for _, event := range events { evNotifier.Notify(event) @@ -187,12 +185,10 @@ func TestCloseWatchExecutors(t *testing.T) { user.On("UpdateExecutorList", snap).Return(nil).Times(1) var wg sync.WaitGroup - wg.Add(1) - go func() { - defer wg.Done() + wg.Go(func() { err := WatchExecutors(ctx, watcher, user) require.ErrorIs(t, err, errors.ErrExecutorWatcherClosed) - }() + }) evNotifier.Close() wg.Wait() diff --git a/engine/servermaster/service_util_test.go b/engine/servermaster/service_util_test.go index 2b6e3249e9..5b267d960a 100644 --- a/engine/servermaster/service_util_test.go +++ b/engine/servermaster/service_util_test.go @@ -30,7 +30,7 @@ func TestGenerateNodeID(t *testing.T) { ) ids := make(map[string]struct{}) - for i := 0; i < genCount; i++ { + for range genCount { id := generateNodeID(name) require.True(t, strings.HasPrefix(id, name+"-")) ids[id] = struct{}{} diff --git a/engine/test/e2e/e2e_dm_test.go b/engine/test/e2e/e2e_dm_test.go index ffcf3e1aa2..6cbc2f3eba 100644 --- a/engine/test/e2e/e2e_dm_test.go +++ b/engine/test/e2e/e2e_dm_test.go @@ -211,7 +211,7 @@ func testSimpleAllModeTask( db string, ) { ctx := context.Background() - noError := func(_ interface{}, err error) { + noError := func(_ any, err error) { require.NoError(t, err) } @@ -427,7 +427,7 @@ func testSimpleAllModeTask( // update with new balist newDB := "new_" + db - dmJobCfg = bytes.ReplaceAll(dmJobCfg, []byte(fmt.Sprintf(`["%s"]`, db)), []byte(fmt.Sprintf(`["%s", "%s"]`, db, newDB))) + dmJobCfg = bytes.ReplaceAll(dmJobCfg, fmt.Appendf(nil, `["%s"]`, db), fmt.Appendf(nil, `["%s", "%s"]`, db, newDB)) err = updateJobCfg(ctx, httpClient, jobID, string(dmJobCfg)) require.NoError(t, err) // get new config @@ -465,7 +465,7 @@ func testSimpleDumpSyncModeTask( db string, ) { ctx := context.Background() - noError := func(_ interface{}, err error) { + noError := func(_ any, err error) { require.NoError(t, err) } @@ -495,7 +495,7 @@ func testSimpleDumpSyncModeTask( secretAccessKey := os.Getenv(envS3SecretAccessKey) require.Greater(t, len(secretAccessKey), 0, "empty secret access key in env %s", envS3SecretAccessKey) - dmJobCfg = bytes.ReplaceAll(dmJobCfg, []byte("# dir: ./dumped_data"), []byte(fmt.Sprintf(" dir: s3://engine-it/dumped_data_%s?force-path-style=1&access-key=%s&secret-access-key=%s&endpoint=%s", db, accessKeyID, secretAccessKey, endpoint))) + dmJobCfg = bytes.ReplaceAll(dmJobCfg, []byte("# dir: ./dumped_data"), fmt.Appendf(nil, " dir: s3://engine-it/dumped_data_%s?force-path-style=1&access-key=%s&secret-access-key=%s&endpoint=%s", db, accessKeyID, secretAccessKey, endpoint)) var jobID string require.Eventually(t, func() bool { var err error @@ -695,7 +695,7 @@ func testSimpleDumpSyncModeTask( // update with new balist newDB := "new_" + db - dmJobCfg = bytes.ReplaceAll(dmJobCfg, []byte(fmt.Sprintf(`["%s"]`, db)), []byte(fmt.Sprintf(`["%s", "%s"]`, db, newDB))) + dmJobCfg = bytes.ReplaceAll(dmJobCfg, fmt.Appendf(nil, `["%s"]`, db), fmt.Appendf(nil, `["%s", "%s"]`, db, newDB)) err = updateJobCfg(ctx, httpClient, jobID, string(dmJobCfg)) require.NoError(t, err) // get new config diff --git a/engine/test/e2e/e2e_node_chaos_test.go b/engine/test/e2e/e2e_node_chaos_test.go index 8824064fc1..44f1f3cc8e 100644 --- a/engine/test/e2e/e2e_node_chaos_test.go +++ b/engine/test/e2e/e2e_node_chaos_test.go @@ -42,7 +42,7 @@ func updateKeyAndCheckOnce( zap.Int("expect-mvcc", expectedMvcc)) ctx1, cancel := context.WithTimeout(ctx, DefaultTimeoutForTest) defer cancel() - for j := 0; j < workerCount; j++ { + for j := range workerCount { err := cli.UpdateFakeJobKey(ctx1, j, updateValue) require.NoError(t, err) } @@ -51,7 +51,7 @@ func updateKeyAndCheckOnce( ctx1, cancel := context.WithTimeout(ctx, DefaultTimeoutForTest) defer cancel() log.Debug("wait and check fake job value and mvcc. tick.") - for jobIdx := 0; jobIdx < workerCount; jobIdx++ { + for jobIdx := range workerCount { err := cli.CheckFakeJobKey(ctx1, jobID, jobIdx, expectedMvcc, updateValue) if err != nil { log.Warn("check fake job failed", zap.Error(err)) @@ -135,7 +135,7 @@ func TestNodeFailure(t *testing.T) { updateKeyAndCheckOnce(ctx, t, cli, jobID, cfg.WorkerCount, "random-value-1", mvccCount) log.Info("restart all server masters and check fake job is running normally") - for i := 0; i < nodeCount; i++ { + for i := range nodeCount { cli.ContainerRestart(masterContainerName(i)) mvccCount++ value := fmt.Sprintf("restart-server-master-value-%d", i) @@ -157,18 +157,18 @@ func TestNodeFailure(t *testing.T) { }, time.Second*10, time.Second, "leader is not changed") log.Info("restart all executors and check fake job is running normally") - for i := 0; i < nodeCount; i++ { + for i := range nodeCount { cli.ContainerRestart(executorContainerName(i)) mvccCount++ value := fmt.Sprintf("restart-executor-value-%d", i) updateKeyAndCheckOnce(ctx, t, cli, jobID, cfg.WorkerCount, value, mvccCount) } - for i := 0; i < nodeCount; i++ { + for i := range nodeCount { cli.ContainerStop(masterContainerName(i)) cli.ContainerStop(executorContainerName(i)) } - for i := 0; i < nodeCount; i++ { + for i := range nodeCount { cli.ContainerStart(masterContainerName(i)) cli.ContainerStart(executorContainerName(i)) } diff --git a/engine/test/mock/grpc.go b/engine/test/mock/grpc.go index 8a3e17266f..a0f84d847e 100644 --- a/engine/test/mock/grpc.go +++ b/engine/test/mock/grpc.go @@ -64,7 +64,7 @@ func (s *masterServerConn) Close() error { return nil } -func (s *masterServerConn) sendRequest(ctx context.Context, req interface{}) (interface{}, error) { +func (s *masterServerConn) sendRequest(ctx context.Context, req any) (any, error) { switch x := req.(type) { case *pb.RegisterExecutorRequest: return s.server.RegisterExecutor(ctx, x) @@ -127,7 +127,7 @@ func NewExecutorClient(conn Conn) pb.ExecutorServiceClient { return &executorClient{conn} } -func (s *executorServerConn) sendRequest(ctx context.Context, req interface{}) (interface{}, error) { +func (s *executorServerConn) sendRequest(ctx context.Context, req any) (any, error) { switch x := req.(type) { case *pb.PreDispatchTaskRequest: return s.server.PreDispatchTask(ctx, x) @@ -180,7 +180,7 @@ func NewExecutorServer(addr string, server pb.ExecutorServiceServer) (GrpcServer // Conn is a simple interface that support send gRPC requests and closeable type Conn interface { Close() error - sendRequest(ctx context.Context, req interface{}) (interface{}, error) + sendRequest(ctx context.Context, req any) (any, error) } // ResetGrpcCtx resets grpc servers diff --git a/engine/test/mock/test_server.go b/engine/test/mock/test_server.go index c918d9a738..bffbed0de1 100644 --- a/engine/test/mock/test_server.go +++ b/engine/test/mock/test_server.go @@ -97,11 +97,11 @@ func (s *testStream) SetTrailer(metadata.MD) {} func (s *testStream) Context() context.Context { return nil } -func (s *testStream) SendMsg(interface{}) error { +func (s *testStream) SendMsg(any) error { return errors.New("unimplemented") } -func (s *testStream) RecvMsg(interface{}) error { +func (s *testStream) RecvMsg(any) error { return errors.New("unimplemented") } @@ -115,7 +115,7 @@ func (s *testStream) CloseSend() error { return errors.New("unimplemented") } -func (s *testServerConn) sendRequest(ctx context.Context, req interface{}) (interface{}, error) { +func (s *testServerConn) sendRequest(ctx context.Context, req any) (any, error) { switch x := req.(type) { case *pb.TestBinlogRequest: stream := &testStream{ From b5ffa553293de8e0e5ae0dcdfe525b4e270843e5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dani=C3=ABl=20van=20Eeden?= Date: Tue, 16 Jun 2026 11:16:49 +0200 Subject: [PATCH 2/3] make fmt --- engine/framework/internal/eventloop/runner_test.go | 2 -- engine/framework/internal/worker/master_client_test.go | 1 - engine/internal/pkg/discovery/agent_test.go | 1 - engine/jobmaster/dm/api.go | 1 - engine/pkg/client/internal/call_test.go | 2 -- engine/pkg/containers/slice_queue_test.go | 2 -- engine/pkg/errctx/center_test.go | 2 -- engine/pkg/externalresource/integration_test/mock_cluster.go | 2 -- engine/pkg/externalresource/manager/gc_coordinator_test.go | 1 - engine/pkg/externalresource/manager/gc_runner_test.go | 1 - engine/pkg/notifier/notifier_test.go | 2 -- engine/servermaster/executor_manager.go | 1 - engine/servermaster/serverutil/watch_executors_test.go | 1 - 13 files changed, 19 deletions(-) diff --git a/engine/framework/internal/eventloop/runner_test.go b/engine/framework/internal/eventloop/runner_test.go index e328ace423..614ec9236c 100644 --- a/engine/framework/internal/eventloop/runner_test.go +++ b/engine/framework/internal/eventloop/runner_test.go @@ -119,7 +119,6 @@ func TestRunnerNormalPath(t *testing.T) { var wg sync.WaitGroup wg.Go(func() { - err := runner.Run(context.Background()) require.Error(t, err) require.Regexp(t, "injected error", err) @@ -152,7 +151,6 @@ func TestRunnerForcefulExit(t *testing.T) { var wg sync.WaitGroup wg.Go(func() { - err := runner.Run(context.Background()) require.Error(t, err) require.Regexp(t, "ErrWorkerSuicide", err) diff --git a/engine/framework/internal/worker/master_client_test.go b/engine/framework/internal/worker/master_client_test.go index b9c505ff70..4caff5d8cc 100644 --- a/engine/framework/internal/worker/master_client_test.go +++ b/engine/framework/internal/worker/master_client_test.go @@ -92,7 +92,6 @@ func (h *masterClientTestHelper) PopHeartbeat(t *testing.T) *frameModel.Heartbea func (h *masterClientTestHelper) SimulateWorkerClose(timeout time.Duration) { h.wg.Go(func() { - ctx, cancel := context.WithTimeout(context.Background(), timeout) defer cancel() diff --git a/engine/internal/pkg/discovery/agent_test.go b/engine/internal/pkg/discovery/agent_test.go index cd8798e66a..e4c15c2f6c 100644 --- a/engine/internal/pkg/discovery/agent_test.go +++ b/engine/internal/pkg/discovery/agent_test.go @@ -73,7 +73,6 @@ func TestAgent(t *testing.T) { var wg sync.WaitGroup wg.Go(func() { - err := agent.Run(ctx) require.ErrorIs(t, err, context.Canceled) }) diff --git a/engine/jobmaster/dm/api.go b/engine/jobmaster/dm/api.go index 6fe753a8e7..e11e2795aa 100644 --- a/engine/jobmaster/dm/api.go +++ b/engine/jobmaster/dm/api.go @@ -104,7 +104,6 @@ func (jm *JobMaster) QueryJobStatus(ctx context.Context, tasks []string) (*JobSt for _, task := range tasks { taskID := task wg.Go(func() { - var ( queryStatusResp *dmpkg.QueryStatusResponse workerID string diff --git a/engine/pkg/client/internal/call_test.go b/engine/pkg/client/internal/call_test.go index 286662f36a..1e25ef24e9 100644 --- a/engine/pkg/client/internal/call_test.go +++ b/engine/pkg/client/internal/call_test.go @@ -60,7 +60,6 @@ func TestCallFuncCancel(t *testing.T) { var wg sync.WaitGroup wg.Go(func() { - resp, err := call.Do(ctx) require.Nil(t, resp) require.Error(t, err) @@ -83,7 +82,6 @@ func TestCallRetryCancel(t *testing.T) { var wg sync.WaitGroup wg.Go(func() { - resp, err := call.Do(ctx) require.Nil(t, resp) require.Error(t, err) diff --git a/engine/pkg/containers/slice_queue_test.go b/engine/pkg/containers/slice_queue_test.go index 269e8f18e1..5626f9536e 100644 --- a/engine/pkg/containers/slice_queue_test.go +++ b/engine/pkg/containers/slice_queue_test.go @@ -103,14 +103,12 @@ func TestSliceQueueConcurrentWriteAndRead(t *testing.T) { q := NewSliceQueue[int]() var wg sync.WaitGroup wg.Go(func() { - for i := range numElems { q.Push(i) } }) wg.Go(func() { - counter := 0 for { <-q.C diff --git a/engine/pkg/errctx/center_test.go b/engine/pkg/errctx/center_test.go index 50d5e14b79..a7b98a8a6a 100644 --- a/engine/pkg/errctx/center_test.go +++ b/engine/pkg/errctx/center_test.go @@ -28,7 +28,6 @@ func TestErrCenterMultipleErrCtx(t *testing.T) { var wg sync.WaitGroup for range 10 { wg.Go(func() { - ctx, cancel := center.WithCancelOnFirstError(context.Background()) defer cancel() <-ctx.Done() @@ -53,7 +52,6 @@ func TestErrCenterSingleErrCtx(t *testing.T) { var wg sync.WaitGroup for range 10 { wg.Go(func() { - <-ctx.Done() require.Error(t, ctx.Err()) require.EqualError(t, ctx.Err(), "fake error") diff --git a/engine/pkg/externalresource/integration_test/mock_cluster.go b/engine/pkg/externalresource/integration_test/mock_cluster.go index 5d4987290d..9eda0b1060 100644 --- a/engine/pkg/externalresource/integration_test/mock_cluster.go +++ b/engine/pkg/externalresource/integration_test/mock_cluster.go @@ -83,14 +83,12 @@ func (c *mockCluster) Start(t *testing.T) { c.cancel = cancel c.wg.Go(func() { - err := c.gcCoordinator.Run(ctx) require.Error(t, err) require.True(t, errors.Is(err, context.Canceled)) }) c.wg.Go(func() { - err := c.gcRunner.Run(ctx) require.Error(t, err) require.True(t, errors.Is(err, context.Canceled)) diff --git a/engine/pkg/externalresource/manager/gc_coordinator_test.go b/engine/pkg/externalresource/manager/gc_coordinator_test.go index 330f44f03c..6d009c4896 100644 --- a/engine/pkg/externalresource/manager/gc_coordinator_test.go +++ b/engine/pkg/externalresource/manager/gc_coordinator_test.go @@ -68,7 +68,6 @@ func newGCTestHelper() *gcTestHelper { func (h *gcTestHelper) Start() { h.wg.Go(func() { - h.errCh <- h.Coord.Run(h.ctx) }) } diff --git a/engine/pkg/externalresource/manager/gc_runner_test.go b/engine/pkg/externalresource/manager/gc_runner_test.go index da186185ee..63df348e19 100644 --- a/engine/pkg/externalresource/manager/gc_runner_test.go +++ b/engine/pkg/externalresource/manager/gc_runner_test.go @@ -78,7 +78,6 @@ func newGCRunnerTestHelperWithMeta(meta pkgOrm.ResourceClient) *gcRunnerTestHelp func (h *gcRunnerTestHelper) Start() { h.wg.Go(func() { - h.errCh <- h.Runner.Run(h.ctx) }) } diff --git a/engine/pkg/notifier/notifier_test.go b/engine/pkg/notifier/notifier_test.go index a2ab27b6e7..cf4c36b080 100644 --- a/engine/pkg/notifier/notifier_test.go +++ b/engine/pkg/notifier/notifier_test.go @@ -36,7 +36,6 @@ func TestNotifierBasics(t *testing.T) { for range numReceivers { wg.Go(func() { - r := n.NewReceiver() defer r.Close() @@ -78,7 +77,6 @@ func TestNotifierClose(t *testing.T) { for range numReceivers { wg.Go(func() { - r := n.NewReceiver() defer r.Close() diff --git a/engine/servermaster/executor_manager.go b/engine/servermaster/executor_manager.go index 5a0dd26a4c..81b66256de 100644 --- a/engine/servermaster/executor_manager.go +++ b/engine/servermaster/executor_manager.go @@ -107,7 +107,6 @@ func (e *ExecutorManagerImpl) removeExecutorLocked(id model.ExecutorID) error { // We use ttl mechanism to manage the executor's life cycle. So we can tolerate // that a tombstone executor may be left in the database. e.wg.Go(func() { - ctx, cancel := context.WithTimeout(context.Background(), time.Second*5) defer cancel() diff --git a/engine/servermaster/serverutil/watch_executors_test.go b/engine/servermaster/serverutil/watch_executors_test.go index 2bd7adf15a..a4ac06b0e6 100644 --- a/engine/servermaster/serverutil/watch_executors_test.go +++ b/engine/servermaster/serverutil/watch_executors_test.go @@ -129,7 +129,6 @@ func TestWatchExecutors(t *testing.T) { var wg sync.WaitGroup wg.Go(func() { - err := WatchExecutors(ctx, watcher, user) require.ErrorIs(t, err, context.Canceled) }) From b07842bd858597156593e15449b87272b8340e5e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dani=C3=ABl=20van=20Eeden?= Date: Thu, 25 Jun 2026 09:03:37 +0200 Subject: [PATCH 3/3] Update based on review --- engine/jobmaster/dm/ddl_coordinator_test.go | 7 +++---- engine/pkg/externalresource/manager/test_utils.go | 6 ++---- engine/pkg/meta/model/common.go | 2 +- 3 files changed, 6 insertions(+), 9 deletions(-) diff --git a/engine/jobmaster/dm/ddl_coordinator_test.go b/engine/jobmaster/dm/ddl_coordinator_test.go index bc7dde147f..bba5007878 100644 --- a/engine/jobmaster/dm/ddl_coordinator_test.go +++ b/engine/jobmaster/dm/ddl_coordinator_test.go @@ -842,11 +842,10 @@ func genCreateStmt(cols ...string) string { var str strings.Builder str.WriteString("CREATE TABLE tbl(") for idx, col := range cols { - if idx == 0 { - str.WriteString(col) - } else { - str.WriteString(", " + col) + if idx != 0 { + str.WriteString(", ") } + str.WriteString(col) } str.WriteString(")") return str.String() diff --git a/engine/pkg/externalresource/manager/test_utils.go b/engine/pkg/externalresource/manager/test_utils.go index 52d1337906..f8aeba52e4 100644 --- a/engine/pkg/externalresource/manager/test_utils.go +++ b/engine/pkg/externalresource/manager/test_utils.go @@ -99,8 +99,7 @@ func (p *MockExecutorInfoProvider) WatchExecutors( p.mu.Lock() defer p.mu.Unlock() - executors := make(map[model.ExecutorID]string, len(p.executorSet)) - maps.Copy(executors, p.executorSet) + executors := maps.Clone(p.executorSet) return executors, p.notifier.NewReceiver(), nil } @@ -155,8 +154,7 @@ func (jp *MockJobStatusProvider) WatchJobStatuses( jp.mu.Lock() defer jp.mu.Unlock() - snapCopy := make(JobStatusesSnapshot, len(jp.jobInfos)) - maps.Copy(snapCopy, jp.jobInfos) + snapCopy := maps.Clone(jp.jobInfos) return snapCopy, jp.notifier.NewReceiver(), nil } diff --git a/engine/pkg/meta/model/common.go b/engine/pkg/meta/model/common.go index 537e78c6c5..6527943994 100644 --- a/engine/pkg/meta/model/common.go +++ b/engine/pkg/meta/model/common.go @@ -82,7 +82,7 @@ type GetResponse struct { // String only for debug func (resp *GetResponse) String() string { var s strings.Builder - s.WriteString(fmt.Sprintf("header:[%s];kvs:[", resp.Header)) + fmt.Fprintf(&s, "header:[%s];kvs:[", resp.Header) for _, kv := range resp.Kvs { s.WriteString(kv.String()) }