Search in sources :

Example 1 with TaskCallbackFactory

use of org.apache.samza.task.TaskCallbackFactory in project samza by apache.

the class TestRunLoop method testExceptionIsPropagated.

@Test(expected = SamzaException.class)
public void testExceptionIsPropagated() {
    SystemConsumers consumerMultiplexer = mock(SystemConsumers.class);
    RunLoopTask task0 = getMockRunLoopTask(taskName0, ssp0);
    doAnswer(invocation -> {
        TaskCallbackFactory callbackFactory = invocation.getArgumentAt(2, TaskCallbackFactory.class);
        callbackFactory.createCallback().failure(new Exception("Intentional failure"));
        return null;
    }).when(task0).process(eq(envelope00), any(), any());
    Map<TaskName, RunLoopTask> tasks = ImmutableMap.of(taskName0, task0);
    int maxMessagesInFlight = 1;
    RunLoop runLoop = new RunLoop(tasks, executor, consumerMultiplexer, maxMessagesInFlight, windowMs, commitMs, callbackTimeoutMs, maxThrottlingDelayMs, maxIdleMs, containerMetrics, () -> 0L, false);
    when(consumerMultiplexer.choose(false)).thenReturn(envelope00).thenReturn(ssp0EndOfStream).thenReturn(null);
    runLoop.run();
}
Also used : SystemConsumers(org.apache.samza.system.SystemConsumers) TaskCallbackFactory(org.apache.samza.task.TaskCallbackFactory) SamzaException(org.apache.samza.SamzaException) Test(org.junit.Test)

Example 2 with TaskCallbackFactory

use of org.apache.samza.task.TaskCallbackFactory in project samza by apache.

the class TestRunLoop method testProcessCallbacksCompletedOutOfOrder.

@Test
public void testProcessCallbacksCompletedOutOfOrder() {
    int maxMessagesInFlight = 2;
    ExecutorService taskExecutor = Executors.newFixedThreadPool(1);
    SystemConsumers consumerMultiplexer = mock(SystemConsumers.class);
    OffsetManager offsetManager = mock(OffsetManager.class);
    RunLoopTask task0 = getMockRunLoopTask(taskName0, ssp0);
    when(task0.offsetManager()).thenReturn(offsetManager);
    CountDownLatch firstMessageBarrier = new CountDownLatch(1);
    doAnswer(invocation -> {
        ReadableCoordinator coordinator = invocation.getArgumentAt(1, ReadableCoordinator.class);
        TaskCallbackFactory callbackFactory = invocation.getArgumentAt(2, TaskCallbackFactory.class);
        TaskCallback callback = callbackFactory.createCallback();
        taskExecutor.submit(() -> {
            firstMessageBarrier.await();
            coordinator.commit(TaskCoordinator.RequestScope.CURRENT_TASK);
            coordinator.shutdown(TaskCoordinator.RequestScope.CURRENT_TASK);
            callback.complete();
            return null;
        });
        return null;
    }).when(task0).process(eq(envelope00), any(), any());
    doAnswer(invocation -> {
        assertEquals(1, task0.metrics().messagesInFlight().getValue());
        assertEquals(0, task0.metrics().asyncCallbackCompleted().getCount());
        TaskCallbackFactory callbackFactory = invocation.getArgumentAt(2, TaskCallbackFactory.class);
        TaskCallback callback = callbackFactory.createCallback();
        callback.complete();
        firstMessageBarrier.countDown();
        return null;
    }).when(task0).process(eq(envelope01), any(), any());
    Map<TaskName, RunLoopTask> tasks = new HashMap<>();
    tasks.put(taskName0, task0);
    RunLoop runLoop = new RunLoop(tasks, executor, consumerMultiplexer, maxMessagesInFlight, windowMs, commitMs, callbackTimeoutMs, maxThrottlingDelayMs, maxIdleMs, containerMetrics, () -> 0L, false);
    when(consumerMultiplexer.choose(false)).thenReturn(envelope00).thenReturn(envelope01).thenReturn(null);
    runLoop.run();
    InOrder inOrder = inOrder(task0);
    inOrder.verify(task0).process(eq(envelope00), any(), any());
    inOrder.verify(task0).process(eq(envelope01), any(), any());
    verify(offsetManager).update(eq(taskName0), eq(ssp0), eq(envelope00.getOffset()));
    assertEquals(2L, containerMetrics.processes().getCount());
}
Also used : SystemConsumers(org.apache.samza.system.SystemConsumers) InOrder(org.mockito.InOrder) HashMap(java.util.HashMap) OffsetManager(org.apache.samza.checkpoint.OffsetManager) TaskCallback(org.apache.samza.task.TaskCallback) CountDownLatch(java.util.concurrent.CountDownLatch) ExecutorService(java.util.concurrent.ExecutorService) TaskCallbackFactory(org.apache.samza.task.TaskCallbackFactory) ReadableCoordinator(org.apache.samza.task.ReadableCoordinator) Test(org.junit.Test)

