You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@helix.apache.org by zz...@apache.org on 2013/03/21 23:44:21 UTC

git commit: HELIX-25: set participant Config should check existence of instance

Updated Branches:
  refs/heads/master 9eecbc319 -> 4d7703fcf


HELIX-25: set participant Config should check existence of instance


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

Branch: refs/heads/master
Commit: 4d7703fcfa06c17d4d0941e4a3ff51a553348354
Parents: 9eecbc3
Author: zzhang <zz...@uci.edu>
Authored: Thu Mar 21 15:44:14 2013 -0700
Committer: zzhang <zz...@uci.edu>
Committed: Thu Mar 21 15:44:14 2013 -0700

----------------------------------------------------------------------
 .../main/java/org/apache/helix/ConfigAccessor.java |   11 ++-
 .../apache/helix/manager/zk/ZKHelixManager.java    |   31 +----
 .../java/org/apache/helix/manager/zk/ZKUtil.java   |   40 +++++-
 .../java/org/apache/helix/model/ConfigScope.java   |    5 +
 .../java/org/apache/helix/TestConfigAccessor.java  |  124 ++++++++++-----
 5 files changed, 142 insertions(+), 69 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-helix/blob/4d7703fc/helix-core/src/main/java/org/apache/helix/ConfigAccessor.java
----------------------------------------------------------------------
diff --git a/helix-core/src/main/java/org/apache/helix/ConfigAccessor.java b/helix-core/src/main/java/org/apache/helix/ConfigAccessor.java
index 0734b72..aefb2be 100644
--- a/helix-core/src/main/java/org/apache/helix/ConfigAccessor.java
+++ b/helix-core/src/main/java/org/apache/helix/ConfigAccessor.java
@@ -134,9 +134,18 @@ public class ConfigAccessor
     String clusterName = scope.getClusterName();
     if (!ZKUtil.isClusterSetup(clusterName, zkClient))
     {
-      throw new HelixException("cluster " + clusterName + " is not setup yet");
+      throw new HelixException("cluster: " + clusterName + " is NOT setup.");
+    }
+
+    if (scope.getScope() == ConfigScopeProperty.PARTICIPANT) {
+       String scopeStr = scope.getScopeStr();
+       String instanceName = scopeStr.substring(scopeStr.lastIndexOf('/') + 1);
+       if (!ZKUtil.isInstanceSetup(zkClient, scope.getClusterName(), instanceName, InstanceType.PARTICIPANT)) {
+           throw new HelixException("instance: " + instanceName + " is NOT setup in cluster: " + clusterName);
+       }
     }
 
+    // use "|" to delimit resource and partition. e.g. /MyCluster/CONFIGS/PARTICIPANT/MyDB|MyDB_0
     String scopeStr = scope.getScopeStr();
     String[] splits = scopeStr.split("\\|");
 

http://git-wip-us.apache.org/repos/asf/incubator-helix/blob/4d7703fc/helix-core/src/main/java/org/apache/helix/manager/zk/ZKHelixManager.java
----------------------------------------------------------------------
diff --git a/helix-core/src/main/java/org/apache/helix/manager/zk/ZKHelixManager.java b/helix-core/src/main/java/org/apache/helix/manager/zk/ZKHelixManager.java
index 86af1cf..c87f330 100644
--- a/helix-core/src/main/java/org/apache/helix/manager/zk/ZKHelixManager.java
+++ b/helix-core/src/main/java/org/apache/helix/manager/zk/ZKHelixManager.java
@@ -206,34 +206,6 @@ public class ZKHelixManager implements HelixManager
     }
   }
 
