@@ -411,7 +411,9 @@ func TestTaskCancelledAfterHeartbeatTimeout(t *testing.T) {
411
411
tk .MustQuery ("select count(1) from mysql.tidb_ttl_task where status = 'running' and owner_id = 'task-manager-2'" ).Check (testkit .Rows ("4" ))
412
412
413
413
// Then m1 cannot update the heartbeat of its task
414
- require .Error (t , m1 .UpdateHeartBeat (context .Background (), se , now .Add (time .Hour )))
414
+ for i := 0 ; i < 4 ; i ++ {
415
+ require .Error (t , m1 .UpdateHeartBeatForTask (context .Background (), se , now .Add (time .Hour ), m1 .GetRunningTasks ()[i ]))
416
+ }
415
417
tk .MustQuery ("select owner_hb_time from mysql.tidb_ttl_task" ).Check (testkit .Rows (
416
418
now .Format (time .DateTime ),
417
419
now .Format (time .DateTime ),
@@ -420,7 +422,9 @@ func TestTaskCancelledAfterHeartbeatTimeout(t *testing.T) {
420
422
))
421
423
422
424
// m2 can successfully update the heartbeat
423
- require .NoError (t , m2 .UpdateHeartBeat (context .Background (), se , now .Add (time .Hour )))
425
+ for i := 0 ; i < 4 ; i ++ {
426
+ require .NoError (t , m2 .UpdateHeartBeatForTask (context .Background (), se , now .Add (time .Hour ), m2 .GetRunningTasks ()[i ]))
427
+ }
424
428
tk .MustQuery ("select owner_hb_time from mysql.tidb_ttl_task" ).Check (testkit .Rows (
425
429
now .Add (time .Hour ).Format (time .DateTime ),
426
430
now .Add (time .Hour ).Format (time .DateTime ),
@@ -452,3 +456,59 @@ func TestTaskCancelledAfterHeartbeatTimeout(t *testing.T) {
452
456
`finished {"total_rows":0,"success_rows":0,"error_rows":0,"scan_task_err":""} task-manager-2` ,
453
457
))
454
458
}
459
+
460
+ func TestHeartBeatErrorNotBlockOthers (t * testing.T ) {
461
+ store , dom := testkit .CreateMockStoreAndDomain (t )
462
+ pool := dom .SysSessionPool ()
463
+ waitAndStopTTLManager (t , dom )
464
+ tk := testkit .NewTestKit (t , store )
465
+ sessionFactory := sessionFactory (t , store )
466
+
467
+ tk .MustExec ("set global tidb_ttl_running_tasks = 32" )
468
+
469
+ tk .MustExec ("create table test.t(id int, created_at datetime) ttl=created_at + interval 1 day" )
470
+ testTable , err := dom .InfoSchema ().TableByName (model .NewCIStr ("test" ), model .NewCIStr ("t" ))
471
+ require .NoError (t , err )
472
+ for id := 0 ; id < 4 ; id ++ {
473
+ sql := fmt .Sprintf ("insert into mysql.tidb_ttl_task(job_id,table_id,scan_id,expire_time,created_time) values ('test-job', %d, %d, NOW() - INTERVAL 1 DAY, NOW())" , testTable .Meta ().ID , id )
474
+ tk .MustExec (sql )
475
+ }
476
+
477
+ se := sessionFactory ()
478
+ now := se .Now ()
479
+
480
+ isc := cache .NewInfoSchemaCache (time .Minute )
481
+ require .NoError (t , isc .Update (se ))
482
+ m := ttlworker .NewTaskManager (context .Background (), pool , isc , "task-manager-1" , store )
483
+ workers := []ttlworker.Worker {}
484
+ for j := 0 ; j < 4 ; j ++ {
485
+ scanWorker := ttlworker .NewMockScanWorker (t )
486
+ scanWorker .Start ()
487
+ workers = append (workers , scanWorker )
488
+ }
489
+ m .SetScanWorkers4Test (workers )
490
+ m .RescheduleTasks (se , now )
491
+
492
+ // All tasks should be scheduled to m1 and running
493
+ tk .MustQuery ("select count(1) from mysql.tidb_ttl_task where status = 'running' and owner_id = 'task-manager-1'" ).Check (testkit .Rows ("4" ))
494
+
495
+ // Mock the situation that the owner of task 0 has changed
496
+ tk .MustExec ("update mysql.tidb_ttl_task set owner_id = 'task-manager-2' where scan_id = 0" )
497
+ tk .MustQuery ("select count(1) from mysql.tidb_ttl_task where status = 'running' and owner_id = 'task-manager-1'" ).Check (testkit .Rows ("3" ))
498
+
499
+ now = now .Add (time .Hour )
500
+ require .Error (t , m .UpdateHeartBeatForTask (context .Background (), se , now , m .GetRunningTasks ()[0 ]))
501
+ for i := 1 ; i < 4 ; i ++ {
502
+ require .NoError (t , m .UpdateHeartBeatForTask (context .Background (), se , now , m .GetRunningTasks ()[i ]))
503
+ }
504
+
505
+ now = now .Add (time .Hour )
506
+ m .UpdateHeartBeat (context .Background (), se , now )
507
+ tk .MustQuery ("select count(1) from mysql.tidb_ttl_task where status = 'running' and owner_id = 'task-manager-1'" ).Check (testkit .Rows ("3" ))
508
+ tk .MustQuery ("select scan_id, owner_hb_time from mysql.tidb_ttl_task" ).Sort ().Check (testkit .Rows (
509
+ fmt .Sprintf ("0 %s" , now .Add (- 2 * time .Hour ).Format (time .DateTime )),
510
+ fmt .Sprintf ("1 %s" , now .Format (time .DateTime )),
511
+ fmt .Sprintf ("2 %s" , now .Format (time .DateTime )),
512
+ fmt .Sprintf ("3 %s" , now .Format (time .DateTime )),
513
+ ))
514
+ }
0 commit comments