Search in sources :

Example 26 with BackgroundCallback

use of org.apache.curator.framework.api.BackgroundCallback in project curator by Netflix.

the class CuratorZKClientBridge method connect.

@Override
public void connect(final Watcher watcher) {
    if (watcher != null) {
        CuratorListener localListener = new CuratorListener() {

            @Override
            public void eventReceived(CuratorFramework client, CuratorEvent event) throws Exception {
                if (event.getWatchedEvent() != null) {
                    watcher.process(event.getWatchedEvent());
                }
            }
        };
        curator.getCuratorListenable().addListener(localListener);
        listener.set(localListener);
        try {
            BackgroundCallback callback = new BackgroundCallback() {

                @Override
                public void processResult(CuratorFramework client, CuratorEvent event) throws Exception {
                    WatchedEvent fakeEvent = new WatchedEvent(Watcher.Event.EventType.None, curator.getZookeeperClient().isConnected() ? Watcher.Event.KeeperState.SyncConnected : Watcher.Event.KeeperState.Disconnected, null);
                    watcher.process(fakeEvent);
                }
            };
            curator.checkExists().inBackground(callback).forPath("/foo");
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }
}
Also used : WatchedEvent(org.apache.zookeeper.WatchedEvent) CuratorFramework(org.apache.curator.framework.CuratorFramework) CuratorListener(org.apache.curator.framework.api.CuratorListener) CuratorEvent(org.apache.curator.framework.api.CuratorEvent) BackgroundCallback(org.apache.curator.framework.api.BackgroundCallback) KeeperException(org.apache.zookeeper.KeeperException)

Example 27 with BackgroundCallback

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

the class ZooKeeperCompletedCheckpointStore method remove.

/**
	 * Removes the state handle from ZooKeeper, discards the checkpoints, and the state handle.
	 */
private void remove(final Tuple2<RetrievableStateHandle<CompletedCheckpoint>, String> stateHandleAndPath, final Callable<Void> action) throws Exception {
    BackgroundCallback callback = new BackgroundCallback() {

        @Override
        public void processResult(CuratorFramework client, CuratorEvent event) throws Exception {
            final long checkpointId = pathToCheckpointId(stateHandleAndPath.f1);
            try {
                if (event.getType() == CuratorEventType.DELETE) {
                    if (event.getResultCode() == 0) {
                        Exception exception = null;
                        if (null != action) {
                            try {
                                action.call();
                            } catch (Exception e) {
                                exception = new Exception("Could not execute callable action " + "for checkpoint " + checkpointId + '.', e);
                            }
                        }
                        try {
                            // Discard the state handle
                            stateHandleAndPath.f0.discardState();
                        } catch (Exception e) {
                            Exception newException = new Exception("Could not discard meta " + "data for completed checkpoint " + checkpointId + '.', e);
                            if (exception == null) {
                                exception = newException;
                            } else {
                                exception.addSuppressed(newException);
                            }
                        }
                        if (exception != null) {
                            throw exception;
                        }
                    } else {
                        throw new IllegalStateException("Unexpected result code " + event.getResultCode() + " in '" + event + "' callback.");
                    }
                } else {
                    throw new IllegalStateException("Unexpected event type " + event.getType() + " in '" + event + "' callback.");
                }
            } catch (Exception e) {
                LOG.warn("Failed to discard checkpoint {}.", checkpointId, e);
            }
        }
    };
    // Remove state handle from ZooKeeper first. If this fails, we can still recover, but if
    // we remove a state handle and fail to remove it from ZooKeeper, we end up in an
    // inconsistent state.
    checkpointsInZooKeeper.remove(stateHandleAndPath.f1, callback);
}
Also used : CuratorFramework(org.apache.curator.framework.CuratorFramework) BackgroundCallback(org.apache.curator.framework.api.BackgroundCallback) CuratorEvent(org.apache.curator.framework.api.CuratorEvent) FlinkException(org.apache.flink.util.FlinkException) ConcurrentModificationException(java.util.ConcurrentModificationException)

Example 28 with BackgroundCallback

use of org.apache.curator.framework.api.BackgroundCallback 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)

Example 29 with BackgroundCallback

use of org.apache.curator.framework.api.BackgroundCallback 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 30 with BackgroundCallback

use of org.apache.curator.framework.api.BackgroundCallback in project pravega by pravega.

the class ZKStoreHelper method createZNodeIfNotExist.

CompletableFuture<Void> createZNodeIfNotExist(final String path, final byte[] data, final boolean createParent) {
    final CompletableFuture<Void> result = new CompletableFuture<>();
    try {
        CreateBuilder createBuilder = client.create();
        BackgroundCallback callback = callback(x -> result.complete(null), e -> {
            if (e instanceof StoreException.DataExistsException) {
                result.complete(null);
            } else {
                result.completeExceptionally(e);
            }
        }, path);
        if (createParent) {
            createBuilder.creatingParentsIfNeeded().inBackground(callback, executor).forPath(path, data);
        } else {
            createBuilder.inBackground(callback, executor).forPath(path, data);
        }
    } catch (Exception e) {
        result.completeExceptionally(StoreException.create(StoreException.Type.UNKNOWN, e, path));
    }
    return result;
}
Also used : CompletableFuture(java.util.concurrent.CompletableFuture) CreateBuilder(org.apache.curator.framework.api.CreateBuilder) BackgroundCallback(org.apache.curator.framework.api.BackgroundCallback) KeeperException(org.apache.zookeeper.KeeperException)

Aggregations

BackgroundCallback (org.apache.curator.framework.api.BackgroundCallback)37 CuratorFramework (org.apache.curator.framework.CuratorFramework)33 CuratorEvent (org.apache.curator.framework.api.CuratorEvent)33 CountDownLatch (java.util.concurrent.CountDownLatch)18 Test (org.testng.annotations.Test)14 RetryOneTime (org.apache.curator.retry.RetryOneTime)11 KeeperException (org.apache.zookeeper.KeeperException)7 AtomicInteger (java.util.concurrent.atomic.AtomicInteger)6 Watcher (org.apache.zookeeper.Watcher)6 Timing (org.apache.curator.test.Timing)4 Test (org.junit.Test)4 InvocationOnMock (org.mockito.invocation.InvocationOnMock)4 CompletableFuture (java.util.concurrent.CompletableFuture)3 CreateBuilder (org.apache.curator.framework.api.CreateBuilder)3 RetryNTimes (org.apache.curator.retry.RetryNTimes)3 WatchedEvent (org.apache.zookeeper.WatchedEvent)3 Message (com.google.protobuf.Message)2 ArrayList (java.util.ArrayList)2 HashMap (java.util.HashMap)2 ConcurrentHashMap (java.util.concurrent.ConcurrentHashMap)2