-  private boolean isInstanceSetup()
-  {
-    if (_instanceType == InstanceType.PARTICIPANT
-        || _instanceType == InstanceType.CONTROLLER_PARTICIPANT)
-    {
-      boolean isValid =
-          _zkClient.exists(PropertyPathConfig.getPath(PropertyType.CONFIGS,
-                                                      _clusterName,
-                                                      ConfigScopeProperty.PARTICIPANT.toString(),
-                                                      _instanceName))
-              && _zkClient.exists(PropertyPathConfig.getPath(PropertyType.MESSAGES,
-                                                             _clusterName,
-                                                             _instanceName))
-              && _zkClient.exists(PropertyPathConfig.getPath(PropertyType.CURRENTSTATES,
-                                                             _clusterName,
-                                                             _instanceName))
-              && _zkClient.exists(PropertyPathConfig.getPath(PropertyType.STATUSUPDATES,
-                                                             _clusterName,
-                                                             _instanceName))
-              && _zkClient.exists(PropertyPathConfig.getPath(PropertyType.ERRORS,
-                                                             _clusterName,
-                                                             _instanceName));
-
-      return isValid;
-    }
-    return true;
-  }
-  
   @Override
   public boolean removeListener(PropertyKey key, Object listener)
   {
@@ -694,7 +666,8 @@ public class ZKHelixManager implements HelixManager
       throw new HelixException("Initial cluster structure is not set up for cluster:"
           + _clusterName);
     }
-    if (!isInstanceSetup())
+
+    if (!ZKUtil.isInstanceSetup(_zkClient, _clusterName, _instanceName, _instanceType))
     {
       throw new HelixException("Initial cluster structure is not set up for instance:"
           + _instanceName + " instanceType:" + _instanceType);

http://git-wip-us.apache.org/repos/asf/incubator-helix/blob/4d7703fc/helix-core/src/main/java/org/apache/helix/manager/zk/ZKUtil.java
----------------------------------------------------------------------
diff --git a/helix-core/src/main/java/org/apache/helix/manager/zk/ZKUtil.java b/helix-core/src/main/java/org/apache/helix/manager/zk/ZKUtil.java
index 85458f0..a8066b0 100644
--- a/helix-core/src/main/java/org/apache/helix/manager/zk/ZKUtil.java
+++ b/helix-core/src/main/java/org/apache/helix/manager/zk/ZKUtil.java
@@ -24,6 +24,7 @@ import java.util.Collections;
 import java.util.List;
 
 import org.I0Itec.zkclient.DataUpdater;
+import org.apache.helix.InstanceType;
 import org.apache.helix.PropertyPathConfig;
 import org.apache.helix.PropertyType;
 import org.apache.helix.ZNRecord;
@@ -74,13 +75,48 @@ public final class ZKUtil
     
     for(String path:requiredPaths){
       if(!zkClient.exists(path)){
-        isValid =false;
-        logger.error("Invalid cluster setup, missing znode path: "+path);
+        isValid = false;
+        logger.error("Invalid cluster setup, missing znode path: " + path);
       }
     }
     return isValid;
   }
 
+    public static boolean isInstanceSetup(ZkClient zkclient, String clusterName, String instanceName, InstanceType type)
+    {
+        if (type == InstanceType.PARTICIPANT || type == InstanceType.CONTROLLER_PARTICIPANT)
+        {
+            ArrayList<String> requiredPaths = new ArrayList<String>();
+            requiredPaths.add(PropertyPathConfig.getPath(PropertyType.CONFIGS,
+                                                         clusterName,
+                                                         ConfigScopeProperty.PARTICIPANT.toString(),
+                                                         instanceName));
+            requiredPaths.add(PropertyPathConfig.getPath(PropertyType.MESSAGES,
+                                                         clusterName,
+                                                         instanceName));
+            requiredPaths.add(PropertyPathConfig.getPath(PropertyType.CURRENTSTATES,
+                                                         clusterName,
+                                                         instanceName));
+            requiredPaths.add(PropertyPathConfig.getPath(PropertyType.STATUSUPDATES,
+                                                         clusterName,
+                                                         instanceName));
+            requiredPaths.add(PropertyPathConfig.getPath(PropertyType.ERRORS,
+                                                         clusterName,
+                                                         instanceName));
+            boolean isValid =true;
+
+            for(String path:requiredPaths){
+                if(!zkclient.exists(path)){
+                    isValid =false;
+                    logger.error("Invalid instance setup, missing znode path: " + path);
+                }
+            }
+            return isValid;
+        }
+
+        return true;
+    }
+
   public static void createChildren(ZkClient client,
                                     String parentPath,
                                     List<ZNRecord> list)

