use of org.apache.curator.framework.CuratorFramework in project pravega by pravega.
the class ZKSegmentContainerManagerTest method testInitializeError.
/**
* Tests if we cannot connect to ZooKeeper (the exception must be propagated to the caller).
*
* @throws Exception if an error occurred.
*/
@Test
public void testInitializeError() throws Exception {
@Cleanup CuratorFramework zkClient = startClient();
@Cleanup ZKSegmentContainerManager segManager = createContainerManager(createMockContainerRegistry(), zkClient);
zkClient.close();
AssertExtensions.assertThrows("initialize() did not throw an exception when ZooKeeper could not be accessed.", segManager::initialize, // Any exception will do, as long as it is propagated.
ex -> true);
}
use of org.apache.curator.framework.CuratorFramework in project pravega by pravega.
the class ZKSegmentContainerMonitorTest method testShutdownNotYetStartedContainer.
@Test
public void testShutdownNotYetStartedContainer() throws Exception {
@Cleanup CuratorFramework zkClient = startClient();
initializeHostContainerMapping(zkClient);
SegmentContainerRegistry containerRegistry = createMockContainerRegistry();
@Cleanup ZKSegmentContainerMonitor segMonitor = createContainerMonitor(containerRegistry, zkClient);
segMonitor.initialize(Duration.ofSeconds(1));
// Simulate a container that takes a long time to start. Should be greater than a few monitor loops.
ContainerHandle containerHandle = mock(ContainerHandle.class);
when(containerHandle.getContainerId()).thenReturn(2);
CompletableFuture<ContainerHandle> startupFuture = Futures.delayedFuture(() -> CompletableFuture.completedFuture(containerHandle), 3000, executorService());
when(containerRegistry.startContainer(eq(2), any())).thenReturn(startupFuture);
// Use ZK to send that information to the Container Manager.
HashMap<Host, Set<Integer>> currentData = deserialize(zkClient, PATH);
currentData.put(PRAVEGA_SERVICE_ENDPOINT, Collections.singleton(2));
zkClient.setData().forPath(PATH, SerializationUtils.serialize(currentData));
// Verify it's not yet started.
verify(containerRegistry, timeout(1000).atLeastOnce()).startContainer(eq(2), any());
assertEquals(0, segMonitor.getRegisteredContainers().size());
// Now simulate shutting it down.
when(containerRegistry.stopContainer(any(), any())).thenReturn(CompletableFuture.completedFuture(null));
currentData.clear();
zkClient.setData().forPath(PATH, SerializationUtils.serialize(currentData));
verify(containerRegistry, timeout(10000).atLeastOnce()).stopContainer(any(), any());
Thread.sleep(2000);
assertEquals(0, segMonitor.getRegisteredContainers().size());
}
use of org.apache.curator.framework.CuratorFramework in project pravega by pravega.
the class ZKSegmentContainerMonitorTest method testRetryOnExceptions.
@Test
public void testRetryOnExceptions() throws Exception {
@Cleanup CuratorFramework zkClient = startClient();
initializeHostContainerMapping(zkClient);
SegmentContainerRegistry containerRegistry = createMockContainerRegistry();
@Cleanup ZKSegmentContainerMonitor segMonitor = createContainerMonitor(containerRegistry, zkClient);
segMonitor.initialize(Duration.ofSeconds(1));
// Simulate a container that throws exception on start.
when(containerRegistry.startContainer(eq(2), any())).thenThrow(new RuntimeException());
// Use ZK to send that information to the Container Manager.
HashMap<Host, Set<Integer>> currentData = deserialize(zkClient, PATH);
currentData.put(PRAVEGA_SERVICE_ENDPOINT, Collections.singleton(2));
zkClient.setData().forPath(PATH, SerializationUtils.serialize(currentData));
// Verify that it does not start.
verify(containerRegistry, timeout(1000).atLeastOnce()).startContainer(eq(2), any());
assertEquals(0, segMonitor.getRegisteredContainers().size());
// Now simulate success for the same container.
ContainerHandle containerHandle = mock(ContainerHandle.class);
when(containerHandle.getContainerId()).thenReturn(2);
when(containerRegistry.startContainer(eq(2), any())).thenReturn(CompletableFuture.completedFuture(containerHandle));
// Verify that it retries and starts the same container again.
verify(containerRegistry, timeout(1000).atLeastOnce()).startContainer(eq(2), any());
// Using wait here to ensure the private data structure is updated.
// TODO: Removing dependency on sleep here and other places in this class
// - https://github.com/pravega/pravega/issues/1079
Thread.sleep(2000);
assertEquals(1, segMonitor.getRegisteredContainers().size());
}
use of org.apache.curator.framework.CuratorFramework in project pravega by pravega.
the class ZkStoreRetentionTest method testOwnershipOfExistingBucket.
@Test(timeout = 10000)
public void testOwnershipOfExistingBucket() throws Exception {
TestingServer zkServer2 = new TestingServerStarter().start();
zkServer2.start();
CuratorFramework zkClient2 = CuratorFrameworkFactory.newClient(zkServer2.getConnectString(), 10000, 1000, (r, e, s) -> false);
zkClient2.start();
ScheduledExecutorService executor2 = Executors.newScheduledThreadPool(10);
String hostId = UUID.randomUUID().toString();
StreamMetadataStore streamMetadataStore2 = StreamStoreFactory.createZKStore(zkClient2, 1, executor2);
TaskMetadataStore taskMetadataStore = TaskStoreFactory.createInMemoryStore(executor2);
HostControllerStore hostStore = HostStoreFactory.createInMemoryStore(HostMonitorConfigImpl.dummyConfig());
SegmentHelper segmentHelper = SegmentHelperMock.getSegmentHelperMock();
ConnectionFactoryImpl connectionFactory = new ConnectionFactoryImpl(ClientConfig.builder().build());
StreamMetadataTasks streamMetadataTasks2 = new StreamMetadataTasks(streamMetadataStore2, hostStore, taskMetadataStore, segmentHelper, executor2, hostId, connectionFactory, false, "");
String scope = "scope1";
String streamName = "stream1";
streamMetadataStore2.addUpdateStreamForAutoStreamCut(scope, streamName, RetentionPolicy.builder().build(), null, executor2).join();
String scope2 = "scope2";
String streamName2 = "stream2";
streamMetadataStore2.addUpdateStreamForAutoStreamCut(scope2, streamName2, RetentionPolicy.builder().build(), null, executor2).join();
StreamCutService service2 = new StreamCutService(1, hostId, streamMetadataStore2, streamMetadataTasks2, executor2);
service2.startAsync();
service2.awaitRunning();
assertTrue(service2.getBuckets().stream().allMatch(x -> x.getRetentionFutureMap().size() == 2));
service2.stopAsync();
service2.awaitTerminated();
zkClient2.close();
zkServer2.close();
streamMetadataTasks2.close();
connectionFactory.close();
executor2.shutdown();
}
use of org.apache.curator.framework.CuratorFramework in project pravega by pravega.
the class InProcPravegaCluster method cleanUpZK.
private void cleanUpZK() {
String[] pathsTobeCleaned = { "/pravega", "/hostIndex", "/store", "/taskIndex" };
RetryPolicy rp = new ExponentialBackoffRetry(1000, 3);
CuratorFrameworkFactory.Builder builder = CuratorFrameworkFactory.builder().connectString(zkUrl).connectionTimeoutMs(5000).sessionTimeoutMs(5000).retryPolicy(rp);
@Cleanup CuratorFramework zclient = builder.build();
zclient.start();
for (String path : pathsTobeCleaned) {
try {
zclient.delete().guaranteed().deletingChildrenIfNeeded().forPath(path);
} catch (Exception e) {
log.warn("Not able to delete path {} . Exception {}", path, e.getMessage());
}
}
zclient.close();
}
Aggregations