@@ -387,4 +387,68 @@ public void testReplayUpdateLoadJobStateInfoRemovesExpiredJob(@Mocked GlobalStat
387387 // recover config
388388 Config .label_keep_max_second = origKeep ;
389389 }
390+
391+ @ Test
392+ public void testRemoveLoadJobsByDb (@ Mocked GlobalStateMgr globalStateMgr ,
393+ @ Injectable Database db1 ,
394+ @ Injectable Database db2 ) throws Exception {
395+ LoadMgr loadMgr = new LoadMgr (new LoadJobScheduler ());
396+
397+ // Create load jobs for database 1
398+ long dbId1 = 100L ;
399+ InsertLoadJob job1 = new InsertLoadJob ("label1" , dbId1 , 1L , System .currentTimeMillis (), "" , "" , null );
400+ job1 .id = 1001L ;
401+ job1 .state = JobState .FINISHED ;
402+ Deencapsulation .invoke (loadMgr , "addLoadJob" , job1 );
403+
404+ InsertLoadJob job2 = new InsertLoadJob ("label2" , dbId1 , 1L , System .currentTimeMillis (), "" , "" , null );
405+ job2 .id = 1002L ;
406+ job2 .state = JobState .LOADING ;
407+ Deencapsulation .invoke (loadMgr , "addLoadJob" , job2 );
408+
409+ // Create load jobs for database 2
410+ long dbId2 = 200L ;
411+ InsertLoadJob job3 = new InsertLoadJob ("label3" , dbId2 , 2L , System .currentTimeMillis (), "" , "" , null );
412+ job3 .id = 2001L ;
413+ job3 .state = JobState .FINISHED ;
414+ Deencapsulation .invoke (loadMgr , "addLoadJob" , job3 );
415+
416+ InsertLoadJob job4 = new InsertLoadJob ("label4" , dbId2 , 2L , System .currentTimeMillis (), "" , "" , null );
417+ job4 .id = 2002L ;
418+ job4 .state = JobState .CANCELLED ;
419+ Deencapsulation .invoke (loadMgr , "addLoadJob" , job4 );
420+
421+ // Verify all jobs are added
422+ Map <Long , LoadJob > idToLoadJob = Deencapsulation .getField (loadMgr , "idToLoadJob" );
423+ Map <Long , Map <String , List <LoadJob >>> dbIdToLabelToLoadJobs = Deencapsulation .getField (
424+ loadMgr , "dbIdToLabelToLoadJobs" );
425+
426+ Assertions .assertEquals (4 , idToLoadJob .size ());
427+ Assertions .assertTrue (dbIdToLabelToLoadJobs .containsKey (dbId1 ));
428+ Assertions .assertTrue (dbIdToLabelToLoadJobs .containsKey (dbId2 ));
429+ Assertions .assertEquals (2 , dbIdToLabelToLoadJobs .get (dbId1 ).size ());
430+ Assertions .assertEquals (2 , dbIdToLabelToLoadJobs .get (dbId2 ).size ());
431+
432+ // Remove all jobs for database 1
433+ loadMgr .removeLoadJobsByDb (dbId1 );
434+
435+ // Verify jobs for database 1 are removed
436+ Assertions .assertEquals (2 , idToLoadJob .size ());
437+ Assertions .assertFalse (idToLoadJob .containsKey (job1 .id ));
438+ Assertions .assertFalse (idToLoadJob .containsKey (job2 .id ));
439+ Assertions .assertTrue (idToLoadJob .containsKey (job3 .id ));
440+ Assertions .assertTrue (idToLoadJob .containsKey (job4 .id ));
441+
442+ // Verify database 1 is removed from dbIdToLabelToLoadJobs
443+ Assertions .assertFalse (dbIdToLabelToLoadJobs .containsKey (dbId1 ));
444+ Assertions .assertTrue (dbIdToLabelToLoadJobs .containsKey (dbId2 ));
445+
446+ // Remove all jobs for database 2
447+ loadMgr .removeLoadJobsByDb (dbId2 );
448+
449+ // Verify all jobs are removed
450+ Assertions .assertEquals (0 , idToLoadJob .size ());
451+ Assertions .assertFalse (dbIdToLabelToLoadJobs .containsKey (dbId2 ));
452+ Assertions .assertEquals (0 , dbIdToLabelToLoadJobs .size ());
453+ }
390454}
0 commit comments