You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@helix.apache.org by hu...@apache.org on 2020/04/01 22:47:38 UTC

[helix] 43/49: Make ZkUtil realm-aware (#896)

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 873a2a4baa7b5eae209b0bd51974c6fd3ad5aace
Author: Hunter Lee <hu...@linkedin.com>
AuthorDate: Fri Mar 13 17:33:11 2020 -0700

    Make ZkUtil realm-aware (#896)
    
    There were some places in the code that were missed in previous PRs. This makes ZkUtil realm-aware by replacing HelixZkClient with RealmAwareZkClient.
---
 .../java/org/apache/helix/manager/zk/ZKUtil.java   | 49 +++++++++++++++-------
 1 file changed, 34 insertions(+), 15 deletions(-)

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 70042ff..d2c80c8 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
@@ -19,6 +19,7 @@ package org.apache.helix.manager.zk;
  * under the License.
  */
 
+import java.io.IOException;
 import java.util.ArrayList;
 import java.util.Collections;
 import java.util.List;
@@ -26,9 +27,12 @@ import java.util.List;
 import org.apache.helix.HelixException;
 import org.apache.helix.InstanceType;
 import org.apache.helix.PropertyPathBuilder;
+import org.apache.helix.SystemPropertyKeys;
+import org.apache.helix.msdcommon.exception.InvalidRoutingDataException;
 import org.apache.helix.zookeeper.api.client.HelixZkClient;
 import org.apache.helix.zookeeper.api.client.RealmAwareZkClient;
 import org.apache.helix.zookeeper.datamodel.ZNRecord;
+import org.apache.helix.zookeeper.impl.client.FederatedZkClient;
 import org.apache.helix.zookeeper.impl.factory.DedicatedZkClientFactory;
 import org.apache.helix.zookeeper.zkclient.DataUpdater;
 import org.apache.zookeeper.CreateMode;
@@ -40,6 +44,8 @@ import org.slf4j.LoggerFactory;
 /**
  * Using this ZKUtil class for production purposes is NOT recommended since a lot of the static
  * methods require a ZkClient instance to be passed in.
+ *
+ * NOTE: Ephemeral operations will not be supported on multi-zk mode!
  */
 public final class ZKUtil {
   private static Logger logger = LoggerFactory.getLogger(ZKUtil.class);
@@ -56,7 +62,7 @@ public final class ZKUtil {
    * @return
    */
   public static boolean isClusterSetup(String clusterName, String zkAddress) {
-    HelixZkClient zkClient = getHelixZkClient(zkAddress);
+    RealmAwareZkClient zkClient = getHelixZkClient(zkAddress);
     boolean result;
     try {
       result = isClusterSetup(clusterName, zkClient);
@@ -129,7 +135,7 @@ public final class ZKUtil {
    */
   public static boolean isInstanceSetup(String zkAddress, String clusterName, String instanceName,
       InstanceType type) {
-    HelixZkClient zkClient = getHelixZkClient(zkAddress);
+    RealmAwareZkClient zkClient = getHelixZkClient(zkAddress);
     boolean result;
     try {
       result = isInstanceSetup(zkClient, clusterName, instanceName, type);
@@ -179,7 +185,7 @@ public final class ZKUtil {
    * @param list
    */
   public static void createChildren(String zkAddress, String parentPath, List<ZNRecord> list) {
-    HelixZkClient zkClient = getHelixZkClient(zkAddress);
+    RealmAwareZkClient zkClient = getHelixZkClient(zkAddress);
     try {
       createChildren(zkClient, parentPath, list);
     } finally {
@@ -205,7 +211,7 @@ public final class ZKUtil {
    * @param nodeRecord
    */
   public static void createChildren(String zkAddress, String parentPath, ZNRecord nodeRecord) {
-    HelixZkClient zkClient = getHelixZkClient(zkAddress);
+    RealmAwareZkClient zkClient = getHelixZkClient(zkAddress);
     try {
       createChildren(zkClient, parentPath, nodeRecord);
     } finally {
@@ -230,7 +236,7 @@ public final class ZKUtil {
    * @param list
    */
   public static void dropChildren(String zkAddress, String parentPath, List<ZNRecord> list) {
-    HelixZkClient zkClient = getHelixZkClient(zkAddress);
+    RealmAwareZkClient zkClient = getHelixZkClient(zkAddress);
     try {
       dropChildren(zkClient, parentPath, list);
     } finally {
@@ -256,7 +262,7 @@ public final class ZKUtil {
    * @param nodeRecord
    */
   public static void dropChildren(String zkAddress, String parentPath, ZNRecord nodeRecord) {
-    HelixZkClient zkClient = getHelixZkClient(zkAddress);
+    RealmAwareZkClient zkClient = getHelixZkClient(zkAddress);
     try {
       dropChildren(zkClient, parentPath, nodeRecord);
     } finally {
@@ -280,7 +286,7 @@ public final class ZKUtil {
    * @return
    */
   public static List<ZNRecord> getChildren(String zkAddress, String path) {
-    HelixZkClient zkClient = getHelixZkClient(zkAddress);
+    RealmAwareZkClient zkClient = getHelixZkClient(zkAddress);
     List<ZNRecord> result;
     try {
       result = getChildren(zkClient, path);
@@ -323,7 +329,7 @@ public final class ZKUtil {
    */
   public static void updateIfExists(String zkAddress, String path, final ZNRecord record,
       boolean mergeOnUpdate) {
-    HelixZkClient zkClient = getHelixZkClient(zkAddress);
+    RealmAwareZkClient zkClient = getHelixZkClient(zkAddress);
     try {
       updateIfExists(zkClient, path, record, mergeOnUpdate);
     } finally {
@@ -355,7 +361,7 @@ public final class ZKUtil {
    */
   public static void createOrMerge(String zkAddress, String path, final ZNRecord record,
       final boolean persistent, final boolean mergeOnUpdate) {
-    HelixZkClient zkClient = getHelixZkClient(zkAddress);
+    RealmAwareZkClient zkClient = getHelixZkClient(zkAddress);
     try {
       createOrMerge(zkClient, path, record, persistent, mergeOnUpdate);
     } finally {
@@ -410,7 +416,7 @@ public final class ZKUtil {
    */
   public static void createOrUpdate(String zkAddress, String path, final ZNRecord record,
       final boolean persistent, final boolean mergeOnUpdate) {
-    HelixZkClient zkClient = getHelixZkClient(zkAddress);
+    RealmAwareZkClient zkClient = getHelixZkClient(zkAddress);
     try {
       createOrUpdate(zkClient, path, record, persistent, mergeOnUpdate);
     } finally {
@@ -459,7 +465,7 @@ public final class ZKUtil {
    */
   public static void asyncCreateOrMerge(String zkAddress, String path, final ZNRecord record,
       final boolean persistent, final boolean mergeOnUpdate) {
-    HelixZkClient zkClient = getHelixZkClient(zkAddress);
+    RealmAwareZkClient zkClient = getHelixZkClient(zkAddress);
     try {
       asyncCreateOrMerge(zkClient, path, record, persistent, mergeOnUpdate);
     } finally {
@@ -512,7 +518,7 @@ public final class ZKUtil {
    */
   public static void createOrReplace(String zkAddress, String path, final ZNRecord record,
       final boolean persistent) {
-    HelixZkClient zkClient = getHelixZkClient(zkAddress);
+    RealmAwareZkClient zkClient = getHelixZkClient(zkAddress);
     try {
       createOrReplace(zkClient, path, record, persistent);
     } finally {
@@ -555,7 +561,7 @@ public final class ZKUtil {
    */
   public static void subtract(String zkAddress, final String path,
       final ZNRecord recordTosubtract) {
-    HelixZkClient zkClient = getHelixZkClient(zkAddress);
+    RealmAwareZkClient zkClient = getHelixZkClient(zkAddress);
     try {
       subtract(zkClient, path, recordTosubtract);
     } finally {
@@ -601,10 +607,23 @@ public final class ZKUtil {
   }
 
   /**
-   * Returns a dedicated ZkClient.
+   * Returns a dedicated ZkClient. A federatedZkClient will be used on multi-zk mode.
+   * WARNING: ephemeral operations will not be supported on multi-zk mode!
    * @return
    */
-  private static HelixZkClient getHelixZkClient(String zkAddr) {
+  private static RealmAwareZkClient getHelixZkClient(String zkAddr) {
+    if (Boolean.getBoolean(SystemPropertyKeys.MULTI_ZK_ENABLED)) {
+      try {
+        // Create realm-aware ZkClient.
+        RealmAwareZkClient.RealmAwareZkConnectionConfig connectionConfig =
+            new RealmAwareZkClient.RealmAwareZkConnectionConfig.Builder().build();
+        RealmAwareZkClient.RealmAwareZkClientConfig clientConfig =
+            new RealmAwareZkClient.RealmAwareZkClientConfig();
+        return new FederatedZkClient(connectionConfig, clientConfig);
+      } catch (IllegalArgumentException | IOException | InvalidRoutingDataException e) {
+        throw new HelixException("Not able to connect on realm-aware mode", e);
+      }
+    }
     if (zkAddr == null || zkAddr.isEmpty()) {
       throw new HelixException("ZK Address given is either null or empty!");
     }