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/08/14 18:14:04 UTC

[helix] 09/12: Refactor RealmAwareZkClient code to remove duplicate code

This is an automated email from the ASF dual-hosted git repository.

hulee pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/helix.git

commit c876649818675c546f69083cdf75cd1cb2f4351b
Author: Hunter Lee <hu...@linkedin.com>
AuthorDate: Fri Jul 24 18:38:24 2020 -0700

    Refactor RealmAwareZkClient code to remove duplicate code
    
    There was a piece of code that resolves MetadataStoreRoutingData based on RealmAwareZkConnectionConfig in all implementations of RealmAwareZkClient. This commit refactors that logic into a common static method in RealmAwareZkClient.
---
 .../helix/manager/zk/GenericZkHelixApiBuilder.java  |  9 +--------
 .../zookeeper/api/client/RealmAwareZkClient.java    | 21 +++++++++++++++++++++
 .../constant/RoutingSystemPropertyKeys.java         |  6 ++++--
 .../zookeeper/impl/client/DedicatedZkClient.java    | 13 +------------
 .../zookeeper/impl/client/FederatedZkClient.java    | 13 +------------
 .../helix/zookeeper/impl/client/SharedZkClient.java | 13 +------------
 6 files changed, 29 insertions(+), 46 deletions(-)

diff --git a/helix-core/src/main/java/org/apache/helix/manager/zk/GenericZkHelixApiBuilder.java b/helix-core/src/main/java/org/apache/helix/manager/zk/GenericZkHelixApiBuilder.java
index 1a4a69b..0447eee 100644
--- a/helix-core/src/main/java/org/apache/helix/manager/zk/GenericZkHelixApiBuilder.java
+++ b/helix-core/src/main/java/org/apache/helix/manager/zk/GenericZkHelixApiBuilder.java
@@ -200,15 +200,8 @@ public abstract class GenericZkHelixApiBuilder<B extends GenericZkHelixApiBuilde
   private String resolveZkAddressWithShardingKey(
       RealmAwareZkClient.RealmAwareZkConnectionConfig connectionConfig)
       throws InvalidRoutingDataException {
-    boolean isRoutingDataSourceEndpointSet =
-        connectionConfig.getRoutingDataSourceEndpoint() != null && !connectionConfig
-            .getRoutingDataSourceEndpoint().isEmpty();
     MetadataStoreRoutingData routingData =
-        isRoutingDataSourceEndpointSet ? RoutingDataManager.getInstance()
-            .getMetadataStoreRoutingData(
-                RoutingDataReaderType.lookUp(connectionConfig.getRoutingDataSourceType()),
-                connectionConfig.getRoutingDataSourceEndpoint())
-            : RoutingDataManager.getInstance().getMetadataStoreRoutingData();
+        RealmAwareZkClient.getMetadataStoreRoutingData(connectionConfig);
     return routingData.getMetadataStoreRealm(connectionConfig.getZkRealmShardingKey());
   }
 }
diff --git a/zookeeper-api/src/main/java/org/apache/helix/zookeeper/api/client/RealmAwareZkClient.java b/zookeeper-api/src/main/java/org/apache/helix/zookeeper/api/client/RealmAwareZkClient.java
index e8c91f1..d006420 100644
--- a/zookeeper-api/src/main/java/org/apache/helix/zookeeper/api/client/RealmAwareZkClient.java
+++ b/zookeeper-api/src/main/java/org/apache/helix/zookeeper/api/client/RealmAwareZkClient.java
@@ -23,7 +23,10 @@ import java.util.List;
 import java.util.concurrent.TimeUnit;
 
 import org.apache.helix.msdcommon.constant.MetadataStoreRoutingConstants;
+import org.apache.helix.msdcommon.datamodel.MetadataStoreRoutingData;
+import org.apache.helix.msdcommon.exception.InvalidRoutingDataException;
 import org.apache.helix.zookeeper.constant.RoutingDataReaderType;
