justinmclean opened a new issue, #10272:
URL: https://github.com/apache/gravitino/issues/10272

   ### What would you like to be improved?
   
   JobManager.close() calls jobExecutor.close() before shutting down 
statusPullExecutor and cleanUpExecutor. If jobExecutor.close() throws 
IOException, method execution exits early, and both schedulers are left 
running. This can leak background threads during shutdown, causing incomplete 
cleanup.
   
   ### How should we improve?
   
   Make shutdown resilient by guaranteeing executor shutdown in a finally 
block. Capture any IOException from jobExecutor.close(), run 
statusPullExecutor.shutdownNow() and cleanUpExecutor.shutdownNow() 
unconditionally, then rethrow the original exception . This preserves failure 
signaling while ensuring cleanup always runs.
   
   Here's a test to help:
   ```
   @Test
   public void testCloseShouldShutdownExecutorsWhenJobExecutorCloseFails() 
throws IOException {
     JobExecutor failingJobExecutor = Mockito.mock(JobExecutor.class);
     doThrow(new IOException("close failed")).when(failingJobExecutor).close();
   
     JobManager manager = new JobManager(config, entityStore, idGenerator, 
failingJobExecutor);
     try {
       Assertions.assertThrows(IOException.class, manager::close);
       Assertions.assertTrue(manager.statusPullExecutor.isShutdown());
       Assertions.assertTrue(manager.cleanUpExecutor.isShutdown());
     } finally {
       manager.statusPullExecutor.shutdownNow();
       manager.cleanUpExecutor.shutdownNow();
     }
   }
   ```


-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: [email protected]

For queries about this service, please contact Infrastructure at:
[email protected]

Reply via email to