Search in sources :

Example 11 with CuratorEvent

use of org.apache.curator.framework.api.CuratorEvent in project flink by apache.

the class ZooKeeperCompletedCheckpointStoreTest method testCheckpointRecovery.

/**
	 * Tests that the completed checkpoint store can retrieve all checkpoints stored in ZooKeeper
	 * and ignores those which cannot be retrieved via their state handles.
	 */
@Test
public void testCheckpointRecovery() throws Exception {
    final List<Tuple2<RetrievableStateHandle<CompletedCheckpoint>, String>> checkpointsInZooKeeper = new ArrayList<>(4);
    final CompletedCheckpoint completedCheckpoint1 = mock(CompletedCheckpoint.class);
    when(completedCheckpoint1.getCheckpointID()).thenReturn(1L);
    final CompletedCheckpoint completedCheckpoint2 = mock(CompletedCheckpoint.class);
    when(completedCheckpoint2.getCheckpointID()).thenReturn(2L);
    final Collection<Long> expectedCheckpointIds = new HashSet<>(2);
    expectedCheckpointIds.add(1L);
    expectedCheckpointIds.add(2L);
    final RetrievableStateHandle<CompletedCheckpoint> failingRetrievableStateHandle = mock(RetrievableStateHandle.class);
    when(failingRetrievableStateHandle.retrieveState()).thenThrow(new Exception("Test exception"));
    final RetrievableStateHandle<CompletedCheckpoint> retrievableStateHandle1 = mock(RetrievableStateHandle.class);
    when(retrievableStateHandle1.retrieveState()).thenReturn(completedCheckpoint1);
    final RetrievableStateHandle<CompletedCheckpoint> retrievableStateHandle2 = mock(RetrievableStateHandle.class);
    when(retrievableStateHandle2.retrieveState()).thenReturn(completedCheckpoint2);
    checkpointsInZooKeeper.add(Tuple2.of(retrievableStateHandle1, "/foobar1"));
    checkpointsInZooKeeper.add(Tuple2.of(failingRetrievableStateHandle, "/failing1"));
    checkpointsInZooKeeper.add(Tuple2.of(retrievableStateHandle2, "/foobar2"));
    checkpointsInZooKeeper.add(Tuple2.of(failingRetrievableStateHandle, "/failing2"));
    final CuratorFramework client = mock(CuratorFramework.class, Mockito.RETURNS_DEEP_STUBS);
    final RetrievableStateStorageHelper<CompletedCheckpoint> storageHelperMock = mock(RetrievableStateStorageHelper.class);
    ZooKeeperStateHandleStore<CompletedCheckpoint> zooKeeperStateHandleStoreMock = spy(new ZooKeeperStateHandleStore<>(client, storageHelperMock, Executors.directExecutor()));
    whenNew(ZooKeeperStateHandleStore.class).withAnyArguments().thenReturn(zooKeeperStateHandleStoreMock);
    doReturn(checkpointsInZooKeeper).when(zooKeeperStateHandleStoreMock).getAllSortedByName();
    final int numCheckpointsToRetain = 1;
    // Mocking for the delete operation on the CuratorFramework client
    // It assures that the callback is executed synchronously
    final EnsurePath ensurePathMock = mock(EnsurePath.class);
    final CuratorEvent curatorEventMock = mock(CuratorEvent.class);
    when(curatorEventMock.getType()).thenReturn(CuratorEventType.DELETE);
    when(curatorEventMock.getResultCode()).thenReturn(0);
    when(client.newNamespaceAwareEnsurePath(anyString())).thenReturn(ensurePathMock);
    when(client.delete().deletingChildrenIfNeeded().inBackground(any(BackgroundCallback.class), any(Executor.class))).thenAnswer(new Answer<Pathable<Void>>() {

        @Override
        public Pathable<Void> answer(InvocationOnMock invocation) throws Throwable {
            final BackgroundCallback callback = (BackgroundCallback) invocation.getArguments()[0];
            Pathable<Void> result = mock(Pathable.class);
            when(result.forPath(anyString())).thenAnswer(new Answer<Void>() {

                @Override
                public Void answer(InvocationOnMock invocation) throws Throwable {
                    callback.processResult(client, curatorEventMock);
                    return null;
                }
            });
            return result;
        }
    });
    final String checkpointsPath = "foobar";
    final RetrievableStateStorageHelper<CompletedCheckpoint> stateSotrage = mock(RetrievableStateStorageHelper.class);
    ZooKeeperCompletedCheckpointStore zooKeeperCompletedCheckpointStore = new ZooKeeperCompletedCheckpointStore(numCheckpointsToRetain, client, checkpointsPath, stateSotrage, Executors.directExecutor());
    zooKeeperCompletedCheckpointStore.recover();
    CompletedCheckpoint latestCompletedCheckpoint = zooKeeperCompletedCheckpointStore.getLatestCheckpoint();
    // check that we return the latest retrievable checkpoint
    // this should remove the latest checkpoint because it is broken
    assertEquals(completedCheckpoint2.getCheckpointID(), latestCompletedCheckpoint.getCheckpointID());
    // this should remove the second broken checkpoint because we're iterating over all checkpoints
    List<CompletedCheckpoint> completedCheckpoints = zooKeeperCompletedCheckpointStore.getAllCheckpoints();
    Collection<Long> actualCheckpointIds = new HashSet<>(completedCheckpoints.size());
    for (CompletedCheckpoint completedCheckpoint : completedCheckpoints) {
        actualCheckpointIds.add(completedCheckpoint.getCheckpointID());
    }
    assertEquals(expectedCheckpointIds, actualCheckpointIds);
    // check that we did not discard any of the state handles which were retrieved
    verify(retrievableStateHandle1, never()).discardState();
    verify(retrievableStateHandle2, never()).discardState();
    // check that we have discarded the state handles which could not be retrieved
    verify(failingRetrievableStateHandle, times(2)).discardState();
}
Also used : ArrayList(java.util.ArrayList) CuratorEvent(org.apache.curator.framework.api.CuratorEvent) Matchers.anyString(org.mockito.Matchers.anyString) CuratorFramework(org.apache.curator.framework.CuratorFramework) Executor(java.util.concurrent.Executor) HashSet(java.util.HashSet) BackgroundCallback(org.apache.curator.framework.api.BackgroundCallback) Pathable(org.apache.curator.framework.api.Pathable) Answer(org.mockito.stubbing.Answer) EnsurePath(org.apache.curator.utils.EnsurePath) Tuple2(org.apache.flink.api.java.tuple.Tuple2) InvocationOnMock(org.mockito.invocation.InvocationOnMock) PrepareForTest(org.powermock.core.classloader.annotations.PrepareForTest) Test(org.junit.Test)

