Search in sources :

Example 6 with BlobChangingCallback

use of org.apache.storm.localizer.BlobChangingCallback in project storm by apache.

the class SlotTest method testResourcesChangedFiltered.

@Test
public void testResourcesChangedFiltered() throws Exception {
    try (SimulatedTime t = new SimulatedTime(1010)) {
        int port = 8080;
        String cTopoId = "CURRENT";
        List<ExecutorInfo> cExecList = mkExecutorInfoList(1, 2, 3, 4, 5);
        LocalAssignment cAssignment = mkLocalAssignment(cTopoId, cExecList, mkWorkerResources(100.0, 100.0, 100.0));
        String otherTopoId = "OTHER";
        LocalAssignment otherAssignment = mkLocalAssignment(otherTopoId, cExecList, mkWorkerResources(100.0, 100.0, 100.0));
        BlobChangingCallback cb = mock(BlobChangingCallback.class);
        Container cContainer = mock(Container.class);
        LSWorkerHeartbeat chb = mkWorkerHB(cTopoId, port, cExecList, Time.currentTimeSecs());
        when(cContainer.readHeartbeat()).thenReturn(chb);
        when(cContainer.areAllProcessesDead()).thenReturn(false, false, true);
        AsyncLocalizer localizer = mock(AsyncLocalizer.class);
        Container nContainer = mock(Container.class);
        LocalState state = mock(LocalState.class);
        ContainerLauncher containerLauncher = mock(ContainerLauncher.class);
        when(containerLauncher.launchContainer(port, cAssignment, state)).thenReturn(nContainer);
        when(nContainer.readHeartbeat()).thenReturn(chb, chb);
        ISupervisor iSuper = mock(ISupervisor.class);
        long heartbeatTimeoutMs = 5000;
        StaticState staticState = new StaticState(localizer, heartbeatTimeoutMs, 120_000, 1000, 1000, containerLauncher, "localhost", port, iSuper, state, cb, null, null, new SlotMetrics(new StormMetricsRegistry()));
        Set<Slot.BlobChanging> changing = new HashSet<>();
        LocallyCachedBlob stormJar = mock(LocallyCachedBlob.class);
        GoodToGo.GoodToGoLatch stormJarLatch = mock(GoodToGo.GoodToGoLatch.class);
        CompletableFuture<Void> stormJarLatchFuture = mock(CompletableFuture.class);
        when(stormJarLatch.countDown()).thenReturn(stormJarLatchFuture);
        changing.add(new Slot.BlobChanging(cAssignment, stormJar, stormJarLatch));
        Set<Slot.BlobChanging> desired = new HashSet<>(changing);
        LocallyCachedBlob otherJar = mock(LocallyCachedBlob.class);
        GoodToGo.GoodToGoLatch otherJarLatch = mock(GoodToGo.GoodToGoLatch.class);
        changing.add(new Slot.BlobChanging(otherAssignment, otherJar, otherJarLatch));
        SlotMetrics slotMetrics = new SlotMetrics(new StormMetricsRegistry());
        DynamicState dynamicState = new DynamicState(cAssignment, cContainer, cAssignment, slotMetrics).withChangingBlobs(changing);
        DynamicState nextState = Slot.stateMachineStep(dynamicState, staticState);
        assertEquals(MachineState.KILL_BLOB_UPDATE, nextState.state);
        verify(iSuper).killedWorker(port);
        verify(cContainer).kill();
        verify(localizer, never()).requestDownloadTopologyBlobs(any(), anyInt(), any());
        verify(stormJarLatch, never()).countDown();
        verify(otherJarLatch, times(1)).countDown();
        assertNull(nextState.pendingDownload);
        assertNull(nextState.pendingLocalization);
        assertEquals(desired, nextState.changingBlobs);
        assertTrue(nextState.pendingChangingBlobs.isEmpty());
        assertNull(nextState.pendingChangingBlobsAssignment);
        assertThat(Time.currentTimeMillis(), greaterThan(1000L));
        nextState = Slot.stateMachineStep(nextState, staticState);
        assertEquals(MachineState.KILL_BLOB_UPDATE, nextState.state);
        verify(cContainer).forceKill();
        assertNull(nextState.pendingDownload);
        assertNull(nextState.pendingLocalization);
        assertEquals(desired, nextState.changingBlobs);
        assertTrue(nextState.pendingChangingBlobs.isEmpty());
        assertNull(nextState.pendingChangingBlobsAssignment);
        assertThat(Time.currentTimeMillis(), greaterThan(2000L));
        nextState = Slot.stateMachineStep(nextState, staticState);
        assertEquals(MachineState.WAITING_FOR_BLOB_UPDATE, nextState.state);
        verify(cContainer).cleanUp();
        assertThat(Time.currentTimeMillis(), greaterThan(2000L));
        nextState = Slot.stateMachineStep(nextState, staticState);
        verify(stormJarLatchFuture).get(anyLong(), any());
        verify(containerLauncher).launchContainer(port, cAssignment, state);
        assertEquals(MachineState.WAITING_FOR_WORKER_START, nextState.state);
        assertNull(nextState.pendingChangingBlobsAssignment);
        assertTrue(nextState.pendingChangingBlobs.isEmpty());
        assertSame(cAssignment, nextState.currentAssignment);
        assertSame(nContainer, nextState.container);
        assertThat(Time.currentTimeMillis(), greaterThan(2000L));
        assertThat(Time.currentTimeMillis(), lessThan(heartbeatTimeoutMs));
        nextState = Slot.stateMachineStep(nextState, staticState);
        assertEquals(MachineState.RUNNING, nextState.state);
        assertNull(nextState.pendingChangingBlobsAssignment);
        assertTrue(nextState.pendingChangingBlobs.isEmpty());
        assertSame(cAssignment, nextState.currentAssignment);
        assertSame(nContainer, nextState.container);
        assertTrue(Time.currentTimeMillis() > 2000);
        nextState = Slot.stateMachineStep(nextState, staticState);
        assertEquals(MachineState.RUNNING, nextState.state);
        assertNull(nextState.pendingChangingBlobsAssignment);
        assertTrue(nextState.pendingChangingBlobs.isEmpty());
        assertSame(cAssignment, nextState.currentAssignment);
        assertSame(nContainer, nextState.container);
        assertTrue(Time.currentTimeMillis() > 3000);
        nextState = Slot.stateMachineStep(nextState, staticState);
        assertEquals(MachineState.RUNNING, nextState.state);
        assertNull(nextState.pendingChangingBlobsAssignment);
        assertTrue(nextState.pendingChangingBlobs.isEmpty());
        assertSame(cAssignment, nextState.currentAssignment);
        assertSame(nContainer, nextState.container);
        assertTrue(Time.currentTimeMillis() > 4000);
    }
}
Also used : SimulatedTime(org.apache.storm.utils.Time.SimulatedTime) StormMetricsRegistry(org.apache.storm.metric.StormMetricsRegistry) LocallyCachedBlob(org.apache.storm.localizer.LocallyCachedBlob) ISupervisor(org.apache.storm.scheduler.ISupervisor) BlobChangingCallback(org.apache.storm.localizer.BlobChangingCallback) ExecutorInfo(org.apache.storm.generated.ExecutorInfo) GoodToGo(org.apache.storm.localizer.GoodToGo) LocalState(org.apache.storm.utils.LocalState) HashSet(java.util.HashSet) StaticState(org.apache.storm.daemon.supervisor.Slot.StaticState) LSWorkerHeartbeat(org.apache.storm.generated.LSWorkerHeartbeat) LocalAssignment(org.apache.storm.generated.LocalAssignment) AsyncLocalizer(org.apache.storm.localizer.AsyncLocalizer) DynamicState(org.apache.storm.daemon.supervisor.Slot.DynamicState) Test(org.junit.Test)

