@LifecycleStart public void start() { Preconditions.checkState(!started, "SupervisorManager already started"); log.info("Loading stored supervisors from database"); synchronized (lock) { Map<String, SupervisorSpec> supervisors = metadataSupervisorManager.getLatest(); for (String id : supervisors.keySet()) { SupervisorSpec spec = supervisors.get(id); if (!(spec instanceof NoopSupervisorSpec)) { try { createAndStartSupervisorInternal(spec, false); } catch (Exception ex) { log.error(ex, "Failed to start supervisor: [%s]", spec.getId()); } } } started = true; } }
public Map<String, List<VersionedSupervisorSpec>> getSupervisorHistory() { return metadataSupervisorManager.getAll(); }
/** * Stops a supervisor with a given id and then removes it from the list. * <p/> * Caller should have acquired [lock] before invoking this method to avoid contention with other threads that may be * starting, stopping, suspending and resuming supervisors. * * @return true if a supervisor was stopped, false if there was no supervisor with this id */ private boolean possiblyStopAndRemoveSupervisorInternal(String id, boolean writeTombstone) { Pair<Supervisor, SupervisorSpec> pair = supervisors.get(id); if (pair == null) { return false; } if (writeTombstone) { metadataSupervisorManager.insert( id, new NoopSupervisorSpec(null, pair.rhs.getDataSources()) ); // where NoopSupervisorSpec is a tombstone } pair.lhs.stop(true); supervisors.remove(id); return true; }
EasyMock.expect(metadataSupervisorManager.getLatest()).andReturn(existingSpecs); metadataSupervisorManager.insert("id1", spec); supervisor3.start(); supervisor1.start(); metadataSupervisorManager.insert("id1", spec2); supervisor2.start(); supervisor1.stop(true); metadataSupervisorManager.insert(eq("id1"), anyObject(NoopSupervisorSpec.class)); supervisor2.stop(true); replayAll();
EasyMock.expect(metadataSupervisorManager.getLatest()).andReturn(existingSpecs); metadataSupervisorManager.insert("id1", spec); supervisor3.start(); supervisor1.start(); metadataSupervisorManager.insert(eq("id1"), capture(capturedInsert)); supervisor2.start(); supervisor1.stop(true); metadataSupervisorManager.insert(eq("id1"), capture(capturedInsert)); supervisor2.stop(true); supervisor1.start(); metadataSupervisorManager.insert(eq("id1"), anyObject(NoopSupervisorSpec.class)); supervisor1.stop(true); replayAll();
exec = null; clearTasks(); if (!(metadataSupervisorManager.getLatest().get(supervisorId) instanceof MaterializedViewSupervisorSpec)) { clearSegments(); synchronized (taskLock) { clearTasks(); if (!(metadataSupervisorManager.getLatest().get(supervisorId) instanceof MaterializedViewSupervisorSpec)) { clearSegments();
@Test public void testGetSupervisorHistory() { Map<String, List<VersionedSupervisorSpec>> supervisorHistory = ImmutableMap.of(); EasyMock.expect(metadataSupervisorManager.getAll()).andReturn(supervisorHistory); replayAll(); Map<String, List<VersionedSupervisorSpec>> history = manager.getSupervisorHistory(); verifyAll(); Assert.assertEquals(supervisorHistory, history); }
@Test public void testStartAlreadyStarted() { EasyMock.expect(metadataSupervisorManager.getLatest()).andReturn(ImmutableMap.of()); replayAll(); exception.expect(IllegalStateException.class); manager.start(); manager.start(); }
/** * Stops a supervisor with a given id and then removes it from the list. * <p/> * Caller should have acquired [lock] before invoking this method to avoid contention with other threads that may be * starting, stopping, suspending and resuming supervisors. * * @return true if a supervisor was stopped, false if there was no supervisor with this id */ private boolean possiblyStopAndRemoveSupervisorInternal(String id, boolean writeTombstone) { Pair<Supervisor, SupervisorSpec> pair = supervisors.get(id); if (pair == null) { return false; } if (writeTombstone) { metadataSupervisorManager.insert(id, new NoopSupervisorSpec(null, pair.rhs.getDataSources())); // where NoopSupervisorSpec is a tombstone } pair.lhs.stop(true); supervisors.remove(id); return true; }
public Map<String, List<VersionedSupervisorSpec>> getSupervisorHistory() { return metadataSupervisorManager.getAll(); }
@Test public void testCreateOrUpdateAndStartSupervisorNullSpec() { EasyMock.expect(metadataSupervisorManager.getLatest()).andReturn(ImmutableMap.of()); replayAll(); exception.expect(NullPointerException.class); manager.start(); manager.createOrUpdateAndStartSupervisor(null); verifyAll(); }
@Test public void testStopAndRemoveSupervisorNullSpecId() { EasyMock.expect(metadataSupervisorManager.getLatest()).andReturn(ImmutableMap.of()); replayAll(); exception.expect(NullPointerException.class); manager.start(); manager.stopAndRemoveSupervisor(null); verifyAll(); }
@Test public void testCreateOrUpdateAndStartSupervisorNullSpecId() { EasyMock.expect(metadataSupervisorManager.getLatest()).andReturn(ImmutableMap.of()); replayAll(); exception.expect(NullPointerException.class); manager.start(); manager.createOrUpdateAndStartSupervisor(new TestSupervisorSpec(null, null)); verifyAll(); }
@Test public void testStartIndividualSupervisorsFailStart() { Map<String, SupervisorSpec> 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 testGetSupervisorStatus() { SupervisorReport<Void> report = new SupervisorReport<>("id1", DateTimes.nowUtc(), null); Map<String, SupervisorSpec> existingSpecs = ImmutableMap.of( "id1", new TestSupervisorSpec("id1", supervisor1) ); EasyMock.expect(metadataSupervisorManager.getLatest()).andReturn(existingSpecs); supervisor1.start(); EasyMock.expect(supervisor1.getStatus()).andReturn(report); replayAll(); manager.start(); Assert.assertEquals(Optional.absent(), manager.getSupervisorStatus("non-existent-id")); Assert.assertEquals(report, manager.getSupervisorStatus("id1").get()); verifyAll(); }
@Test public void testStopThrowsException() { Map<String, SupervisorSpec> existingSpecs = ImmutableMap.of( "id1", new TestSupervisorSpec("id1", supervisor1) ); EasyMock.expect(metadataSupervisorManager.getLatest()).andReturn(existingSpecs); supervisor1.start(); supervisor1.stop(false); EasyMock.expectLastCall().andThrow(new RuntimeException("RTE")); replayAll(); manager.start(); manager.stop(); verifyAll(); }
@Test public void testResetSupervisor() { Map<String, SupervisorSpec> existingSpecs = ImmutableMap.of( "id1", new TestSupervisorSpec("id1", supervisor1) ); EasyMock.expect(metadataSupervisorManager.getLatest()).andReturn(existingSpecs); supervisor1.start(); supervisor1.reset(EasyMock.anyObject(DataSourceMetadata.class)); replayAll(); manager.start(); Assert.assertTrue("resetValidSupervisor", manager.resetSupervisor("id1", null)); Assert.assertFalse("resetInvalidSupervisor", manager.resetSupervisor("nobody_home", null)); verifyAll(); }
@LifecycleStart public void start() { Preconditions.checkState(!started, "SupervisorManager already started"); log.info("Loading stored supervisors from database"); synchronized (lock) { Map<String, SupervisorSpec> supervisors = metadataSupervisorManager.getLatest(); for (String id : supervisors.keySet()) { SupervisorSpec spec = supervisors.get(id); if (!(spec instanceof NoopSupervisorSpec)) { try { createAndStartSupervisorInternal(spec, false); } catch (Exception ex) { log.error(ex, "Failed to start supervisor: [%s]", spec.getId()); } } } started = true; } }