Example 12 with CuratorEvent

use of org.apache.curator.framework.api.CuratorEvent in project heron by twitter.

the class CuratorStateManagerTest method testGetNodeData.

/**
   * Test getNodeData method
   * @throws Exception
   */
@Test
public void testGetNodeData() throws Exception {
    CuratorStateManager spyStateManager = spy(new CuratorStateManager());
    final CuratorFramework mockClient = mock(CuratorFramework.class);
    GetDataBuilder mockGetBuilder = mock(GetDataBuilder.class);
    // Mockito doesn't support mock type-parametrized class, thus suppress the warning
    @SuppressWarnings("rawtypes") BackgroundPathable mockBackPathable = mock(BackgroundPathable.class);
    final CuratorEvent mockEvent = mock(CuratorEvent.class);
    Message.Builder mockBuilder = mock(Message.Builder.class);
    Message mockMessage = mock(Message.class);
    final byte[] data = "wy_1989".getBytes();
    doReturn(mockMessage).when(mockBuilder).build();
    doReturn(data).when(mockEvent).getData();
    doReturn(PATH).when(mockEvent).getPath();
    doReturn(mockClient).when(spyStateManager).getCuratorClient();
    doReturn(true).when(mockClient).blockUntilConnected(anyInt(), any(TimeUnit.class));
    doReturn(mockGetBuilder).when(mockClient).getData();
    doReturn(mockBackPathable).when(mockGetBuilder).usingWatcher(any(Watcher.class));
    doAnswer(new Answer<Object>() {

        @Override
        public Object answer(InvocationOnMock invocationOnMock) throws Throwable {
            Object[] objests = invocationOnMock.getArguments();
            // the first object is the BackgroundCallback
            ((BackgroundCallback) objests[0]).processResult(mockClient, mockEvent);
            return null;
        }
    }).when(mockBackPathable).inBackground(any(BackgroundCallback.class));
    spyStateManager.initialize(config);
    // Verify the data on node is fetched correctly
    ListenableFuture<Message> result = spyStateManager.getNodeData(null, PATH, mockBuilder);
    assertTrue(result.get().equals(mockMessage));
}
Also used : Message(com.google.protobuf.Message) Watcher(org.apache.zookeeper.Watcher) CuratorEvent(org.apache.curator.framework.api.CuratorEvent) BackgroundCallback(org.apache.curator.framework.api.BackgroundCallback) GetDataBuilder(org.apache.curator.framework.api.GetDataBuilder) CuratorFramework(org.apache.curator.framework.CuratorFramework) InvocationOnMock(org.mockito.invocation.InvocationOnMock) TimeUnit(java.util.concurrent.TimeUnit) BackgroundPathable(org.apache.curator.framework.api.BackgroundPathable) Test(org.junit.Test)

Aggregations

CuratorEvent (org.apache.curator.framework.api.CuratorEvent)12 CuratorFramework (org.apache.curator.framework.CuratorFramework)11 CuratorListener (org.apache.curator.framework.api.CuratorListener)7 Test (org.junit.Test)6 BackgroundCallback (org.apache.curator.framework.api.BackgroundCallback)5 CountDownLatch (java.util.concurrent.CountDownLatch)4 KeeperException (org.apache.zookeeper.KeeperException)4 WatchedEvent (org.apache.zookeeper.WatchedEvent)3 IOException (java.io.IOException)2 Watcher (org.apache.zookeeper.Watcher)2 InvocationOnMock (org.mockito.invocation.InvocationOnMock)2 Message (com.google.protobuf.Message)1 BindException (java.net.BindException)1 UnknownHostException (java.net.UnknownHostException)1 ArrayList (java.util.ArrayList)1 ConcurrentModificationException (java.util.ConcurrentModificationException)1 HashSet (java.util.HashSet)1 Map (java.util.Map)1 ExecutionException (java.util.concurrent.ExecutionException)1 Executor (java.util.concurrent.Executor)1