IGNITE-8189 Improved ZkDistributedCollectDataFuture#deleteFutureData implementation - Fixes #4537.
Signed-off-by: Alexey Goncharuk <alexey.goncha...@gmail.com> Project: http://git-wip-us.apache.org/repos/asf/ignite/repo Commit: http://git-wip-us.apache.org/repos/asf/ignite/commit/2cccfae4 Tree: http://git-wip-us.apache.org/repos/asf/ignite/tree/2cccfae4 Diff: http://git-wip-us.apache.org/repos/asf/ignite/diff/2cccfae4 Branch: refs/heads/ignite-5960 Commit: 2cccfae49106f36a4f0b2b52a81889a295f52677 Parents: d1b3882 Author: NSAmelchev <nsamelc...@gmail.com> Authored: Fri Aug 31 15:47:16 2018 +0300 Committer: Alexey Goncharuk <alexey.goncha...@gmail.com> Committed: Fri Aug 31 15:47:16 2018 +0300 ---------------------------------------------------------------------- .../ZkDistributedCollectDataFuture.java | 19 ++++------ .../discovery/zk/internal/ZookeeperClient.java | 40 ++++++++------------ .../zk/internal/ZookeeperDiscoveryImpl.java | 39 +++++++------------ .../zk/internal/ZookeeperClientTest.java | 13 ++----- 4 files changed, 40 insertions(+), 71 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/ignite/blob/2cccfae4/modules/zookeeper/src/main/java/org/apache/ignite/spi/discovery/zk/internal/ZkDistributedCollectDataFuture.java ---------------------------------------------------------------------- diff --git a/modules/zookeeper/src/main/java/org/apache/ignite/spi/discovery/zk/internal/ZkDistributedCollectDataFuture.java b/modules/zookeeper/src/main/java/org/apache/ignite/spi/discovery/zk/internal/ZkDistributedCollectDataFuture.java index e9b28e1..e710055 100644 --- a/modules/zookeeper/src/main/java/org/apache/ignite/spi/discovery/zk/internal/ZkDistributedCollectDataFuture.java +++ b/modules/zookeeper/src/main/java/org/apache/ignite/spi/discovery/zk/internal/ZkDistributedCollectDataFuture.java @@ -18,6 +18,7 @@ package org.apache.ignite.spi.discovery.zk.internal; import java.util.Iterator; +import java.util.LinkedList; import java.util.List; import java.util.Set; import java.util.UUID; @@ -145,23 +146,19 @@ class ZkDistributedCollectDataFuture extends GridFutureAdapter<Void> { UUID futId, IgniteLogger log ) throws Exception { - // TODO ZK: https://issues.apache.org/jira/browse/IGNITE-8189 + List<String> batch = new LinkedList<>(); + String evtDir = paths.distributedFutureBasePath(futId); - try { - client.deleteAll(evtDir, - client.getChildrenIfPathExists(evtDir), - -1); - } - catch (KeeperException.NoNodeException e) { - U.log(log, "Node for deletion was not found: " + e.getPath()); + if (client.exists(evtDir)) { + batch.addAll(client.getChildrenPaths(evtDir)); - // TODO ZK: https://issues.apache.org/jira/browse/IGNITE-8189 + batch.add(evtDir); } - client.deleteIfExists(evtDir, -1); + batch.add(paths.distributedFutureResultPath(futId)); - client.deleteIfExists(paths.distributedFutureResultPath(futId), -1); + client.deleteAll(batch, -1); } /** http://git-wip-us.apache.org/repos/asf/ignite/blob/2cccfae4/modules/zookeeper/src/main/java/org/apache/ignite/spi/discovery/zk/internal/ZookeeperClient.java ---------------------------------------------------------------------- diff --git a/modules/zookeeper/src/main/java/org/apache/ignite/spi/discovery/zk/internal/ZookeeperClient.java b/modules/zookeeper/src/main/java/org/apache/ignite/spi/discovery/zk/internal/ZookeeperClient.java index b58f0ce..39417c2 100644 --- a/modules/zookeeper/src/main/java/org/apache/ignite/spi/discovery/zk/internal/ZookeeperClient.java +++ b/modules/zookeeper/src/main/java/org/apache/ignite/spi/discovery/zk/internal/ZookeeperClient.java @@ -504,9 +504,7 @@ public class ZookeeperClient implements Watcher { * @throws ZookeeperClientFailedException If connection to zk was lost. * @throws InterruptedException If interrupted. */ - List<String> getChildren(String path) - throws ZookeeperClientFailedException, InterruptedException - { + List<String> getChildren(String path) throws ZookeeperClientFailedException, InterruptedException { for (;;) { long connStartTime = this.connStartTime; @@ -520,29 +518,23 @@ public class ZookeeperClient implements Watcher { } /** + * Get children paths. + * * @param path Path. - * @return Children nodes. - * @throws KeeperException.NoNodeException If provided path does not exist. + * @return Children paths. * @throws ZookeeperClientFailedException If connection to zk was lost. * @throws InterruptedException If interrupted. */ - List<String> getChildrenIfPathExists(String path) throws - KeeperException.NoNodeException, InterruptedException, ZookeeperClientFailedException { - for (;;) { - long connStartTime = this.connStartTime; + List<String> getChildrenPaths(String path) throws ZookeeperClientFailedException, InterruptedException { + List<String> children = getChildren(path); - try { - return zk.getChildren(path, false); - } - catch (KeeperException.NoNodeException e) { - throw e; - } - catch (Exception e) { - onZookeeperError(connStartTime, e); - } - } - } + ArrayList<String> paths = new ArrayList(children.size()); + for (String child : children) + paths.add(path + "/" + child); + + return paths; + } /** * @param path Path. @@ -593,7 +585,7 @@ public class ZookeeperClient implements Watcher { * @throws ZookeeperClientFailedException If connection to zk was lost. * @throws InterruptedException If interrupted. */ - void deleteAll(@Nullable String parent, List<String> paths, int ver) + void deleteAll(List<String> paths, int ver) throws ZookeeperClientFailedException, InterruptedException { if (paths.isEmpty()) return; @@ -605,10 +597,8 @@ public class ZookeeperClient implements Watcher { List<Op> batch = new LinkedList<>(); for (String path : paths) { - String path0 = parent != null ? parent + "/" + path : path; - //TODO ZK: https://issues.apache.org/jira/browse/IGNITE-8187 - int size = requestOverhead(path0) + 17 /* overhead */; + int size = requestOverhead(path) + 17 /* overhead */; assert size <= MAX_REQ_SIZE; @@ -620,7 +610,7 @@ public class ZookeeperClient implements Watcher { batchSize = 0; } - batch.add(Op.delete(path0, ver)); + batch.add(Op.delete(path, ver)); batchSize += size; } http://git-wip-us.apache.org/repos/asf/ignite/blob/2cccfae4/modules/zookeeper/src/main/java/org/apache/ignite/spi/discovery/zk/internal/ZookeeperDiscoveryImpl.java ---------------------------------------------------------------------- diff --git a/modules/zookeeper/src/main/java/org/apache/ignite/spi/discovery/zk/internal/ZookeeperDiscoveryImpl.java b/modules/zookeeper/src/main/java/org/apache/ignite/spi/discovery/zk/internal/ZookeeperDiscoveryImpl.java index 4579efd..069b3e2 100644 --- a/modules/zookeeper/src/main/java/org/apache/ignite/spi/discovery/zk/internal/ZookeeperDiscoveryImpl.java +++ b/modules/zookeeper/src/main/java/org/apache/ignite/spi/discovery/zk/internal/ZookeeperDiscoveryImpl.java @@ -27,6 +27,7 @@ import java.util.Collections; import java.util.HashMap; import java.util.HashSet; import java.util.Iterator; +import java.util.LinkedList; import java.util.List; import java.util.Map; import java.util.Set; @@ -2263,33 +2264,27 @@ public class ZookeeperDiscoveryImpl { ZookeeperClient client = rtState.zkClient; - // TODO ZK: use multi, better batching + max-size safe + NoNodeException safe. - List<String> evtChildren = rtState.zkClient.getChildren(zkPaths.evtsPath); + List<String> batch = new LinkedList<>(); - for (String evtPath : evtChildren) { - String evtDir = zkPaths.evtsPath + "/" + evtPath; + List<String> evtChildren = client.getChildrenPaths(zkPaths.evtsPath); - removeChildren(evtDir); - } + for (String evtPath : evtChildren) + batch.addAll(client.getChildrenPaths(evtPath)); + + batch.addAll(evtChildren); - client.deleteAll(zkPaths.evtsPath, evtChildren, -1); + batch.addAll(client.getChildrenPaths(zkPaths.customEvtsDir)); - client.deleteAll(zkPaths.customEvtsDir, - client.getChildren(zkPaths.customEvtsDir), - -1); + batch.addAll(client.getChildrenPaths(zkPaths.customEvtsPartsDir)); - rtState.zkClient.deleteAll(zkPaths.customEvtsPartsDir, - rtState.zkClient.getChildren(zkPaths.customEvtsPartsDir), - -1); + batch.addAll(client.getChildrenPaths(zkPaths.customEvtsAcksDir)); - rtState.zkClient.deleteAll(zkPaths.customEvtsAcksDir, - rtState.zkClient.getChildren(zkPaths.customEvtsAcksDir), - -1); + client.deleteAll(batch, -1); if (startInternalOrder > 0) { - for (String alive : rtState.zkClient.getChildren(zkPaths.aliveNodesDir)) { + for (String alive : client.getChildren(zkPaths.aliveNodesDir)) { if (ZkIgnitePaths.aliveInternalId(alive) < startInternalOrder) - rtState.zkClient.deleteIfExists(zkPaths.aliveNodesDir + "/" + alive, -1); + client.deleteIfExists(zkPaths.aliveNodesDir + "/" + alive, -1); } } @@ -2302,14 +2297,6 @@ public class ZookeeperDiscoveryImpl { } /** - * @param path Path. - * @throws Exception If failed. - */ - private void removeChildren(String path) throws Exception { - rtState.zkClient.deleteAll(path, rtState.zkClient.getChildren(path), -1); - } - - /** * @param zkClient Client. * @param evtPath Event path. * @param sndNodeId Sender node ID. http://git-wip-us.apache.org/repos/asf/ignite/blob/2cccfae4/modules/zookeeper/src/test/java/org/apache/ignite/spi/discovery/zk/internal/ZookeeperClientTest.java ---------------------------------------------------------------------- diff --git a/modules/zookeeper/src/test/java/org/apache/ignite/spi/discovery/zk/internal/ZookeeperClientTest.java b/modules/zookeeper/src/test/java/org/apache/ignite/spi/discovery/zk/internal/ZookeeperClientTest.java index 0d64980..7c9ec51 100644 --- a/modules/zookeeper/src/test/java/org/apache/ignite/spi/discovery/zk/internal/ZookeeperClientTest.java +++ b/modules/zookeeper/src/test/java/org/apache/ignite/spi/discovery/zk/internal/ZookeeperClientTest.java @@ -196,12 +196,12 @@ public class ZookeeperClientTest extends GridCommonAbstractTest { client.createIfNeeded("/apacheIgnite/1", null, CreateMode.PERSISTENT); client.createIfNeeded("/apacheIgnite/2", null, CreateMode.PERSISTENT); - client.deleteAll("/apacheIgnite", Arrays.asList("1", "2"), -1); + client.deleteAll(Arrays.asList("/apacheIgnite/1", "/apacheIgnite/2"), -1); assertTrue(client.getChildren("/apacheIgnite").isEmpty()); client.createIfNeeded("/apacheIgnite/1", null, CreateMode.PERSISTENT); - client.deleteAll("/apacheIgnite", Collections.singletonList("1"), -1); + client.deleteAll(Collections.singletonList("/apacheIgnite/1"), -1); assertTrue(client.getChildren("/apacheIgnite").isEmpty()); } @@ -227,12 +227,7 @@ public class ZookeeperClientTest extends GridCommonAbstractTest { assertEquals(cnt, client.getChildren("/apacheIgnite").size()); - List<String> subPaths = new ArrayList<>(cnt); - - for (int i = 0; i < cnt; i++) - subPaths.add(String.valueOf(i)); - - client.deleteAll("/apacheIgnite", subPaths, -1); + client.deleteAll(paths, -1); assertTrue(client.getChildren("/apacheIgnite").isEmpty()); } @@ -249,7 +244,7 @@ public class ZookeeperClientTest extends GridCommonAbstractTest { client.createIfNeeded("/apacheIgnite/1", null, CreateMode.PERSISTENT); client.createIfNeeded("/apacheIgnite/2", null, CreateMode.PERSISTENT); - client.deleteAll("/apacheIgnite", Arrays.asList("1", "2", "3"), -1); + client.deleteAll(Arrays.asList("/apacheIgnite/1", "/apacheIgnite/2", "/apacheIgnite/3"), -1); assertTrue(client.getChildren("/apacheIgnite").isEmpty()); }