Example 3 with TaskCallbackFactory

use of org.apache.samza.task.TaskCallbackFactory in project samza by apache.

the class TestRunLoop method testCommitAllTasks.

@Test
public void testCommitAllTasks() {
    SystemConsumers consumerMultiplexer = mock(SystemConsumers.class);
    RunLoopTask task0 = getMockRunLoopTask(taskName0, ssp0);
    doAnswer(invocation -> {
        ReadableCoordinator coordinator = invocation.getArgumentAt(1, ReadableCoordinator.class);
        TaskCallbackFactory callbackFactory = invocation.getArgumentAt(2, TaskCallbackFactory.class);
        TaskCallback callback = callbackFactory.createCallback();
        coordinator.commit(TaskCoordinator.RequestScope.ALL_TASKS_IN_CONTAINER);
        coordinator.shutdown(TaskCoordinator.RequestScope.ALL_TASKS_IN_CONTAINER);
        callback.complete();
        return null;
    }).when(task0).process(eq(envelope00), any(), any());
    RunLoopTask task1 = getMockRunLoopTask(taskName1, ssp1);
    Map<TaskName, RunLoopTask> tasks = new HashMap<>();
    tasks.put(this.taskName0, task0);
    tasks.put(taskName1, task1);
    int maxMessagesInFlight = 1;
    RunLoop runLoop = new RunLoop(tasks, executor, consumerMultiplexer, maxMessagesInFlight, windowMs, commitMs, callbackTimeoutMs, maxThrottlingDelayMs, maxIdleMs, containerMetrics, () -> 0L, false);
    // have a null message in between to make sure task0 finishes processing and invoke the commit
    when(consumerMultiplexer.choose(false)).thenReturn(envelope00).thenReturn(envelope11).thenReturn(null);
    runLoop.run();
    verify(task0).process(any(), any(), any());
    verify(task1).process(any(), any(), any());
    verify(task0).commit();
    verify(task1).commit();
}
Also used : SystemConsumers(org.apache.samza.system.SystemConsumers) HashMap(java.util.HashMap) TaskCallback(org.apache.samza.task.TaskCallback) TaskCallbackFactory(org.apache.samza.task.TaskCallbackFactory) ReadableCoordinator(org.apache.samza.task.ReadableCoordinator) Test(org.junit.Test)

Example 4 with TaskCallbackFactory

use of org.apache.samza.task.TaskCallbackFactory in project samza by apache.

the class TestRunLoop method testShutdownOnConsensus.

@Test
public void testShutdownOnConsensus() {
    SystemConsumers consumerMultiplexer = mock(SystemConsumers.class);
    int maxMessagesInFlight = 1;
    RunLoopTask task0 = getMockRunLoopTask(taskName0, ssp0);
    doAnswer(invocation -> {
        ReadableCoordinator coordinator = invocation.getArgumentAt(1, ReadableCoordinator.class);
        TaskCallbackFactory callbackFactory = invocation.getArgumentAt(2, TaskCallbackFactory.class);
        TaskCallback callback = callbackFactory.createCallback();
        coordinator.shutdown(TaskCoordinator.RequestScope.CURRENT_TASK);
        callback.complete();
        return null;
    }).when(task0).process(eq(envelope00), any(), any());
    RunLoopTask task1 = getMockRunLoopTask(taskName1, ssp1);
    doAnswer(invocation -> {
        ReadableCoordinator coordinator = invocation.getArgumentAt(1, ReadableCoordinator.class);
        TaskCallbackFactory callbackFactory = invocation.getArgumentAt(2, TaskCallbackFactory.class);
        TaskCallback callback = callbackFactory.createCallback();
        coordinator.shutdown(TaskCoordinator.RequestScope.CURRENT_TASK);
        callback.complete();
        return null;
    }).when(task1).process(eq(envelope11), any(), any());
    Map<TaskName, RunLoopTask> tasks = new HashMap<>();
    tasks.put(taskName0, task0);
    tasks.put(taskName1, task1);
    RunLoop runLoop = new RunLoop(tasks, executor, consumerMultiplexer, maxMessagesInFlight, windowMs, commitMs, callbackTimeoutMs, maxThrottlingDelayMs, maxIdleMs, containerMetrics, () -> 0L, false);
    // consensus is reached after envelope1 is processed.
    when(consumerMultiplexer.choose(false)).thenReturn(envelope00).thenReturn(envelope11).thenReturn(null);
    runLoop.run();
    verify(task0).process(any(), any(), any());
    verify(task1).process(any(), any(), any());
    assertEquals(2L, containerMetrics.envelopes().getCount());
    assertEquals(2L, containerMetrics.processes().getCount());
}
Also used : SystemConsumers(org.apache.samza.system.SystemConsumers) HashMap(java.util.HashMap) TaskCallback(org.apache.samza.task.TaskCallback) TaskCallbackFactory(org.apache.samza.task.TaskCallbackFactory) ReadableCoordinator(org.apache.samza.task.ReadableCoordinator) Test(org.junit.Test)

