This is an automated email from the ASF dual-hosted git repository. tison pushed a commit to branch CURATOR-690.-CuratorCache-fails-to-load-the-cache-if-there-are-more-than-64K-child-ZNodes in repository https://gitbox.apache.org/repos/asf/curator.git
commit 929a89f6f09329c8597f0483c4b035ebc6525d48 Author: tison <wander4...@gmail.com> AuthorDate: Fri Sep 15 01:48:48 2023 +0800 speed up tests Signed-off-by: tison <wander4...@gmail.com> --- .../framework/recipes/cache/CuratorCacheImpl.java | 8 ++++-- .../framework/recipes/cache/TestCuratorCache.java | 33 ++++++++++++++++------ .../org/apache/curator/test/BaseClassForTests.java | 2 +- 3 files changed, 30 insertions(+), 13 deletions(-) diff --git a/curator-recipes/src/main/java/org/apache/curator/framework/recipes/cache/CuratorCacheImpl.java b/curator-recipes/src/main/java/org/apache/curator/framework/recipes/cache/CuratorCacheImpl.java index 99913f4d..50760dd2 100644 --- a/curator-recipes/src/main/java/org/apache/curator/framework/recipes/cache/CuratorCacheImpl.java +++ b/curator-recipes/src/main/java/org/apache/curator/framework/recipes/cache/CuratorCacheImpl.java @@ -19,7 +19,9 @@ package org.apache.curator.framework.recipes.cache; -import static org.apache.curator.framework.recipes.cache.CuratorCacheListener.Type.*; +import static org.apache.curator.framework.recipes.cache.CuratorCacheListener.Type.NODE_CHANGED; +import static org.apache.curator.framework.recipes.cache.CuratorCacheListener.Type.NODE_CREATED; +import static org.apache.curator.framework.recipes.cache.CuratorCacheListener.Type.NODE_DELETED; import static org.apache.zookeeper.KeeperException.Code.NONODE; import static org.apache.zookeeper.KeeperException.Code.OK; import com.google.common.annotations.VisibleForTesting; @@ -64,8 +66,8 @@ class CuratorCacheImpl implements CuratorCache, CuratorCacheBridge { protected boolean onAdvance(int phase, int registeredParties) { callListeners(CuratorCacheListener::initialized); synchronized (CuratorCacheImpl.this) { - currentChildPhaser = rootPhaser; - } + currentChildPhaser = rootPhaser; + } return true; } }; diff --git a/curator-recipes/src/test/java/org/apache/curator/framework/recipes/cache/TestCuratorCache.java b/curator-recipes/src/test/java/org/apache/curator/framework/recipes/cache/TestCuratorCache.java index adfc0e41..fe37d674 100644 --- a/curator-recipes/src/test/java/org/apache/curator/framework/recipes/cache/TestCuratorCache.java +++ b/curator-recipes/src/test/java/org/apache/curator/framework/recipes/cache/TestCuratorCache.java @@ -23,11 +23,14 @@ import static org.apache.curator.framework.recipes.cache.CuratorCache.Options.DO import static org.apache.curator.framework.recipes.cache.CuratorCacheListener.builder; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertTrue; +import java.util.ArrayList; +import java.util.List; import java.util.concurrent.CountDownLatch; import java.util.concurrent.Semaphore; import java.util.concurrent.atomic.AtomicInteger; import org.apache.curator.framework.CuratorFramework; import org.apache.curator.framework.CuratorFrameworkFactory; +import org.apache.curator.framework.api.transaction.CuratorOp; import org.apache.curator.retry.RetryOneTime; import org.apache.curator.test.compatibility.CuratorTestBase; import org.junit.jupiter.api.Tag; @@ -186,7 +189,10 @@ public class TestCuratorCache extends CuratorTestBase { final CuratorCacheStorage storage = new StandardCuratorCacheStorage(false); // Phaser has a hard-limit of 64k registrants; we need to create more than that to trigger the initial problem. - final int zNodeCount = 0xffff + 5; + final int zNodeCount = 0xFFFF + 5; + + // Bulk creations in multiOp for (1) speed up creations (2) not exceed jute.maxbuffer size. + final int bulkSize = 10000; try (CuratorFramework client = CuratorFrameworkFactory.newClient( server.getConnectString(), timing.session(), timing.connection(), new RetryOneTime(1))) { @@ -194,20 +200,29 @@ public class TestCuratorCache extends CuratorTestBase { final CountDownLatch initializedLatch = new CountDownLatch(1); client.create().creatingParentsIfNeeded().forPath("/test"); - + final List<CuratorOp> creations = new ArrayList<>(); for (int i = 0; i < zNodeCount; i++) { - client.create().forPath("/test/node_" + i); + creations.add(client.transactionOp().create().forPath("/test/node_" + i)); + if (creations.size() > bulkSize) { + client.transaction().forOperations(creations); + creations.clear(); + } } + client.transaction().forOperations(creations); + creations.clear(); - try (CuratorCache cache = CuratorCache.builder(client, "/test").withStorage(storage).build()) { - cache.listenable() - .addListener(builder() - .forInitialized(() -> initializedLatch.countDown()) - .build()); + try (CuratorCache cache = + CuratorCache.builder(client, "/test").withStorage(storage).build()) { + final CuratorCacheListener listener = + builder().forInitialized(initializedLatch::countDown).build(); + cache.listenable().addListener(listener); cache.start(); assertTrue(timing.awaitLatch(initializedLatch)); - assertEquals(zNodeCount + 1, cache.size(), "Cache size should be equal to the number of zNodes created plus the root"); + assertEquals( + zNodeCount + 1, + cache.size(), + "Cache size should be equal to the number of zNodes created plus the root"); } } } diff --git a/curator-test/src/main/java/org/apache/curator/test/BaseClassForTests.java b/curator-test/src/main/java/org/apache/curator/test/BaseClassForTests.java index 76a87ad8..b66a7e52 100644 --- a/curator-test/src/main/java/org/apache/curator/test/BaseClassForTests.java +++ b/curator-test/src/main/java/org/apache/curator/test/BaseClassForTests.java @@ -30,7 +30,7 @@ import org.slf4j.LoggerFactory; public class BaseClassForTests { protected volatile TestingServer server; - private final Logger log = LoggerFactory.getLogger(getClass()); + protected final Logger log = LoggerFactory.getLogger(getClass()); private final AtomicBoolean isRetrying = new AtomicBoolean(false); private static final String INTERNAL_PROPERTY_DONT_LOG_CONNECTION_ISSUES;