Example 7 with BlobChangingCallback

use of org.apache.storm.localizer.BlobChangingCallback in project storm by apache.

the class SlotTest method testErrorHandlingWhenLocalizationFails.

@Test
public void testErrorHandlingWhenLocalizationFails() throws Exception {
    try (SimulatedTime t = new SimulatedTime(1010)) {
        int port = 8080;
        String topoId = "NEW";
        List<ExecutorInfo> execList = mkExecutorInfoList(1, 2, 3, 4, 5);
        LocalAssignment newAssignment = mkLocalAssignment(topoId, execList, mkWorkerResources(100.0, 100.0, 100.0));
        AsyncLocalizer localizer = mock(AsyncLocalizer.class);
        BlobChangingCallback cb = mock(BlobChangingCallback.class);
        Container container = mock(Container.class);
        LocalState state = mock(LocalState.class);
        ContainerLauncher containerLauncher = mock(ContainerLauncher.class);
        when(containerLauncher.launchContainer(port, newAssignment, state)).thenReturn(container);
        LSWorkerHeartbeat hb = mkWorkerHB(topoId, port, execList, Time.currentTimeSecs());
        when(container.readHeartbeat()).thenReturn(hb, hb);
        @SuppressWarnings("unchecked") CompletableFuture<Void> blobFuture = mock(CompletableFuture.class);
        CompletableFuture<Void> secondBlobFuture = mock(CompletableFuture.class);
        when(secondBlobFuture.get(anyLong(), any())).thenThrow(new ExecutionException(new RuntimeException("Localization failure")));
        CompletableFuture<Void> thirdBlobFuture = mock(CompletableFuture.class);
        when(localizer.requestDownloadTopologyBlobs(newAssignment, port, cb)).thenReturn(blobFuture).thenReturn(secondBlobFuture).thenReturn(thirdBlobFuture);
        ISupervisor iSuper = mock(ISupervisor.class);
        SlotMetrics slotMetrics = new SlotMetrics(new StormMetricsRegistry());
        StaticState staticState = new StaticState(localizer, 5000, 120000, 1000, 1000, containerLauncher, "localhost", port, iSuper, state, cb, null, null, slotMetrics);
        DynamicState dynamicState = new DynamicState(null, null, null, slotMetrics).withNewAssignment(newAssignment);
        DynamicState nextState = Slot.stateMachineStep(dynamicState, staticState);
        verify(localizer).requestDownloadTopologyBlobs(newAssignment, port, cb);
        assertEquals(MachineState.WAITING_FOR_BLOB_LOCALIZATION, nextState.state);
        assertSame("pendingDownload not set properly", blobFuture, nextState.pendingDownload);
        assertEquals(newAssignment, nextState.pendingLocalization);
        assertEquals(0, Time.currentTimeMillis());
        // Assignment has changed
        nextState = Slot.stateMachineStep(nextState.withNewAssignment(null), staticState);
        assertThat(nextState.state, is(MachineState.EMPTY));
        assertThat(nextState.pendingChangingBlobs, is(Collections.emptySet()));
        assertThat(nextState.pendingChangingBlobsAssignment, nullValue());
        assertThat(nextState.pendingLocalization, nullValue());
        assertThat(nextState.pendingDownload, nullValue());
        clearInvocations(localizer);
        nextState = Slot.stateMachineStep(dynamicState.withNewAssignment(newAssignment), staticState);
        verify(localizer).requestDownloadTopologyBlobs(newAssignment, port, cb);
        assertEquals(MachineState.WAITING_FOR_BLOB_LOCALIZATION, nextState.state);
        assertSame("pendingDownload not set properly", secondBlobFuture, nextState.pendingDownload);
        assertEquals(newAssignment, nextState.pendingLocalization);
        // Error occurs, but assignment has not changed
        clearInvocations(localizer);
        nextState = Slot.stateMachineStep(nextState, staticState);
        verify(localizer).requestDownloadTopologyBlobs(newAssignment, port, cb);
        assertEquals(MachineState.WAITING_FOR_BLOB_LOCALIZATION, nextState.state);
        assertSame("pendingDownload not set properly", thirdBlobFuture, nextState.pendingDownload);
        assertEquals(newAssignment, nextState.pendingLocalization);
        assertThat(Time.currentTimeMillis(), greaterThan(3L));
        nextState = Slot.stateMachineStep(nextState, staticState);
        verify(thirdBlobFuture).get(1000, TimeUnit.MILLISECONDS);
        verify(containerLauncher).launchContainer(port, newAssignment, state);
        assertEquals(MachineState.WAITING_FOR_WORKER_START, nextState.state);
        assertSame("pendingDownload is not null", null, nextState.pendingDownload);
        assertSame(null, nextState.pendingLocalization);
        assertSame(newAssignment, nextState.currentAssignment);
        assertSame(container, nextState.container);
    }
}
Also used : SimulatedTime(org.apache.storm.utils.Time.SimulatedTime) StormMetricsRegistry(org.apache.storm.metric.StormMetricsRegistry) StaticState(org.apache.storm.daemon.supervisor.Slot.StaticState) ISupervisor(org.apache.storm.scheduler.ISupervisor) LSWorkerHeartbeat(org.apache.storm.generated.LSWorkerHeartbeat) BlobChangingCallback(org.apache.storm.localizer.BlobChangingCallback) ExecutorInfo(org.apache.storm.generated.ExecutorInfo) LocalAssignment(org.apache.storm.generated.LocalAssignment) AsyncLocalizer(org.apache.storm.localizer.AsyncLocalizer) DynamicState(org.apache.storm.daemon.supervisor.Slot.DynamicState) LocalState(org.apache.storm.utils.LocalState) ExecutionException(java.util.concurrent.ExecutionException) Test(org.junit.Test)

