This is an automated email from the ASF dual-hosted git repository. jxue pushed a commit to branch metaclient in repository https://gitbox.apache.org/repos/asf/helix.git
commit 1dee8eee362b71abd0fcc16fa0f594220976dad6 Author: Grant Palau Spencer <[email protected]> AuthorDate: Sat Jun 3 11:00:33 2023 -0700 refactor, update with dataRecord --- .../metaclient/impl/zk/TestStressZkClient.java | 406 ++++++++++----------- 1 file changed, 183 insertions(+), 223 deletions(-) diff --git a/meta-client/src/test/java/org/apache/helix/metaclient/impl/zk/TestStressZkClient.java b/meta-client/src/test/java/org/apache/helix/metaclient/impl/zk/TestStressZkClient.java index 4b541ba74..5706dec7d 100644 --- a/meta-client/src/test/java/org/apache/helix/metaclient/impl/zk/TestStressZkClient.java +++ b/meta-client/src/test/java/org/apache/helix/metaclient/impl/zk/TestStressZkClient.java @@ -32,295 +32,254 @@ import org.apache.helix.metaclient.api.MetaClientInterface; import org.apache.helix.metaclient.datamodel.DataRecord; import org.apache.helix.metaclient.exception.MetaClientException; import org.apache.helix.metaclient.impl.zk.factory.ZkMetaClientConfig; +import org.apache.helix.metaclient.recipes.lock.DataRecordSerializer; import org.apache.helix.zookeeper.datamodel.ZNRecord; import org.apache.helix.zookeeper.datamodel.serializer.ZNRecordSerializer; import org.apache.helix.zookeeper.exception.ZkClientException; +import org.junit.Before; import org.testng.Assert; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import org.testng.annotations.AfterTest; +import org.testng.annotations.BeforeTest; import org.testng.annotations.Test; import static org.apache.helix.metaclient.api.MetaClientInterface.EntryMode.*; public class TestStressZkClient extends ZkMetaClientTestBase { - private static final long TEST_ITERATION_COUNT = 1000; - private static final Logger LOG = LoggerFactory.getLogger(TestStressZkClient.class); + private ZkMetaClient<String> _zkMetaClient; + private static final long TEST_ITERATION_COUNT = 10; + @BeforeTest + private void setUp() { + this._zkMetaClient = createZkMetaClient(); + this._zkMetaClient.connect(); + } + + @AfterTest + private void tearDown() { + this._zkMetaClient.close(); + } @Test public void testCreate() { String zkParentKey = "/stressZk_testCreate"; - try (ZkMetaClient<String> zkMetaClient = createZkMetaClient()) { - zkMetaClient.connect(); - zkMetaClient.create(zkParentKey, "parent_node"); + _zkMetaClient.create(zkParentKey, "parent_node"); - for (int i = 0; i < TEST_ITERATION_COUNT; i++) { - zkMetaClient.create(zkParentKey + "/" + i, i); - } + for (int i = 0; i < TEST_ITERATION_COUNT; i++) { + _zkMetaClient.create(zkParentKey + "/" + i, i); + } - for (int i = 0; i < TEST_ITERATION_COUNT; i++) { - Assert.assertEquals(String.valueOf(zkMetaClient.get(zkParentKey + "/" + i)), String.valueOf(i)); - } + for (int i = 0; i < TEST_ITERATION_COUNT; i++) { + Assert.assertEquals(String.valueOf(_zkMetaClient.get(zkParentKey + "/" + i)), String.valueOf(i)); + } - for (int i = 0; i < TEST_ITERATION_COUNT; i++) { - try { - zkMetaClient.create("/a/b/c", "invalid_path"); - Assert.fail("Should have failed with incorrect path."); - } catch (MetaClientException ignoredException) { - } + for (int i = 0; i < TEST_ITERATION_COUNT; i++) { + try { + _zkMetaClient.create("/a/b/c", "invalid_path"); + Assert.fail("Should have failed with incorrect path."); + } catch (MetaClientException ignoredException) { } + } - for (int i = 0; i < TEST_ITERATION_COUNT; i++) { - try { - zkMetaClient.create("a/b/c", "invalid_path"); - Assert.fail("Should have failed with invalid path - no leading /."); - } catch (Exception ignoredException) { - } + for (int i = 0; i < TEST_ITERATION_COUNT; i++) { + try { + _zkMetaClient.create("a/b/c", "invalid_path"); + Assert.fail("Should have failed with invalid path - no leading /."); + } catch (Exception ignoredException) { } // cleanup - zkMetaClient.recursiveDelete(zkParentKey); - Assert.assertEquals(zkMetaClient.countDirectChildren(zkParentKey), 0); + _zkMetaClient.recursiveDelete(zkParentKey); + Assert.assertEquals(_zkMetaClient.countDirectChildren(zkParentKey), 0); } } @Test public void testCreateContainer() { final String zkParentKey = "/stressZk_testCreateContainer"; - try (ZkMetaClient<String> zkMetaClient = createZkMetaClient()) { - zkMetaClient.connect(); - zkMetaClient.create(zkParentKey, "parent_node"); + _zkMetaClient.create(zkParentKey, "parent_node"); - for (int i = 0; i < TEST_ITERATION_COUNT; i++) { - zkMetaClient.create(zkParentKey + "/" + i, i, CONTAINER); - } - - for (int i = 0; i < TEST_ITERATION_COUNT; i++) { - Assert.assertEquals(String.valueOf(zkMetaClient.get(zkParentKey + "/" + i)), String.valueOf(i)); - } + for (int i = 0; i < TEST_ITERATION_COUNT; i++) { + _zkMetaClient.create(zkParentKey + "/" + i, i, CONTAINER); + } - // cleanup - zkMetaClient.recursiveDelete(zkParentKey); - Assert.assertEquals(zkMetaClient.countDirectChildren(zkParentKey), 0); + for (int i = 0; i < TEST_ITERATION_COUNT; i++) { + Assert.assertEquals(String.valueOf(_zkMetaClient.get(zkParentKey + "/" + i)), String.valueOf(i)); } + + // cleanup + _zkMetaClient.recursiveDelete(zkParentKey); + Assert.assertEquals(_zkMetaClient.countDirectChildren(zkParentKey), 0); } @Test public void testGet() { final String zkParentKey = "/stressZk_testGet"; - try (ZkMetaClient<String> zkMetaClient = createZkMetaClient()) { - zkMetaClient.connect(); - zkMetaClient.create(zkParentKey, "parent_node"); + _zkMetaClient.create(zkParentKey, "parent_node"); - for (int i = 0; i < TEST_ITERATION_COUNT; i++) { - zkMetaClient.create(zkParentKey + "/" + i, i); - } + for (int i = 0; i < TEST_ITERATION_COUNT; i++) { + _zkMetaClient.create(zkParentKey + "/" + i, i); + } - for (int i = 0; i < TEST_ITERATION_COUNT; i++) { - Assert.assertEquals(zkMetaClient.get(zkParentKey + "/" + i), i); - } + for (int i = 0; i < TEST_ITERATION_COUNT; i++) { + Assert.assertEquals(_zkMetaClient.get(zkParentKey + "/" + i), i); + } - // Test with non-existent node path - for (int i = 0; i < TEST_ITERATION_COUNT; i++) { - Assert.assertNull(zkMetaClient.get("/a/b/c")); - } + // Test with non-existent node path + for (int i = 0; i < TEST_ITERATION_COUNT; i++) { + Assert.assertNull(_zkMetaClient.get("/a/b/c")); + } - for (int i = 0; i < TEST_ITERATION_COUNT; i++) { - try { - zkMetaClient.get("a/b/c"); - Assert.fail("Should have failed due to invalid path - no leading /."); - } catch (Exception ignoredException) { - } - } + for (int i = 0; i < TEST_ITERATION_COUNT; i++) { + try { + _zkMetaClient.get("a/b/c"); + Assert.fail("Should have failed due to invalid path - no leading /."); + } catch (Exception ignoredException) { + } // cleanup - zkMetaClient.recursiveDelete(zkParentKey); - Assert.assertEquals(zkMetaClient.countDirectChildren(zkParentKey), 0); + _zkMetaClient.recursiveDelete(zkParentKey); + Assert.assertEquals(_zkMetaClient.countDirectChildren(zkParentKey), 0); } } @Test public void testSetSingleNode() { final String zkParentKey = "/stressZk_testSetSingleNode"; - try (ZkMetaClient<String> zkMetaClient = createZkMetaClient()) { - zkMetaClient.connect(); - zkMetaClient.create(zkParentKey, "parent_node"); - - // Set with no expected version - for (int i = 0; i < TEST_ITERATION_COUNT; i++) { - zkMetaClient.set(zkParentKey, String.valueOf(i), -1); - MetaClientInterface.Stat entryStat = zkMetaClient.exists(zkParentKey); + _zkMetaClient.create(zkParentKey, "parent_node"); - Assert.assertEquals(zkMetaClient.get(zkParentKey), String.valueOf(i)); - Assert.assertEquals(entryStat.getVersion(), i + 1); - Assert.assertEquals(entryStat.getEntryType().name(), PERSISTENT.name()); - } + // Set with no expected version + for (int i = 0; i < TEST_ITERATION_COUNT; i++) { + _zkMetaClient.set(zkParentKey, String.valueOf(i), -1); + MetaClientInterface.Stat entryStat = _zkMetaClient.exists(zkParentKey); - zkMetaClient.delete(zkParentKey); - zkMetaClient.create(zkParentKey, "parent_node"); + Assert.assertEquals(_zkMetaClient.get(zkParentKey), String.valueOf(i)); + Assert.assertEquals(entryStat.getVersion(), i + 1); + Assert.assertEquals(entryStat.getEntryType().name(), PERSISTENT.name()); + } - // Set with expected version - for (int i = 0; i < TEST_ITERATION_COUNT; i++) { - zkMetaClient.set(zkParentKey, String.valueOf(i), i); - MetaClientInterface.Stat entryStat = zkMetaClient.exists(zkParentKey); + _zkMetaClient.delete(zkParentKey); + _zkMetaClient.create(zkParentKey, "parent_node"); - Assert.assertEquals(zkMetaClient.get(zkParentKey), String.valueOf(i)); - Assert.assertEquals(entryStat.getVersion(), i + 1); - } + // Set with expected version + for (int i = 0; i < TEST_ITERATION_COUNT; i++) { + _zkMetaClient.set(zkParentKey, String.valueOf(i), i); + MetaClientInterface.Stat entryStat = _zkMetaClient.exists(zkParentKey); - zkMetaClient.delete(zkParentKey); - zkMetaClient.create(zkParentKey, "parent_node"); + Assert.assertEquals(_zkMetaClient.get(zkParentKey), String.valueOf(i)); + Assert.assertEquals(entryStat.getVersion(), i + 1); + } - // Set with bad expected version - should fail - for (int i = 0; i < TEST_ITERATION_COUNT; i++) { - try { - zkMetaClient.set(zkParentKey, "test-should-fail", 12345); - Assert.fail("Should have failed due to bad expected version in set function."); - } catch (MetaClientException ex) { - Assert.assertEquals(ex.getClass().getName(), - "org.apache.helix.metaclient.exception.MetaClientBadVersionException"); - } + _zkMetaClient.delete(zkParentKey); + _zkMetaClient.create(zkParentKey, "parent_node"); + + // Set with bad expected version - should fail + for (int i = 0; i < TEST_ITERATION_COUNT; i++) { + try { + _zkMetaClient.set(zkParentKey, "test-should-fail", 12345); + Assert.fail("Should have failed due to bad expected version in set function."); + } catch (MetaClientException ex) { + Assert.assertEquals(ex.getClass().getName(), + "org.apache.helix.metaclient.exception.MetaClientBadVersionException"); } - - zkMetaClient.delete(zkParentKey); - zkMetaClient.create(zkParentKey, "parent_node"); + } + _zkMetaClient.delete(zkParentKey); + _zkMetaClient.create(zkParentKey, "parent_node"); // Set with path to non-existent node - should fail for (int i = 0; i < TEST_ITERATION_COUNT; i++) { try { - zkMetaClient.set("/a/b/c", "test-should-fail", -1); + _zkMetaClient.set("/a/b/c", "test-should-fail", -1); Assert.fail("Should have failed due to path to non-existent node"); } catch (Exception ignoredException) { } } - zkMetaClient.delete(zkParentKey); - zkMetaClient.create(zkParentKey, "parent_node"); + _zkMetaClient.delete(zkParentKey); + _zkMetaClient.create(zkParentKey, "parent_node"); // Set with invalid path - should fail for (int i = 0; i < TEST_ITERATION_COUNT; i++) { try { - zkMetaClient.set("a/b/c", "test-should-fail", -1); + _zkMetaClient.set("a/b/c", "test-should-fail", -1); Assert.fail("Should have failed due to invalid path - no leading /."); } catch (Exception ignoredException) { } } // cleanup - zkMetaClient.recursiveDelete(zkParentKey); - Assert.assertEquals(zkMetaClient.countDirectChildren(zkParentKey), 0); + _zkMetaClient.recursiveDelete(zkParentKey); + Assert.assertEquals(_zkMetaClient.countDirectChildren(zkParentKey), 0); } - } @Test public void testSetMultiNode() { final String zkParentKey = "/stressZk_testSetMultiNode"; - try (ZkMetaClient<String> zkMetaClient = createZkMetaClient()) { - zkMetaClient.connect(); - zkMetaClient.create(zkParentKey, "parent_node"); + _zkMetaClient.create(zkParentKey, "parent_node"); - for (int i = 0; i < TEST_ITERATION_COUNT; i++) { - zkMetaClient.create(zkParentKey + "/" + i, i); - } - - // Set with no expected version - for (int i = 0; i < TEST_ITERATION_COUNT; i++) { - zkMetaClient.set(zkParentKey + "/" + i, "-" + i, -1); - } + for (int i = 0; i < TEST_ITERATION_COUNT; i++) { + _zkMetaClient.create(zkParentKey + "/" + i, i); + } - for (int i = 0; i < TEST_ITERATION_COUNT; i++) { - String childKey = zkParentKey + "/" + i; - MetaClientInterface.Stat entryStat = zkMetaClient.exists(childKey); + // Set with no expected version + for (int i = 0; i < TEST_ITERATION_COUNT; i++) { + _zkMetaClient.set(zkParentKey + "/" + i, "-" + i, -1); + } - Assert.assertEquals(zkMetaClient.get(childKey), "-" + i); - Assert.assertEquals(entryStat.getVersion(), 1); - Assert.assertEquals(entryStat.getEntryType().name(), PERSISTENT.name()); - } + for (int i = 0; i < TEST_ITERATION_COUNT; i++) { + String childKey = zkParentKey + "/" + i; + MetaClientInterface.Stat entryStat = _zkMetaClient.exists(childKey); - // Set with expected version - for (int i = 0; i < TEST_ITERATION_COUNT; i++) { - String childKey = zkParentKey + "/" + i; - zkMetaClient.set(childKey, String.valueOf(i), 1); - MetaClientInterface.Stat entryStat = zkMetaClient.exists(childKey); + Assert.assertEquals(_zkMetaClient.get(childKey), "-" + i); + Assert.assertEquals(entryStat.getVersion(), 1); + Assert.assertEquals(entryStat.getEntryType().name(), PERSISTENT.name()); + } - Assert.assertEquals(zkMetaClient.get(childKey), String.valueOf(i)); - Assert.assertEquals(entryStat.getVersion(), 2); - } + // Set with expected version + for (int i = 0; i < TEST_ITERATION_COUNT; i++) { + String childKey = zkParentKey + "/" + i; + _zkMetaClient.set(childKey, String.valueOf(i), 1); + MetaClientInterface.Stat entryStat = _zkMetaClient.exists(childKey); - // cleanup - zkMetaClient.recursiveDelete(zkParentKey); - Assert.assertEquals(zkMetaClient.countDirectChildren(zkParentKey), 0); + Assert.assertEquals(_zkMetaClient.get(childKey), String.valueOf(i)); + Assert.assertEquals(entryStat.getVersion(), 2); } + + // cleanup + _zkMetaClient.recursiveDelete(zkParentKey); + Assert.assertEquals(_zkMetaClient.countDirectChildren(zkParentKey), 0); } @Test public void testUpdateSingleNode() { final String zkParentKey = "/stressZk_testUpdateSingleNode"; ZkMetaClientConfig config = - new ZkMetaClientConfig.ZkMetaClientConfigBuilder().setConnectionAddress(ZK_ADDR).build(); - try (ZkMetaClient<byte[]> zkMetaClient = new ZkMetaClient<>(config)) { + new ZkMetaClientConfig.ZkMetaClientConfigBuilder().setConnectionAddress(ZK_ADDR) + .setZkSerializer(new DataRecordSerializer()).build(); + try (ZkMetaClient<DataRecord> zkMetaClient = new ZkMetaClient<>(config)) { zkMetaClient.connect(); - ZNRecord record = new ZNRecord("foo"); - record.setIntField("key", 0); - ZNRecordSerializer serializer = new ZNRecordSerializer(); - zkMetaClient.create(zkParentKey, serializer.serialize(record)); + DataRecord record = new DataRecord(zkParentKey); + record.setIntField("key", 0); + zkMetaClient.create(zkParentKey, record); for (int i = 0; i < TEST_ITERATION_COUNT; i++) { MetaClientInterface.Stat entryStat = zkMetaClient.exists(zkParentKey); Assert.assertEquals(entryStat.getVersion(), i); - byte[] newData = zkMetaClient.update(zkParentKey, new DataUpdater<byte[]>() { + DataRecord newData = zkMetaClient.update(zkParentKey, new DataUpdater<DataRecord>() { @Override - public byte[] update(byte[] currentData) { - ZNRecordSerializer serializer = new ZNRecordSerializer(); - ZNRecord record = (ZNRecord) serializer.deserialize(currentData); - int value = record.getIntField("key", 0); - record.setIntField("key", value + 1); - return serializer.serialize(record); + public DataRecord update(DataRecord currentData) { + int value = currentData.getIntField("key", 0); + currentData.setIntField("key", value + 1); + return currentData; } }); - ZNRecord newRecord = (ZNRecord) serializer.deserialize(newData); - Assert.assertEquals(newRecord.getIntField("key", 0), i+1); + Assert.assertEquals(newData.getIntField("key", 0), i+1); } - -// zkMetaClient.delete(zkParentKey); -// zkMetaClient.create(zkParentKey, "parent_node"); - -// Set with path to non-existent node - should fail -// for (int i = 0; i < TEST_ITERATION_COUNT; i++) { -// try { -// zkMetaClient.update("/a/b/c", new DataUpdater<Integer>() { -// @Override -// public Integer update(Integer currentData) { -// return currentData + 1; -// } -// }); -// -// Assert.fail("Should have failed due to path to non-existent node"); -// } catch (Exception ignoredException) { -// } -// } - -// zkMetaClient.delete(zkParentKey); -// zkMetaClient.create(zkParentKey, "parent_node"); - - // Set with invalid path - should fail -// for (int i = 0; i < TEST_ITERATION_COUNT; i++) { -// try { -// zkMetaClient.update("/a/b/c", new DataUpdater<Integer>() { -// @Override -// public Integer update(Integer currentData) { -// return currentData + 1; -// } -// }); -// Assert.fail("Should have failed due to invalid path - no leading /."); -// } catch (Exception ignoredException) { -// } -// } - // cleanup zkMetaClient.recursiveDelete(zkParentKey); Assert.assertEquals(zkMetaClient.countDirectChildren(zkParentKey), 0); @@ -329,15 +288,20 @@ public class TestStressZkClient extends ZkMetaClientTestBase { @Test public void testUpdateMultiNode() { - final String zkParentKey = "/stressZk_testUpdateSingleNode"; + final String zkParentKey = "/stressZk_testUpdateMultiNode"; ZkMetaClientConfig config = - new ZkMetaClientConfig.ZkMetaClientConfigBuilder().setConnectionAddress(ZK_ADDR).build(); - try (ZkMetaClient<Integer> zkMetaClient = new ZkMetaClient<>(config)) { + new ZkMetaClientConfig.ZkMetaClientConfigBuilder().setConnectionAddress(ZK_ADDR) + .setZkSerializer(new DataRecordSerializer()).build(); + try (ZkMetaClient<DataRecord> zkMetaClient = new ZkMetaClient<>(config)) { zkMetaClient.connect(); - zkMetaClient.create(zkParentKey, "test_parent"); + DataRecord parentRecord = new DataRecord(zkParentKey); + zkMetaClient.create(zkParentKey, parentRecord); for (int i = 0; i < TEST_ITERATION_COUNT; i++) { - zkMetaClient.create(zkParentKey + "/" + i, 0); + String childKey = zkParentKey + "/" + i; + DataRecord record = new DataRecord(childKey); + record.setIntField("key", 0); + zkMetaClient.create(childKey, record); } for (int i = 0; i < TEST_ITERATION_COUNT; i++) { @@ -345,14 +309,16 @@ public class TestStressZkClient extends ZkMetaClientTestBase { MetaClientInterface.Stat entryStat = zkMetaClient.exists(childKey); Assert.assertEquals(entryStat.getVersion(), 0); - Integer newData = zkMetaClient.update(childKey, new DataUpdater<Integer>() { + DataRecord newData = zkMetaClient.update(childKey, new DataUpdater<DataRecord>() { @Override - public Integer update(Integer currentData) { - return currentData + 1; + public DataRecord update(DataRecord currentData) { + int value = currentData.getIntField("key", 0); + currentData.setIntField("key", value + 1); + return currentData; } }); - Assert.assertEquals((int) newData, 1); + Assert.assertEquals(newData.getIntField("key",0), 1); entryStat = zkMetaClient.exists(childKey); Assert.assertEquals(entryStat.getVersion(), 1); } @@ -370,43 +336,37 @@ public class TestStressZkClient extends ZkMetaClientTestBase { final String testData = "test-data"; final AtomicBoolean dataExpected = new AtomicBoolean(true); - try (ZkMetaClient<String> zkMetaClient = createZkMetaClient()) { - zkMetaClient.connect(); - zkMetaClient.create(zkParentKey, "parent_node"); - Map<String, Set<DataChangeListener>> listeners = new HashMap<>(); - CountDownLatch countDownLatch = new CountDownLatch((int) TEST_ITERATION_COUNT * listenerCount); + _zkMetaClient.create(zkParentKey, "parent_node"); + CountDownLatch countDownLatch = new CountDownLatch((int) TEST_ITERATION_COUNT * listenerCount); - for (int i = 0; i < TEST_ITERATION_COUNT; i++) { - zkMetaClient.create(zkParentKey + "/" + i, i); - } + for (int i = 0; i < TEST_ITERATION_COUNT; i++) { + _zkMetaClient.create(zkParentKey + "/" + i, i); + } - // create paths - for (int i = 0; i < TEST_ITERATION_COUNT; i++) { - String childKey = zkParentKey + "/" + i; - listeners.put(childKey, new HashSet<>()); - for (int j = 0; j < listenerCount; j++) { - DataChangeListener listener = new DataChangeListener() { - @Override - public void handleDataChange(String key, Object data, ChangeType changeType) { - countDownLatch.countDown(); - dataExpected.set(dataExpected.get() && testData.equals(data)); - } - }; - listeners.get(childKey).add(listener); - zkMetaClient.subscribeDataChange(childKey, listener, false); - } + // create paths + for (int i = 0; i < TEST_ITERATION_COUNT; i++) { + String childKey = zkParentKey + "/" + i; + for (int j = 0; j < listenerCount; j++) { + DataChangeListener listener = new DataChangeListener() { + @Override + public void handleDataChange(String key, Object data, ChangeType changeType) { + countDownLatch.countDown(); + dataExpected.set(dataExpected.get() && testData.equals(data)); + } + }; + _zkMetaClient.subscribeDataChange(childKey, listener, false); } + } - for (int i = 0; i < TEST_ITERATION_COUNT; i++) { - zkMetaClient.set(zkParentKey + "/" + i, testData, -1); - } + for (int i = 0; i < TEST_ITERATION_COUNT; i++) { + _zkMetaClient.set(zkParentKey + "/" + i, testData, -1); + } - Assert.assertTrue(countDownLatch.await(5000, TimeUnit.MILLISECONDS)); - Assert.assertTrue(dataExpected.get()); + Assert.assertTrue(countDownLatch.await(5000, TimeUnit.MILLISECONDS)); + Assert.assertTrue(dataExpected.get()); - // cleanup - zkMetaClient.recursiveDelete(zkParentKey); - Assert.assertEquals(zkMetaClient.countDirectChildren(zkParentKey), 0); - } + // cleanup + _zkMetaClient.recursiveDelete(zkParentKey); + Assert.assertEquals(_zkMetaClient.countDirectChildren(zkParentKey), 0); } } \ No newline at end of file