+import org.apache.helix.zookeeper.routing.RoutingDataManager;
 import org.apache.helix.zookeeper.zkclient.DataUpdater;
 import org.apache.helix.zookeeper.zkclient.IZkChildListener;
 import org.apache.helix.zookeeper.zkclient.IZkDataListener;
@@ -640,4 +643,22 @@ public interface RealmAwareZkClient {
           dataListener);
     }
   }
+
+  /**
+   * Based on the RealmAwareZkConnectionConfig given, return MetadataStoreRoutingData.
+   * @param connectionConfig
+   * @return
+   */
+  static MetadataStoreRoutingData getMetadataStoreRoutingData(
+      RealmAwareZkConnectionConfig connectionConfig) throws InvalidRoutingDataException {
+    String routingDataSourceEndpoint = connectionConfig.getRoutingDataSourceEndpoint();
+    if (routingDataSourceEndpoint == null || routingDataSourceEndpoint.isEmpty()) {
+      // If endpoint is not given explicitly, use HTTP and the endpoint set in System Properties
+      return RoutingDataManager.getInstance().getMetadataStoreRoutingData();
+    } else {
+      return RoutingDataManager.getInstance().getMetadataStoreRoutingData(
+          RoutingDataReaderType.lookUp(connectionConfig.getRoutingDataSourceType()),
+          routingDataSourceEndpoint);
+    }
+  }
 }
diff --git a/zookeeper-api/src/main/java/org/apache/helix/zookeeper/constant/RoutingSystemPropertyKeys.java b/zookeeper-api/src/main/java/org/apache/helix/zookeeper/constant/RoutingSystemPropertyKeys.java
index 23b8ebc..a57075b 100644
--- a/zookeeper-api/src/main/java/org/apache/helix/zookeeper/constant/RoutingSystemPropertyKeys.java
+++ b/zookeeper-api/src/main/java/org/apache/helix/zookeeper/constant/RoutingSystemPropertyKeys.java
@@ -25,7 +25,9 @@ package org.apache.helix.zookeeper.constant;
 public class RoutingSystemPropertyKeys {
 
   /**
-   * This static constant is used to refer to which implementation of RoutingDataReader to use.
+   * If enabled, FederatedZkClient (multiZkClient) will invalidate the cached routing data and
+   * re-read the routing data from the routing data source upon ZK path sharding key cache miss.
    */
-  public static final String ROUTING_DATA_READER_TYPE = "routing.data.reader.type";
+  public static final String UPDATE_ROUTING_DATA_ON_CACHE_MISS =
+      "update.routing.data.on.cache.miss.enabled";
 }
diff --git a/zookeeper-api/src/main/java/org/apache/helix/zookeeper/impl/client/DedicatedZkClient.java b/zookeeper-api/src/main/java/org/apache/helix/zookeeper/impl/client/DedicatedZkClient.java
index 4527fe8..cc37853 100644
--- a/zookeeper-api/src/main/java/org/apache/helix/zookeeper/impl/client/DedicatedZkClient.java
+++ b/zookeeper-api/src/main/java/org/apache/helix/zookeeper/impl/client/DedicatedZkClient.java
@@ -80,18 +80,7 @@ public class DedicatedZkClient implements RealmAwareZkClient {
     }
     _connectionConfig = connectionConfig;
     _clientConfig = clientConfig;
