@Override public OperationFuture<NodeData> exec(String path, Watcher watcher) { return zkClient.getData(path, watcher); } }, path, callback, cancelled);
@Override public OperationFuture<NodeData> exec(String path, Watcher watcher) { return zkClient.getData(path, watcher); } }, path, callback, cancelled);
@Override public OperationFuture<NodeData> getData(String path, @Nullable Watcher watcher) { return client.getData(path, watcher); }
@Override public OperationFuture<NodeData> getData(String path, @Nullable Watcher watcher) { return delegate.getData(path, watcher); }
@Override public OperationFuture<NodeData> getData(String path, @Nullable Watcher watcher) { return client.getData(path, watcher); }
@Override public OperationFuture<NodeData> getData(String path, @Nullable Watcher watcher) { return delegate.getData(path, watcher); }
/** * Starts watching for the max. of smaller node. */ private void watchNode(final String nodePath, Watcher watcher) { OperationFuture<NodeData> watchFuture = zkClient.getData(nodePath, watcher); Futures.addCallback(watchFuture, new FutureCallback<NodeData>() { @Override public void onSuccess(NodeData nodeData) { if (state != State.CANCELLED) { becomeFollower(); } } @Override public void onFailure(Throwable t) { // On any kind of failure, just rerun the election. LOG.debug("Exception while setting watch on node {}. Retry.", nodePath, t); runElection(); } }, executor); }
private void getResource(String path, final FutureCallback<T> resourceCallback) { OperationFuture<NodeData> future = zookeeper.getData(path, watcher); Futures.addCallback(future, new FutureCallback<NodeData>() { @Override public void onSuccess(NodeData result) { T resource = null; try { resource = codec.decode(result.getData()); resourceCallback.onSuccess(resource); } catch (IOException ioe) { resourceCallback.onFailure(ioe); } } @Override public void onFailure(Throwable t) { resourceCallback.onFailure(t); } }); }
/** * Starts watching for the max. of smaller node. */ private void watchNode(final String nodePath, Watcher watcher) { OperationFuture<NodeData> watchFuture = zkClient.getData(nodePath, watcher); Futures.addCallback(watchFuture, new FutureCallback<NodeData>() { @Override public void onSuccess(NodeData nodeData) { if (state != State.CANCELLED) { becomeFollower(); } } @Override public void onFailure(Throwable t) { // On any kind of failure, just rerun the election. LOG.debug("Exception while setting watch on node {}. Retry.", nodePath, t); runElection(); } }, executor); }
/** * Acts as {@link ZKClient#getData(String, Watcher)} if node exists. * Otherwise sets {@code null} in returned future. */ public static ListenableFuture<NodeData> getDataOrNull(final ZKClient zkClient, final String path, @Nullable Watcher watcher) { return ignoreError(zkClient.getData(path, watcher), KeeperException.NoNodeException.class); }
/** * Fetches the {@link ResourceRequirement} for the given resource. * * @param resourceName Name of the resource. * @return A {@link ListenableFuture} that will be completed when the requirement is fetch. A {@code null} result * will be set into the future if no such requirement exists. The future will fail if failed to fetch * the requirement due to error other than requirement not exists. * Calling {@link ListenableFuture#cancel(boolean)} has no effect. */ public ListenableFuture<ResourceRequirement> fetchRequirement(String resourceName) { String zkPath = CoordinationConstants.REQUIREMENTS_PATH + "/" + resourceName; return Futures.transform( ZKOperations.ignoreError(zkClient.getData(zkPath), KeeperException.NoNodeException.class, null), NODE_DATA_TO_REQUIREMENT ); }
/** * Fetches the {@link ResourceRequirement} for the given resource. * * @param resourceName Name of the resource. * @return A {@link ListenableFuture} that will be completed when the requirement is fetch. A {@code null} result * will be set into the future if no such requirement exists. The future will fail if failed to fetch * the requirement due to error other than requirement not exists. * Calling {@link ListenableFuture#cancel(boolean)} has no effect. */ public ListenableFuture<ResourceRequirement> fetchRequirement(String resourceName) { String zkPath = CoordinationConstants.REQUIREMENTS_PATH + "/" + resourceName; return Futures.transform( ZKOperations.ignoreError(zkClient.getData(zkPath), KeeperException.NoNodeException.class, null), NODE_DATA_TO_REQUIREMENT ); }
protected final void watchInstanceNode() { if (!shouldProcessZKEvent()) { return; } Futures.addCallback(zkClient.getData(getInstancePath(), new Watcher() { @Override public void process(WatchedEvent event) { if (!shouldProcessZKEvent()) { return; } switch (event.getType()) { case NodeDataChanged: watchInstanceNode(); break; case NodeDeleted: instanceNodeFailed(KeeperException.create(KeeperException.Code.NONODE, getInstancePath())); break; default: LOG.info("Ignore ZK event for instance node: {}", event); } } }), instanceNodeDataCallback, Threads.SAME_THREAD_EXECUTOR); }
protected final void watchInstanceNode() { if (!shouldProcessZKEvent()) { return; } Futures.addCallback(zkClient.getData(getInstancePath(), new Watcher() { @Override public void process(WatchedEvent event) { if (!shouldProcessZKEvent()) { return; } switch (event.getType()) { case NodeDataChanged: watchInstanceNode(); break; case NodeDeleted: instanceNodeFailed(KeeperException.create(KeeperException.Code.NONODE, getInstancePath())); break; default: LOG.info("Ignore ZK event for instance node: {}", event); } } }), instanceNodeDataCallback, Threads.SAME_THREAD_EXECUTOR); }
@Override public void updated(NodeChildren nodeChildren) { List<String> nodes = nodeChildren.getChildren(); final Map<String, ListenableFuture<NodeData>> nodeAndDataFutures = Maps.newHashMap(); List<OperationFuture<NodeData>> dataFutures = Lists.newArrayList(); for (String node : nodes) { OperationFuture<NodeData> dataFuture = zkClient.getData(getNodePath(node)); dataFutures.add(dataFuture); nodeAndDataFutures.put(node, dataFuture); } final ListenableFuture<List<NodeData>> fetchFuture = Futures.successfulAsList(dataFutures); fetchFuture.addListener(new Runnable() { @Override public void run() { ImmutableMap.Builder<String, T> builder = ImmutableMap.builder(); for (Map.Entry<String, ListenableFuture<NodeData>> nodeAndData : nodeAndDataFutures.entrySet()) { T value = serializer.deserialize(Futures.getUnchecked(nodeAndData.getValue()).getData()); builder.put(nodeAndData.getKey(), value); } currentView.set(builder.build()); updateWaitingForElements(); } }, Threads.SAME_THREAD_EXECUTOR); } });
@Override public OperationFuture<NodeData> getData(String path, @Nullable Watcher watcher) { return relayFuture(delegate.getData(getNamespacedPath(path), watcher), this.<NodeData>createFuture(path)); }
@Override public OperationFuture<NodeData> getData(String path, @Nullable Watcher watcher) { return relayFuture(delegate.getData(getNamespacedPath(path), watcher), this.<NodeData>createFuture(path)); }
private long generateId(Type type) { idLock.get().lock(); try { NodeData nodeData = Futures.getUnchecked(zkClient.getData(type.path)); long counterVal = Longs.fromByteArray(nodeData.getData()); Futures.getUnchecked(zkClient.setData(type.path, Longs.toByteArray(counterVal + incrementBy))); return counterVal; } finally { idLock.get().unlock(); } }
@Override public void updated(NodeChildren nodeChildren) { List<String> nodes = nodeChildren.getChildren(); List<OperationFuture<NodeData>> dataFutures = Lists.newArrayList(); for (String node : nodes) { dataFutures.add(zkClient.getData(getNodePath(node))); } final ListenableFuture<List<NodeData>> fetchFuture = Futures.successfulAsList(dataFutures); fetchFuture.addListener(new Runnable() { @Override public void run() { ImmutableList.Builder<T> builder = ImmutableList.builder(); // fetchFuture is set by this time List<NodeData> nodesData = Futures.getUnchecked(fetchFuture); for (NodeData nodeData : nodesData) { builder.add(serializer.deserialize(nodeData.getData())); } currentView.set(builder.build()); } }, Threads.SAME_THREAD_EXECUTOR); } });
@Override public boolean remove(Object o) { List<T> current = Lists.newArrayList(currentView.get()); boolean removed = current.remove(o); if (removed) { currentView.set(ImmutableList.<T>builder().addAll(current).build()); } // Hint: we can try to make removal more efficient if we keep map<nodeName->object> internally, or at least try to // remove only when in-mem collection removed smth, but then we may face races... NodeChildren children = Futures.getUnchecked(ZKClientExt.getChildrenOrNull(zkClient, "")); if (children == null) { return false; } List<String> nodes = children.getChildren(); for (String node : nodes) { byte[] data = Futures.getUnchecked(zkClient.getData(getNodePath(node))).getData(); if (o.equals(serializer.deserialize(data))) { return Futures.getUnchecked(ZKClientExt.delete(zkClient, getNodePath(node), true)) != null; } } return removed; }