Example 8 with BlobChangingCallback

use of org.apache.storm.localizer.BlobChangingCallback in project storm by apache.

the class SlotTest method testRelaunch.

@Test
public void testRelaunch() throws Exception {
    try (SimulatedTime t = new SimulatedTime(1010)) {
        int port = 8080;
        String topoId = "CURRENT";
        List<ExecutorInfo> execList = mkExecutorInfoList(1, 2, 3, 4, 5);
        LocalAssignment assignment = mkLocalAssignment(topoId, execList, mkWorkerResources(100.0, 100.0, 100.0));
        AsyncLocalizer localizer = mock(AsyncLocalizer.class);
        BlobChangingCallback cb = mock(BlobChangingCallback.class);
        Container container = mock(Container.class);
        ContainerLauncher containerLauncher = mock(ContainerLauncher.class);
        LSWorkerHeartbeat oldhb = mkWorkerHB(topoId, port, execList, Time.currentTimeSecs() - 10);
        LSWorkerHeartbeat goodhb = mkWorkerHB(topoId, port, execList, Time.currentTimeSecs());
        when(container.readHeartbeat()).thenReturn(oldhb, oldhb, goodhb, goodhb);
        when(container.areAllProcessesDead()).thenReturn(false, false, true);
        ISupervisor iSuper = mock(ISupervisor.class);
        LocalState state = mock(LocalState.class);
        SlotMetrics slotMetrics = new SlotMetrics(new StormMetricsRegistry());
        StaticState staticState = new StaticState(localizer, 5000, 120000, 1000, 1000, containerLauncher, "localhost", port, iSuper, state, cb, null, null, slotMetrics);
        DynamicState dynamicState = new DynamicState(assignment, container, assignment, slotMetrics);
        DynamicState nextState = Slot.stateMachineStep(dynamicState, staticState);
        assertEquals(MachineState.KILL_AND_RELAUNCH, nextState.state);
        verify(container).kill();
        assertTrue(Time.currentTimeMillis() > 1000);
        nextState = Slot.stateMachineStep(nextState, staticState);
        assertEquals(MachineState.KILL_AND_RELAUNCH, nextState.state);
        verify(container).forceKill();
        assertTrue(Time.currentTimeMillis() > 2000);
        nextState = Slot.stateMachineStep(nextState, staticState);
        assertEquals(MachineState.WAITING_FOR_WORKER_START, nextState.state);
        verify(container).relaunch();
        nextState = Slot.stateMachineStep(nextState, staticState);
        assertEquals(MachineState.WAITING_FOR_WORKER_START, nextState.state);
        assertTrue(Time.currentTimeMillis() > 3000);
        nextState = Slot.stateMachineStep(nextState, staticState);
        assertEquals(MachineState.RUNNING, nextState.state);
    }
}
Also used : SimulatedTime(org.apache.storm.utils.Time.SimulatedTime) StormMetricsRegistry(org.apache.storm.metric.StormMetricsRegistry) StaticState(org.apache.storm.daemon.supervisor.Slot.StaticState) ISupervisor(org.apache.storm.scheduler.ISupervisor) LSWorkerHeartbeat(org.apache.storm.generated.LSWorkerHeartbeat) BlobChangingCallback(org.apache.storm.localizer.BlobChangingCallback) ExecutorInfo(org.apache.storm.generated.ExecutorInfo) LocalAssignment(org.apache.storm.generated.LocalAssignment) AsyncLocalizer(org.apache.storm.localizer.AsyncLocalizer) DynamicState(org.apache.storm.daemon.supervisor.Slot.DynamicState) LocalState(org.apache.storm.utils.LocalState) Test(org.junit.Test)