-
-    // Get MetadataStoreRoutingData
-    String routingDataSourceEndpoint = connectionConfig.getRoutingDataSourceEndpoint();
-    if (routingDataSourceEndpoint == null || routingDataSourceEndpoint.isEmpty()) {
-      // If endpoint is not given explicitly, use HTTP and the endpoint set in System Properties
-      _metadataStoreRoutingData = RoutingDataManager.getInstance().getMetadataStoreRoutingData();
-    } else {
-      _metadataStoreRoutingData = RoutingDataManager.getInstance().getMetadataStoreRoutingData(
-          RoutingDataReaderType.lookUp(connectionConfig.getRoutingDataSourceType()),
-          routingDataSourceEndpoint);
-    }
-
+    _metadataStoreRoutingData = RealmAwareZkClient.getMetadataStoreRoutingData(connectionConfig);
     _zkRealmShardingKey = connectionConfig.getZkRealmShardingKey();
     if (_zkRealmShardingKey == null || _zkRealmShardingKey.isEmpty()) {
       throw new IllegalArgumentException(
diff --git a/zookeeper-api/src/main/java/org/apache/helix/zookeeper/impl/client/FederatedZkClient.java b/zookeeper-api/src/main/java/org/apache/helix/zookeeper/impl/client/FederatedZkClient.java
index 11d0291..679d4e7 100644
--- a/zookeeper-api/src/main/java/org/apache/helix/zookeeper/impl/client/FederatedZkClient.java
+++ b/zookeeper-api/src/main/java/org/apache/helix/zookeeper/impl/client/FederatedZkClient.java
@@ -93,18 +93,7 @@ public class FederatedZkClient implements RealmAwareZkClient {
     if (clientConfig == null) {
       throw new IllegalArgumentException("RealmAwareZkClientConfig cannot be null!");
     }
-
-    // Get MetadataStoreRoutingData
-    String routingDataSourceEndpoint = connectionConfig.getRoutingDataSourceEndpoint();
-    if (routingDataSourceEndpoint == null || routingDataSourceEndpoint.isEmpty()) {
-      // If endpoint is not given explicitly, use HTTP and the endpoint set in System Properties
-      _metadataStoreRoutingData = RoutingDataManager.getInstance().getMetadataStoreRoutingData();
-    } else {
-      _metadataStoreRoutingData = RoutingDataManager.getInstance().getMetadataStoreRoutingData(
-          RoutingDataReaderType.lookUp(connectionConfig.getRoutingDataSourceType()),
-          routingDataSourceEndpoint);
-    }
-
+    _metadataStoreRoutingData = RealmAwareZkClient.getMetadataStoreRoutingData(connectionConfig);
     _isClosed = false;
     _connectionConfig = connectionConfig;
     _clientConfig = clientConfig;
diff --git a/zookeeper-api/src/main/java/org/apache/helix/zookeeper/impl/client/SharedZkClient.java b/zookeeper-api/src/main/java/org/apache/helix/zookeeper/impl/client/SharedZkClient.java
index 14a4794..bcc4b12 100644
--- a/zookeeper-api/src/main/java/org/apache/helix/zookeeper/impl/client/SharedZkClient.java
+++ b/zookeeper-api/src/main/java/org/apache/helix/zookeeper/impl/client/SharedZkClient.java
@@ -74,23 +74,12 @@ public class SharedZkClient implements RealmAwareZkClient {
     _connectionConfig = connectionConfig;
     _clientConfig = clientConfig;
 
-    // Get MetadataStoreRoutingData
-    String routingDataSourceEndpoint = connectionConfig.getRoutingDataSourceEndpoint();
-    if (routingDataSourceEndpoint == null || routingDataSourceEndpoint.isEmpty()) {
-      // If endpoint is not given explicitly, use HTTP and the endpoint set in System Properties
-      _metadataStoreRoutingData = RoutingDataManager.getInstance().getMetadataStoreRoutingData();
-    } else {
-      _metadataStoreRoutingData = RoutingDataManager.getInstance().getMetadataStoreRoutingData(
-          RoutingDataReaderType.lookUp(connectionConfig.getRoutingDataSourceType()),
-          routingDataSourceEndpoint);
-    }
-
     _zkRealmShardingKey = connectionConfig.getZkRealmShardingKey();
     if (_zkRealmShardingKey == null || _zkRealmShardingKey.isEmpty()) {
       throw new IllegalArgumentException(
           "RealmAwareZkConnectionConfig's ZK realm sharding key cannot be null or empty for SharedZkClient!");
     }
-
+    _metadataStoreRoutingData = RealmAwareZkClient.getMetadataStoreRoutingData(connectionConfig);
     // Get the ZkRealm address based on the ZK path sharding key
     String zkRealmAddress = _metadataStoreRoutingData.getMetadataStoreRealm(_zkRealmShardingKey);
     if (zkRealmAddress == null || zkRealmAddress.isEmpty()) {