Example 5 with TaskCallbackFactory

use of org.apache.samza.task.TaskCallbackFactory in project samza by apache.

the class TestRunLoop method testEndOfStreamWaitsForInFlightMessages.

@Test
public void testEndOfStreamWaitsForInFlightMessages() {
    int maxMessagesInFlight = 2;
    ExecutorService taskExecutor = Executors.newFixedThreadPool(1);
    SystemConsumers consumerMultiplexer = mock(SystemConsumers.class);
    OffsetManager offsetManager = mock(OffsetManager.class);
    RunLoopTask task0 = getMockRunLoopTask(taskName0, ssp0);
    when(task0.offsetManager()).thenReturn(offsetManager);
    CountDownLatch firstMessageBarrier = new CountDownLatch(2);
    doAnswer(invocation -> {
        TaskCallbackFactory callbackFactory = invocation.getArgumentAt(2, TaskCallbackFactory.class);
        TaskCallback callback = callbackFactory.createCallback();
        taskExecutor.submit(() -> {
            firstMessageBarrier.await();
            callback.complete();
            return null;
        });
        return null;
    }).when(task0).process(eq(envelope00), any(), any());
    doAnswer(invocation -> {
        assertEquals(1, task0.metrics().messagesInFlight().getValue());
        TaskCallbackFactory callbackFactory = invocation.getArgumentAt(2, TaskCallbackFactory.class);
        TaskCallback callback = callbackFactory.createCallback();
        callback.complete();
        firstMessageBarrier.countDown();
        return null;
    }).when(task0).process(eq(envelope01), any(), any());
    doAnswer(invocation -> {
        assertEquals(0, task0.metrics().messagesInFlight().getValue());
        assertEquals(2, task0.metrics().asyncCallbackCompleted().getCount());
        return null;
    }).when(task0).endOfStream(any());
    Map<TaskName, RunLoopTask> tasks = new HashMap<>();
    tasks.put(taskName0, task0);
    RunLoop runLoop = new RunLoop(tasks, executor, consumerMultiplexer, maxMessagesInFlight, windowMs, commitMs, callbackTimeoutMs, maxThrottlingDelayMs, maxIdleMs, containerMetrics, () -> 0L, false);
    when(consumerMultiplexer.choose(false)).thenReturn(envelope00).thenReturn(envelope01).thenReturn(ssp0EndOfStream).thenAnswer(invocation -> {
        // this ensures that the end of stream message has passed through run loop BEFORE the last remaining in flight message completes
        firstMessageBarrier.countDown();
        return null;
    });
    runLoop.run();
    verify(task0).endOfStream(any());
}
Also used : SystemConsumers(org.apache.samza.system.SystemConsumers) HashMap(java.util.HashMap) OffsetManager(org.apache.samza.checkpoint.OffsetManager) ExecutorService(java.util.concurrent.ExecutorService) TaskCallback(org.apache.samza.task.TaskCallback) CountDownLatch(java.util.concurrent.CountDownLatch) TaskCallbackFactory(org.apache.samza.task.TaskCallbackFactory) Test(org.junit.Test)

Aggregations

SystemConsumers (org.apache.samza.system.SystemConsumers)7 TaskCallbackFactory (org.apache.samza.task.TaskCallbackFactory)7 Test (org.junit.Test)7 HashMap (java.util.HashMap)6 TaskCallback (org.apache.samza.task.TaskCallback)6 ReadableCoordinator (org.apache.samza.task.ReadableCoordinator)5 CountDownLatch (java.util.concurrent.CountDownLatch)3 ExecutorService (java.util.concurrent.ExecutorService)3 OffsetManager (org.apache.samza.checkpoint.OffsetManager)3 InOrder (org.mockito.InOrder)2 SamzaException (org.apache.samza.SamzaException)1