Aggregations

DynamicState (org.apache.storm.daemon.supervisor.Slot.DynamicState)8 StaticState (org.apache.storm.daemon.supervisor.Slot.StaticState)8 AsyncLocalizer (org.apache.storm.localizer.AsyncLocalizer)8 BlobChangingCallback (org.apache.storm.localizer.BlobChangingCallback)8 StormMetricsRegistry (org.apache.storm.metric.StormMetricsRegistry)8 ISupervisor (org.apache.storm.scheduler.ISupervisor)8 LocalState (org.apache.storm.utils.LocalState)8 SimulatedTime (org.apache.storm.utils.Time.SimulatedTime)8 Test (org.junit.Test)8 ExecutorInfo (org.apache.storm.generated.ExecutorInfo)7 LSWorkerHeartbeat (org.apache.storm.generated.LSWorkerHeartbeat)7 LocalAssignment (org.apache.storm.generated.LocalAssignment)7 HashSet (java.util.HashSet)2 ExecutionException (java.util.concurrent.ExecutionException)1 TopoProfileAction (org.apache.storm.daemon.supervisor.Slot.TopoProfileAction)1 NodeInfo (org.apache.storm.generated.NodeInfo)1 ProfileRequest (org.apache.storm.generated.ProfileRequest)1 GoodToGo (org.apache.storm.localizer.GoodToGo)1 LocallyCachedBlob (org.apache.storm.localizer.LocallyCachedBlob)1