You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@helix.apache.org by jx...@apache.org on 2018/01/17 23:48:05 UTC

helix git commit: Add instance support for CriteriaEvalutator

Repository: helix
Updated Branches:
  refs/heads/master 16f4a9b7c -> 03e8580ec


Add instance support for CriteriaEvalutator


Project: http://git-wip-us.apache.org/repos/asf/helix/repo
Commit: http://git-wip-us.apache.org/repos/asf/helix/commit/03e8580e
Tree: http://git-wip-us.apache.org/repos/asf/helix/tree/03e8580e
Diff: http://git-wip-us.apache.org/repos/asf/helix/diff/03e8580e

Branch: refs/heads/master
Commit: 03e8580ec21fe233a56dc664b4fb02368bfa6943
Parents: 16f4a9b
Author: Junkai Xue <jx...@linkedin.com>
Authored: Thu Jan 11 13:32:50 2018 -0800
Committer: Junkai Xue <jx...@linkedin.com>
Committed: Thu Jan 11 13:32:50 2018 -0800

----------------------------------------------------------------------
 .../main/java/org/apache/helix/PropertyKey.java |  8 +++
 .../helix/messaging/CriteriaEvaluator.java      | 68 +++++++++++---------
 2 files changed, 46 insertions(+), 30 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/helix/blob/03e8580e/helix-core/src/main/java/org/apache/helix/PropertyKey.java
----------------------------------------------------------------------
diff --git a/helix-core/src/main/java/org/apache/helix/PropertyKey.java b/helix-core/src/main/java/org/apache/helix/PropertyKey.java
index 20cb833..fb4b4cc 100644
--- a/helix-core/src/main/java/org/apache/helix/PropertyKey.java
+++ b/helix-core/src/main/java/org/apache/helix/PropertyKey.java
@@ -310,6 +310,14 @@ public class PropertyKey {
     public PropertyKey instances() {
       return new PropertyKey(PropertyType.INSTANCES, null, _clusterName);
     }
+    
+    /**
+     * Get a property key associated with specified instance
+     * @return {@link PropertyKey}
+     */
+    public PropertyKey instance(String instanceName) {
+      return new PropertyKey(PropertyType.INSTANCES, null, _clusterName, instanceName);
+    }
 
     /**
      * Get a property key associated with {@link Message} for an instance

http://git-wip-us.apache.org/repos/asf/helix/blob/03e8580e/helix-core/src/main/java/org/apache/helix/messaging/CriteriaEvaluator.java
----------------------------------------------------------------------
diff --git a/helix-core/src/main/java/org/apache/helix/messaging/CriteriaEvaluator.java b/helix-core/src/main/java/org/apache/helix/messaging/CriteriaEvaluator.java
index 398ef2b..bf0f103 100644
--- a/helix-core/src/main/java/org/apache/helix/messaging/CriteriaEvaluator.java
+++ b/helix-core/src/main/java/org/apache/helix/messaging/CriteriaEvaluator.java
@@ -41,6 +41,7 @@ import com.google.common.collect.Sets;
 
 public class CriteriaEvaluator {
   private static Logger logger = Logger.getLogger(CriteriaEvaluator.class);
+  public static final String MATCH_ALL_SYM = "%";
 
   /**
    * Examine persisted data to match wildcards in {@link Criteria}
@@ -55,38 +56,29 @@ public class CriteriaEvaluator {
 
     List<HelixProperty> properties;
     DataSource dataSource = recipientCriteria.getDataSource();
-    if (dataSource == DataSource.EXTERNALVIEW) {
-      String resourceName = recipientCriteria.getResource();
-      if (Strings.isNullOrEmpty(resourceName)) {
-        properties = accessor.getChildValues(keyBuilder.externalViews());
-      } else {
-        HelixProperty data = accessor.getProperty(keyBuilder.externalView(resourceName));
-        if (data == null) {
-          throw new HelixException(
-              String.format("Specified resource %s externalView is not found!", resourceName));
-        }
-        properties = Collections.singletonList(data);
-      }
-    } else if (dataSource == DataSource.IDEALSTATES) {
-      String resourceName = recipientCriteria.getResource();
-      if (Strings.isNullOrEmpty(resourceName)) {
-        properties = accessor.getChildValues(keyBuilder.idealStates());
-      } else {
-        HelixProperty data = accessor.getProperty(keyBuilder.idealStates(resourceName));
-        if (data == null) {
-          throw new HelixException(
-              String.format("Specified resource %s idealState is not found!", resourceName));
-        }
-        properties = Collections.singletonList(data);
-      }
-    } else if (dataSource == DataSource.LIVEINSTANCES) {
-      properties = accessor.getChildValues(keyBuilder.liveInstances());
-    } else if (dataSource == DataSource.INSTANCES) {
-      properties = accessor.getChildValues(keyBuilder.instances());
-    } else {
+    String resourceName = recipientCriteria.getResource();
+    String instanceName = recipientCriteria.getInstanceName();
+
+    switch (dataSource) {
+    case EXTERNALVIEW:
+      properties = getProperty(accessor, resourceName, keyBuilder.externalViews(),
+          keyBuilder.externalView(resourceName), DataSource.EXTERNALVIEW.name());
+      break;
+    case IDEALSTATES:
+      properties = getProperty(accessor, resourceName, keyBuilder.idealStates(),
+          keyBuilder.idealStates(resourceName), DataSource.IDEALSTATES.name());
+      break;
+    case LIVEINSTANCES:
+      properties = getProperty(accessor, instanceName, keyBuilder.liveInstances(),
+          keyBuilder.liveInstance(instanceName), DataSource.LIVEINSTANCES.name());
+      break;
+    case INSTANCES:
+      properties = getProperty(accessor, instanceName, keyBuilder.instances(),
+          keyBuilder.instance(instanceName), DataSource.INSTANCES.name());
+      break;
+    default:
       return Lists.newArrayList();
     }
-
     // flatten the data
     List<ZNRecordRow> allRows = ZNRecordRow.flatten(HelixProperty.convertToList(properties));
 
@@ -172,4 +164,20 @@ public class CriteriaEvaluator {
     Pattern p = Pattern.compile(pattern, Pattern.CASE_INSENSITIVE | Pattern.DOTALL);
     return p.matcher(value).matches();
   }
+
+  private List<HelixProperty> getProperty(HelixDataAccessor accessor, String dataSpec,
+      PropertyKey propertyKeys, PropertyKey propertyKey, String dataType) {
+    List<HelixProperty> properties;
+    if (Strings.isNullOrEmpty(dataSpec) || dataSpec.equals(MATCH_ALL_SYM)) {
+      properties = accessor.getChildValues(propertyKeys);
+    } else {
+      HelixProperty data = accessor.getProperty(propertyKey);
+      if (data == null) {
+        throw new HelixException(
+            String.format("Specified %s %s is not found!", dataType, dataSpec));
+      }
+      properties = Collections.singletonList(data);
+    }
+    return properties;
+  }
 }