This is an automated email from the ASF dual-hosted git repository. hulee pushed a commit to branch zooscalability in repository https://gitbox.apache.org/repos/asf/helix.git
commit 3f29468f5c4fee4b2a60d11af58fea6dfd1ae8f0 Author: Neal Sun <[email protected]> AuthorDate: Wed Feb 26 14:07:39 2020 -0800 Add getShardingKeyInPath to MetadataStoreRoutingData (#817) Add getShardingKeyInPath to MetadataStoreRoutingData --- .../datamodel/MetadataStoreRoutingData.java | 11 ++++++++ .../helix/msdcommon/datamodel/TrieRoutingData.java | 14 ++++++++++ .../msdcommon/datamodel/TestTrieRoutingData.java | 31 ++++++++++++++++++++++ 3 files changed, 56 insertions(+) diff --git a/metadata-store-directory-common/src/main/java/org/apache/helix/msdcommon/datamodel/MetadataStoreRoutingData.java b/metadata-store-directory-common/src/main/java/org/apache/helix/msdcommon/datamodel/MetadataStoreRoutingData.java index 2bab8c7..25e5c7e 100644 --- a/metadata-store-directory-common/src/main/java/org/apache/helix/msdcommon/datamodel/MetadataStoreRoutingData.java +++ b/metadata-store-directory-common/src/main/java/org/apache/helix/msdcommon/datamodel/MetadataStoreRoutingData.java @@ -22,6 +22,7 @@ package org.apache.helix.msdcommon.datamodel; import java.util.Map; import java.util.NoSuchElementException; + public interface MetadataStoreRoutingData { /** * Given a path, return all the "metadata store sharding key-metadata store realm address" pairs @@ -47,6 +48,16 @@ public interface MetadataStoreRoutingData { String getMetadataStoreRealm(String path) throws IllegalArgumentException, NoSuchElementException; /** + * Given a path, return the sharding key contained in the path. If the path doesn't contain a + * sharding key, throw NoSuchElementException. + * @param path - the path that may contain a sharding key + * @return the sharding key contained in the path + * @throws IllegalArgumentException - when the path is invalid + * @throws NoSuchElementException - when the path doesn't contain a sharding key + */ + String getShardingKeyInPath(String path) throws IllegalArgumentException, NoSuchElementException; + + /** * Check if the provided sharding key can be inserted to the routing data. The insertion is * invalid if: 1. the sharding key is a parent key to an existing sharding key; 2. the sharding * key has a parent key that is an existing sharding key; 3. the sharding key already exists. In diff --git a/metadata-store-directory-common/src/main/java/org/apache/helix/msdcommon/datamodel/TrieRoutingData.java b/metadata-store-directory-common/src/main/java/org/apache/helix/msdcommon/datamodel/TrieRoutingData.java index 7a05089..0f53c23 100644 --- a/metadata-store-directory-common/src/main/java/org/apache/helix/msdcommon/datamodel/TrieRoutingData.java +++ b/metadata-store-directory-common/src/main/java/org/apache/helix/msdcommon/datamodel/TrieRoutingData.java @@ -98,6 +98,20 @@ public class TrieRoutingData implements MetadataStoreRoutingData { return node.getRealmAddress(); } + public String getShardingKeyInPath(String path) + throws IllegalArgumentException, NoSuchElementException { + if (!ZkValidationUtil.isPathValid(path)) { + throw new IllegalArgumentException("Provided path is not a valid Zookeeper path: " + path); + } + + TrieNode node = getLongestPrefixNodeAlongPath(path); + if (!node.isShardingKey()) { + throw new NoSuchElementException( + "No sharding key found within the provided path. Path: " + path); + } + return node.getPath(); + } + public boolean isShardingKeyInsertionValid(String shardingKey) { if (!ZkValidationUtil.isPathValid(shardingKey)) { throw new IllegalArgumentException( diff --git a/metadata-store-directory-common/src/test/java/org/apache/helix/msdcommon/datamodel/TestTrieRoutingData.java b/metadata-store-directory-common/src/test/java/org/apache/helix/msdcommon/datamodel/TestTrieRoutingData.java index bad10a4..2dc5dfe 100644 --- a/metadata-store-directory-common/src/test/java/org/apache/helix/msdcommon/datamodel/TestTrieRoutingData.java +++ b/metadata-store-directory-common/src/test/java/org/apache/helix/msdcommon/datamodel/TestTrieRoutingData.java @@ -255,6 +255,37 @@ public class TestTrieRoutingData { } @Test(dependsOnMethods = "testConstructionNormal") + public void testGetShardingKeyInPath() { + try { + Assert.assertEquals(_trie.getShardingKeyInPath("/b/c/d/x/y/z"), "/b/c/d"); + } catch (NoSuchElementException e) { + Assert.fail("Not expecting NoSuchElementException"); + } + } + + @Test(dependsOnMethods = "testConstructionNormal") + public void testGetShardingKeyInPathWrongPath() { + try { + _trie.getShardingKeyInPath("/x/y/z"); + Assert.fail("Expecting NoSuchElementException"); + } catch (NoSuchElementException e) { + Assert.assertTrue( + e.getMessage().contains("No sharding key found within the provided path. Path: /x/y/z")); + } + } + + @Test(dependsOnMethods = "testConstructionNormal") + public void testGetShardingKeyInPathNoLeaf() { + try { + _trie.getShardingKeyInPath("/b/c"); + Assert.fail("Expecting NoSuchElementException"); + } catch (NoSuchElementException e) { + Assert.assertTrue( + e.getMessage().contains("No sharding key found within the provided path. Path: /b/c")); + } + } + + @Test(dependsOnMethods = "testConstructionNormal") public void testIsShardingKeyInsertionValidNoSlash() { try { _trie.isShardingKeyInsertionValid("x/y/z");