http://git-wip-us.apache.org/repos/asf/incubator-helix/blob/4d7703fc/helix-core/src/main/java/org/apache/helix/model/ConfigScope.java
----------------------------------------------------------------------
diff --git a/helix-core/src/main/java/org/apache/helix/model/ConfigScope.java b/helix-core/src/main/java/org/apache/helix/model/ConfigScope.java
index 87c7c34..50de79d 100644
--- a/helix-core/src/main/java/org/apache/helix/model/ConfigScope.java
+++ b/helix-core/src/main/java/org/apache/helix/model/ConfigScope.java
@@ -82,6 +82,11 @@ public class ConfigScope
 
   private final String _clusterName;
   private final ConfigScopeProperty _scope;
+
+    /**
+     * _scopeStr is like:
+     *   "/ClusterName/CONFIGS/{CLUSTER|PARTICIPANT|RESOURCE|PARTITION}/{clusterName|instanceName|resourceName}{|partitionName}"
+     */
   private final String _scopeStr;
 
   public ConfigScope(ConfigScopeBuilder configScopeBuilder)

http://git-wip-us.apache.org/repos/asf/incubator-helix/blob/4d7703fc/helix-core/src/test/java/org/apache/helix/TestConfigAccessor.java
----------------------------------------------------------------------
diff --git a/helix-core/src/test/java/org/apache/helix/TestConfigAccessor.java b/helix-core/src/test/java/org/apache/helix/TestConfigAccessor.java
index 76c331f..6a313e0 100644
--- a/helix-core/src/test/java/org/apache/helix/TestConfigAccessor.java
+++ b/helix-core/src/test/java/org/apache/helix/TestConfigAccessor.java
@@ -19,10 +19,13 @@ package org.apache.helix;
  * under the License.
  */
 
+import java.util.Date;
 import java.util.List;
 
+import org.apache.helix.manager.zk.ZKHelixAdmin;
 import org.apache.helix.model.ConfigScope;
 import org.apache.helix.model.ConfigScope.ConfigScopeProperty;
+import org.apache.helix.model.InstanceConfig;
 import org.apache.helix.model.builder.ConfigScopeBuilder;
 import org.testng.Assert;
 import org.testng.annotations.Test;
