use of org.apache.samza.coordinator.NoProcessorJobCoordinatorListener in project samza by apache.
the class JobCoordinatorLaunchUtil method runJobCoordinator.
private static void runJobCoordinator(String jobCoordinatorClassName, MetricsRegistryMap metrics, MetadataStore metadataStore, Config finalConfig) {
JobCoordinatorFactory jobCoordinatorFactory = ReflectionUtil.getObj(jobCoordinatorClassName, JobCoordinatorFactory.class);
JobCoordinator jobCoordinator = jobCoordinatorFactory.getJobCoordinator(JOB_COORDINATOR_PROCESSOR_ID_PLACEHOLDER, finalConfig, metrics, metadataStore);
Map<String, MetricsReporter> metricsReporters = MetricsReporterLoader.getMetricsReporters(new MetricsConfig(finalConfig), CoordinationConstants.JOB_COORDINATOR_CONTAINER_NAME);
metricsReporters.values().forEach(metricsReporter -> metricsReporter.register(CoordinationConstants.JOB_COORDINATOR_CONTAINER_NAME, metrics));
metricsReporters.values().forEach(MetricsReporter::start);
CountDownLatch waitForShutdownLatch = new CountDownLatch(1);
jobCoordinator.setListener(new NoProcessorJobCoordinatorListener(waitForShutdownLatch));
jobCoordinator.start();
addShutdownHook(jobCoordinator);
try {
waitForShutdownLatch.await();
} catch (InterruptedException e) {
String errorMessage = "Error while waiting for coordinator to complete";
LOG.error(errorMessage, e);
throw new SamzaException(errorMessage, e);
} finally {
metricsReporters.values().forEach(MetricsReporter::stop);
}
}
use of org.apache.samza.coordinator.NoProcessorJobCoordinatorListener in project samza by apache.
the class TestJobCoordinatorLaunchUtil method testRunJobCoordinator.
@Test
public void testRunJobCoordinator() throws Exception {
String jobCoordinatorFactoryClass = "org.apache.samza.custom.MyJobCoordinatorFactory";
Config originalConfig = buildOriginalConfig(ImmutableMap.of(JobCoordinatorConfig.JOB_COORDINATOR_FACTORY, jobCoordinatorFactoryClass));
JobConfig fullConfig = new JobConfig(new MapConfig(originalConfig, Collections.singletonMap("isAfterPlanning", "true")));
Config autoSizingConfig = new MapConfig(Collections.singletonMap(JobConfig.JOB_AUTOSIZING_CONTAINER_COUNT, "10"));
Config finalConfig = new MapConfig(autoSizingConfig, fullConfig);
RemoteJobPlanner remoteJobPlanner = mock(RemoteJobPlanner.class);
CoordinatorStreamStore coordinatorStreamStore = mock(CoordinatorStreamStore.class);
JobCoordinatorFactory jobCoordinatorFactory = mock(JobCoordinatorFactory.class);
JobCoordinator jobCoordinator = mock(JobCoordinator.class);
PowerMockito.mockStatic(CoordinatorStreamUtil.class);
PowerMockito.doNothing().when(CoordinatorStreamUtil.class, "createCoordinatorStream", any());
PowerMockito.doReturn(new MapConfig()).when(CoordinatorStreamUtil.class, "buildCoordinatorStreamConfig", any());
PowerMockito.doReturn(autoSizingConfig).when(CoordinatorStreamUtil.class, "readLaunchConfigFromCoordinatorStream", any(), any());
PowerMockito.whenNew(CoordinatorStreamStore.class).withAnyArguments().thenReturn(coordinatorStreamStore);
PowerMockito.whenNew(RemoteJobPlanner.class).withAnyArguments().thenReturn(remoteJobPlanner);
when(remoteJobPlanner.prepareJobs()).thenReturn(Collections.singletonList(fullConfig));
PowerMockito.mockStatic(ReflectionUtil.class);
PowerMockito.doReturn(jobCoordinatorFactory).when(ReflectionUtil.class, "getObj", jobCoordinatorFactoryClass, JobCoordinatorFactory.class);
when(jobCoordinatorFactory.getJobCoordinator(eq("samza-job-coordinator"), eq(finalConfig), any(), eq(coordinatorStreamStore))).thenReturn(jobCoordinator);
// use a latch to keep track of when shutdown hook was added to know when we should start verifications
CountDownLatch addShutdownHookLatch = new CountDownLatch(1);
PowerMockito.spy(JobCoordinatorLaunchUtil.class);
PowerMockito.doAnswer(invocation -> {
addShutdownHookLatch.countDown();
return null;
}).when(JobCoordinatorLaunchUtil.class, "addShutdownHook", any());
MetricsReporter metricsReporter = mock(MetricsReporter.class);
Map<String, MetricsReporter> metricsReporterMap = ImmutableMap.of("reporter", metricsReporter);
PowerMockito.mockStatic(MetricsReporterLoader.class);
PowerMockito.doReturn(metricsReporterMap).when(MetricsReporterLoader.class, "getMetricsReporters", new MetricsConfig(finalConfig), "JobCoordinator");
NoProcessorJobCoordinatorListener jobCoordinatorListener = mock(NoProcessorJobCoordinatorListener.class);
PowerMockito.whenNew(NoProcessorJobCoordinatorListener.class).withAnyArguments().thenReturn(jobCoordinatorListener);
Thread runThread = new Thread(() -> JobCoordinatorLaunchUtil.run(new MockStreamApplication(), originalConfig));
runThread.start();
// last thing before waiting for shutdown is to add shutdown hook, so do verifications once hook is added
addShutdownHookLatch.await();
verifyStatic();
CoordinatorStreamUtil.createCoordinatorStream(fullConfig);
verifyStatic();
CoordinatorStreamUtil.writeConfigToCoordinatorStream(finalConfig, true);
verifyStatic();
JobCoordinatorLaunchUtil.addShutdownHook(jobCoordinator);
InOrder inOrder = Mockito.inOrder(metricsReporter, jobCoordinator);
inOrder.verify(metricsReporter).register(eq("JobCoordinator"), any());
inOrder.verify(metricsReporter).start();
ArgumentCaptor<CountDownLatch> countDownLatchArgumentCaptor = ArgumentCaptor.forClass(CountDownLatch.class);
verifyNew(NoProcessorJobCoordinatorListener.class).withArguments(countDownLatchArgumentCaptor.capture());
inOrder.verify(jobCoordinator).setListener(jobCoordinatorListener);
inOrder.verify(jobCoordinator).start();
// wait some time and then make sure the run thread is still alive
Thread.sleep(Duration.ofMillis(500).toMillis());
assertTrue(runThread.isAlive());
// trigger the count down latch so that the run thread can exit
countDownLatchArgumentCaptor.getValue().countDown();
runThread.join(Duration.ofSeconds(10).toMillis());
assertFalse(runThread.isAlive());
verify(metricsReporter).stop();
}
Aggregations