diff --git a/dm/syncer/data_validator.go b/dm/syncer/data_validator.go index aea64576e4..cf9fe0c80b 100644 --- a/dm/syncer/data_validator.go +++ b/dm/syncer/data_validator.go @@ -230,7 +230,6 @@ func NewContinuousDataValidator(cfg *config.SubTaskConfig, syncerObj *Syncer, st cfg: cfg, syncer: syncerObj, startWithSubtask: startWithSubtask, - vmetric: metrics.NewValidatorMetrics(cfg.Name, cfg.SourceID), } v.L = log.With(zap.String("task", cfg.Name), zap.String("unit", "continuous validator")) @@ -268,6 +267,7 @@ func (v *DataValidator) initialize() error { v.ctx, v.cancel = context.WithCancel(context.Background()) v.tctx = tcontext.NewContext(v.ctx, v.L) v.reset() + v.vmetric = metrics.NewValidatorMetrics(v.cfg.Name, v.cfg.SourceID) newCtx, cancelFunc := v.tctx.WithTimeout(unit.DefaultInitTimeout) defer cancelFunc() diff --git a/dm/syncer/data_validator_test.go b/dm/syncer/data_validator_test.go index 27dfc3e72d..b43f138795 100644 --- a/dm/syncer/data_validator_test.go +++ b/dm/syncer/data_validator_test.go @@ -104,10 +104,12 @@ func TestValidatorStartStopAndInitialize(t *testing.T) { // validator already running validator := NewContinuousDataValidator(cfg, syncerObj, false) + require.Nil(t, validator.vmetric) validator.stage = pb.Stage_Running validator.Start(pb.Stage_InvalidStage) // if validator already running, Start will return immediately, so we check validator.ctx which has not initialized. require.Nil(t, validator.ctx) + require.Nil(t, validator.vmetric) // failed to init cfg.From = dbconfig.DBConfig{ @@ -133,13 +135,22 @@ func TestValidatorStartStopAndInitialize(t *testing.T) { // normal start & stop validator = NewContinuousDataValidator(cfg, syncerObj, false) + require.Nil(t, validator.vmetric) validator.persistHelper.schemaInitialized.Store(true) validator.Start(pb.Stage_Running) defer validator.Stop() // in case assert failed before Stop + require.NotNil(t, validator.vmetric) + firstMetric := validator.vmetric require.Equal(t, pb.Stage_Running, validator.Stage()) require.True(t, validator.Started()) validator.Stop() require.Equal(t, pb.Stage_Stopped, validator.Stage()) + validator.Start(pb.Stage_Running) + require.Equal(t, pb.Stage_Running, validator.Stage()) + require.NotNil(t, validator.vmetric) + require.NotSame(t, firstMetric, validator.vmetric) + validator.Stop() + require.Equal(t, pb.Stage_Stopped, validator.Stage()) // stop before start, should not panic validator = NewContinuousDataValidator(cfg, syncerObj, false)