@@ -30,95 +33,99 @@ import org.testng.annotations.Test;
 
 public class TestConfigAccessor extends ZkUnitTestBase
 {
-  final String _className = getShortClassName();
-  final String _clusterName = "CLUSTER_" + _className;
-
   @Test
-  public void testZkConfigAccessor() throws Exception
+  public void testBasic() throws Exception
   {
-    TestHelper.setupCluster(_clusterName, ZK_ADDR, 12918, "localhost", "TestDB", 1, 10, 5, 3,
+      String className = TestHelper.getTestClassName();
+      String methodName = TestHelper.getTestMethodName();
+      String clusterName = className + "_" + methodName;
+
+      System.out.println("START " + clusterName + " at "
+              + new Date(System.currentTimeMillis()));
+
+      TestHelper.setupCluster(clusterName, ZK_ADDR, 12918, "localhost", "TestDB", 1, 10, 5, 3,
         "MasterSlave", true);
 
-    ConfigAccessor appConfig = new ConfigAccessor(_gZkClient);
-    ConfigScope clusterScope = new ConfigScopeBuilder().forCluster(_clusterName).build();
+    ConfigAccessor configAccessor = new ConfigAccessor(_gZkClient);
+    ConfigScope clusterScope = new ConfigScopeBuilder().forCluster(clusterName).build();
 
     // cluster scope config
-    String clusterConfigValue = appConfig.get(clusterScope, "clusterConfigKey");
+    String clusterConfigValue = configAccessor.get(clusterScope, "clusterConfigKey");
     Assert.assertNull(clusterConfigValue);
 
-    appConfig.set(clusterScope, "clusterConfigKey", "clusterConfigValue");
-    clusterConfigValue = appConfig.get(clusterScope, "clusterConfigKey");
+    configAccessor.set(clusterScope, "clusterConfigKey", "clusterConfigValue");
+    clusterConfigValue = configAccessor.get(clusterScope, "clusterConfigKey");
     Assert.assertEquals(clusterConfigValue, "clusterConfigValue");
 
     // resource scope config
-    ConfigScope resourceScope = new ConfigScopeBuilder().forCluster(_clusterName)
+    ConfigScope resourceScope = new ConfigScopeBuilder().forCluster(clusterName)
         .forResource("testResource").build();
-    appConfig.set(resourceScope, "resourceConfigKey", "resourceConfigValue");
-    String resourceConfigValue = appConfig.get(resourceScope, "resourceConfigKey");
+    configAccessor.set(resourceScope, "resourceConfigKey", "resourceConfigValue");
+    String resourceConfigValue = configAccessor.get(resourceScope, "resourceConfigKey");
     Assert.assertEquals(resourceConfigValue, "resourceConfigValue");
 
     // partition scope config
-    ConfigScope partitionScope = new ConfigScopeBuilder().forCluster(_clusterName)
+    ConfigScope partitionScope = new ConfigScopeBuilder().forCluster(clusterName)
         .forResource("testResource").forPartition("testPartition").build();
-    appConfig.set(partitionScope, "partitionConfigKey", "partitionConfigValue");
-    String partitionConfigValue = appConfig.get(partitionScope, "partitionConfigKey");
+    configAccessor.set(partitionScope, "partitionConfigKey", "partitionConfigValue");
+    String partitionConfigValue = configAccessor.get(partitionScope, "partitionConfigKey");
     Assert.assertEquals(partitionConfigValue, "partitionConfigValue");
 
     // participant scope config
-    ConfigScope participantScope = new ConfigScopeBuilder().forCluster(_clusterName)
+    ConfigScope participantScope = new ConfigScopeBuilder().forCluster(clusterName)
         .forParticipant("localhost_12918").build();
-    appConfig.set(participantScope, "participantConfigKey", "participantConfigValue");
-    String participantConfigValue = appConfig.get(participantScope, "participantConfigKey");
+    configAccessor.set(participantScope, "participantConfigKey", "participantConfigValue");
+    String participantConfigValue = configAccessor.get(participantScope, "participantConfigKey");
     Assert.assertEquals(participantConfigValue, "participantConfigValue");
 
-    List<String> keys = appConfig.getKeys(ConfigScopeProperty.RESOURCE, _clusterName);
+    List<String> keys = configAccessor.getKeys(ConfigScopeProperty.RESOURCE, clusterName);
     Assert.assertEquals(keys.size(), 1, "should be [testResource]");
     Assert.assertEquals(keys.get(0), "testResource");
 
-    keys = appConfig.getKeys(ConfigScopeProperty.CLUSTER, _clusterName);
-    Assert.assertEquals(keys.size(), 1, "should be [" + _clusterName + "]");
-    Assert.assertEquals(keys.get(0), _clusterName);
+    keys = configAccessor.getKeys(ConfigScopeProperty.CLUSTER, clusterName);
+    Assert.assertEquals(keys.size(), 1, "should be [" + clusterName + "]");
+    Assert.assertEquals(keys.get(0), clusterName);
 
-    keys = appConfig.getKeys(ConfigScopeProperty.PARTICIPANT, _clusterName);
+    keys = configAccessor.getKeys(ConfigScopeProperty.PARTICIPANT, clusterName);
     Assert.assertEquals(keys.size(), 5, "should be [localhost_12918~22] sorted");
     Assert.assertEquals(keys.get(0), "localhost_12918");
     Assert.assertEquals(keys.get(4), "localhost_12922");
 
-    keys = appConfig.getKeys(ConfigScopeProperty.PARTITION, _clusterName, "testResource");
+    keys = configAccessor.getKeys(ConfigScopeProperty.PARTITION, clusterName, "testResource");
     Assert.assertEquals(keys.size(), 1, "should be [testPartition]");
     Assert.assertEquals(keys.get(0), "testPartition");
 
-    keys = appConfig.getKeys(ConfigScopeProperty.RESOURCE, _clusterName, "testResource");
+    keys = configAccessor.getKeys(ConfigScopeProperty.RESOURCE, clusterName, "testResource");
     Assert.assertEquals(keys.size(), 1, "should be [resourceConfigKey]");
     Assert.assertEquals(keys.get(0), "resourceConfigKey");
 
-    keys = appConfig.getKeys(ConfigScopeProperty.CLUSTER, _clusterName, _clusterName);
+    keys = configAccessor.getKeys(ConfigScopeProperty.CLUSTER, clusterName, clusterName);
     Assert.assertEquals(keys.size(), 1, "should be [clusterConfigKey]");
     Assert.assertEquals(keys.get(0), "clusterConfigKey");
 
-    keys = appConfig.getKeys(ConfigScopeProperty.PARTICIPANT, _clusterName, "localhost_12918");
+    keys = configAccessor.getKeys(ConfigScopeProperty.PARTICIPANT, clusterName, "localhost_12918");
     Assert.assertEquals(keys.size(), 4, "should be [HELIX_ENABLED, HELIX_HOST, HELIX_PORT, participantConfigKey]");
     Assert.assertEquals(keys.get(3), "participantConfigKey");
 
-    keys = appConfig.getKeys(ConfigScopeProperty.PARTITION, _clusterName, "testResource", "testPartition");
+    keys = configAccessor.getKeys(ConfigScopeProperty.PARTITION, clusterName, "testResource", "testPartition");
     Assert.assertEquals(keys.size(), 1, "should be [partitionConfigKey]");
     Assert.assertEquals(keys.get(0), "partitionConfigKey");
 
     // test configAccessor.remove()
-    appConfig.remove(clusterScope, "clusterConfigKey");
-    clusterConfigValue = appConfig.get(clusterScope, "clusterConfigKey");
+    configAccessor.remove(clusterScope, "clusterConfigKey");
+    clusterConfigValue = configAccessor.get(clusterScope, "clusterConfigKey");
     Assert.assertNull(clusterConfigValue, "Should be null since it's removed");
 
-    appConfig.remove(resourceScope, "resourceConfigKey");
-    resourceConfigValue = appConfig.get(resourceScope, "resourceConfigKey");
+    configAccessor.remove(resourceScope, "resourceConfigKey");
+    resourceConfigValue = configAccessor.get(resourceScope, "resourceConfigKey");
     Assert.assertNull(resourceConfigValue, "Should be null since it's removed");
 
-    appConfig.remove(partitionScope, "partitionConfigKey");
-    partitionConfigValue = appConfig.get(partitionScope, "partitionConfigKey");
+    configAccessor.remove(partitionScope, "partitionConfigKey");
+    partitionConfigValue = configAccessor.get(partitionScope, "partitionConfigKey");
     Assert.assertNull(partitionConfigValue, "Should be null since it's removed");
     
-    appConfig.remove(participantScope, "participantConfigKey");
-    participantConfigValue = appConfig.get(partitionScope, "participantConfigKey");
+    configAccessor.remove(participantScope, "participantConfigKey");
+    participantConfigValue = configAccessor.get(partitionScope, "participantConfigKey");
     Assert.assertNull(participantConfigValue, "Should be null since it's removed");
     
     // negative tests
@@ -149,5 +156,48 @@ public class TestConfigAccessor extends ZkUnitTestBase
       // OK
     }
 
+      System.out.println("END " + clusterName + " at "
+              + new Date(System.currentTimeMillis()));
+
   }
+
+    // HELIX-25: set participant Config should check existence of instance
+    @Test
+    public void testSetNonexistentParticipantConfig() throws Exception
+    {
+        String className = TestHelper.getTestClassName();
+        String methodName = TestHelper.getTestMethodName();
+        String clusterName = className + "_" + methodName;
+
+        System.out.println("START " + clusterName + " at "
+                + new Date(System.currentTimeMillis()));
+
+        ZKHelixAdmin admin = new ZKHelixAdmin(_gZkClient);
+        admin.addCluster(clusterName, true);
+        ConfigAccessor configAccessor = new ConfigAccessor(_gZkClient);
+        ConfigScope participantScope = new ConfigScopeBuilder().forCluster(clusterName)
+                .forParticipant("localhost_12918").build();
+
+        try {
+            configAccessor.set(participantScope, "participantConfigKey", "participantConfigValue");
+            Assert.fail("Except fail to set participant-config because participant: localhost_12918 is not added to cluster yet");
+        } catch (HelixException e) {
+            // OK
+        }
+        admin.addInstance(clusterName, new InstanceConfig("localhost_12918"));
+
+        try {
+            configAccessor.set(participantScope, "participantConfigKey", "participantConfigValue");
+        } catch (Exception e) {
+            Assert.fail("Except succeed to set participant-config because participant: localhost_12918 has been added to cluster");
+        }
+
+        String participantConfigValue = configAccessor.get(participantScope, "participantConfigKey");
+        Assert.assertEquals(participantConfigValue, "participantConfigValue");
+
+        System.out.println("END " + clusterName + " at "
+                + new Date(System.currentTimeMillis()));
+
+
+    }
 }