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]