diff --git a/indexing-service/src/main/java/org/apache/druid/indexing/overlord/supervisor/SupervisorManager.java b/indexing-service/src/main/java/org/apache/druid/indexing/overlord/supervisor/SupervisorManager.java index cfca0de4b60..f2c78a66b8a 100644 --- a/indexing-service/src/main/java/org/apache/druid/indexing/overlord/supervisor/SupervisorManager.java +++ b/indexing-service/src/main/java/org/apache/druid/indexing/overlord/supervisor/SupervisorManager.java @@ -133,7 +133,12 @@ public class SupervisorManager for (String id : supervisors.keySet()) { SupervisorSpec spec = supervisors.get(id); if (!(spec instanceof NoopSupervisorSpec)) { - createAndStartSupervisorInternal(spec, false); + try { + createAndStartSupervisorInternal(spec, false); + } + catch (Exception ex) { + log.error(ex, "Failed to start supervisor: [%s]", spec.getId()); + } } } diff --git a/indexing-service/src/test/java/org/apache/druid/indexing/overlord/supervisor/SupervisorManagerTest.java b/indexing-service/src/test/java/org/apache/druid/indexing/overlord/supervisor/SupervisorManagerTest.java index 85cfd95c726..7ae3b994ace 100644 --- a/indexing-service/src/test/java/org/apache/druid/indexing/overlord/supervisor/SupervisorManagerTest.java +++ b/indexing-service/src/test/java/org/apache/druid/indexing/overlord/supervisor/SupervisorManagerTest.java @@ -228,6 +228,26 @@ public class SupervisorManagerTest extends EasyMockSupport manager.start(); } + @Test + public void testStartIndividualSupervisorsFailStart() + { + Map existingSpecs = ImmutableMap.of( + "id1", new TestSupervisorSpec("id1", supervisor1), + "id3", new TestSupervisorSpec("id3", supervisor3) + ); + + + EasyMock.expect(metadataSupervisorManager.getLatest()).andReturn(existingSpecs); + supervisor3.start(); + supervisor1.start(); + EasyMock.expectLastCall().andThrow(new RuntimeException("supervisor explosion")); + replayAll(); + + manager.start(); + + // if we get here, we are properly insulated from exploding supervisors + } + @Test public void testStopThrowsException() {