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
The following commit(s) were added to refs/heads/zooscalability by this push:
new 478c60a Add getShardingKeyInPath to MetadataStoreRoutingData (#817)
478c60a is described below
commit 478c60a8ec7ea0632c7c6ffa27c3394befdcc3ee
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");