Repository: helix Updated Branches: refs/heads/master dd3f1e4a6 -> baf8b830e
Move RoutingDataCache to BasicDataCache as a sharable component Project: http://git-wip-us.apache.org/repos/asf/helix/repo Commit: http://git-wip-us.apache.org/repos/asf/helix/commit/baf8b830 Tree: http://git-wip-us.apache.org/repos/asf/helix/tree/baf8b830 Diff: http://git-wip-us.apache.org/repos/asf/helix/diff/baf8b830 Branch: refs/heads/master Commit: baf8b830e787ba1b31d4f0ad2c07f3eb33a9208f Parents: dd3f1e4 Author: Harry Zhang <[email protected]> Authored: Wed Mar 14 11:58:45 2018 -0700 Committer: Harry Zhang <[email protected]> Committed: Wed Mar 14 11:58:45 2018 -0700 ---------------------------------------------------------------------- .../helix/common/BasicClusterDataCache.java | 162 +++++++++++++++++++ .../helix/spectator/RoutingDataCache.java | 127 +-------------- 2 files changed, 166 insertions(+), 123 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/helix/blob/baf8b830/helix-core/src/main/java/org/apache/helix/common/BasicClusterDataCache.java ---------------------------------------------------------------------- diff --git a/helix-core/src/main/java/org/apache/helix/common/BasicClusterDataCache.java b/helix-core/src/main/java/org/apache/helix/common/BasicClusterDataCache.java new file mode 100644 index 0000000..994ebfb --- /dev/null +++ b/helix-core/src/main/java/org/apache/helix/common/BasicClusterDataCache.java @@ -0,0 +1,162 @@ +package org.apache.helix.common; + +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import java.util.Collections; +import java.util.HashMap; +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; +import org.apache.helix.HelixConstants; +import org.apache.helix.HelixDataAccessor; +import org.apache.helix.PropertyKey; +import org.apache.helix.model.ExternalView; +import org.apache.helix.model.InstanceConfig; +import org.apache.helix.model.LiveInstance; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * Cache the cluster data + */ +public class BasicClusterDataCache { + protected final Logger LOG = LoggerFactory.getLogger(this.getClass().getName()); + + private Map<String, LiveInstance> _liveInstanceMap; + private Map<String, InstanceConfig> _instanceConfigMap; + private Map<String, ExternalView> _externalViewMap; + protected String _clusterName; + + protected Map<HelixConstants.ChangeType, Boolean> _propertyDataChangedMap; + + public BasicClusterDataCache(String clusterName) { + _propertyDataChangedMap = new ConcurrentHashMap<>(); + _liveInstanceMap = new HashMap<>(); + _instanceConfigMap = new HashMap<>(); + _externalViewMap = new HashMap<>(); + _clusterName = clusterName; + } + + /** + * This refreshes the cluster data by re-fetching the data from zookeeper in an efficient way + * + * @param accessor + * + * @return + */ + public synchronized void refresh(HelixDataAccessor accessor) { + LOG.info("START: ClusterDataCache.refresh() for cluster " + _clusterName); + long startTime = System.currentTimeMillis(); + PropertyKey.Builder keyBuilder = accessor.keyBuilder(); + + if (_propertyDataChangedMap.get(HelixConstants.ChangeType.EXTERNAL_VIEW)) { + long start = System.currentTimeMillis(); + _propertyDataChangedMap.put(HelixConstants.ChangeType.EXTERNAL_VIEW, Boolean.valueOf(false)); + _externalViewMap = accessor.getChildValuesMap(keyBuilder.externalViews()); + if (LOG.isDebugEnabled()) { + LOG.debug("Reload ExternalViews: " + _externalViewMap.keySet() + ". Takes " + ( + System.currentTimeMillis() - start) + " ms"); + } + } + + if (_propertyDataChangedMap.get(HelixConstants.ChangeType.LIVE_INSTANCE)) { + _propertyDataChangedMap.put(HelixConstants.ChangeType.LIVE_INSTANCE, Boolean.valueOf(false)); + _liveInstanceMap = accessor.getChildValuesMap(keyBuilder.liveInstances()); + LOG.debug("Reload LiveInstances: " + _liveInstanceMap.keySet()); + } + + if (_propertyDataChangedMap.get(HelixConstants.ChangeType.INSTANCE_CONFIG)) { + _propertyDataChangedMap + .put(HelixConstants.ChangeType.INSTANCE_CONFIG, Boolean.valueOf(false)); + _instanceConfigMap = accessor.getChildValuesMap(keyBuilder.instanceConfigs()); + LOG.debug("Reload InstanceConfig: " + _instanceConfigMap.keySet()); + } + + long endTime = System.currentTimeMillis(); + LOG.info( + "END: RoutingDataCache.refresh() for cluster " + _clusterName + ", took " + (endTime + - startTime) + " ms"); + + if (LOG.isDebugEnabled()) { + LOG.debug("LiveInstances: " + _liveInstanceMap.keySet()); + for (LiveInstance instance : _liveInstanceMap.values()) { + LOG.debug("live instance: " + instance.getInstanceName() + " " + instance.getSessionId()); + } + LOG.debug("ExternalViews: " + _externalViewMap.keySet()); + LOG.debug("InstanceConfigs: " + _instanceConfigMap.keySet()); + } + } + + /** + * Retrieves the ExternalView for all resources + * + * @return + */ + public Map<String, ExternalView> getExternalViews() { + return Collections.unmodifiableMap(_externalViewMap); + } + + /** + * Returns the LiveInstances for each of the instances that are curretnly up and running + * + * @return + */ + public Map<String, LiveInstance> getLiveInstances() { + return Collections.unmodifiableMap(_liveInstanceMap); + } + + /** + * Returns the instance config map + * + * @return + */ + public Map<String, InstanceConfig> getInstanceConfigMap() { + return Collections.unmodifiableMap(_instanceConfigMap); + } + + /** + * Notify the cache that some part of the cluster data has been changed. + */ + public synchronized void notifyDataChange(HelixConstants.ChangeType changeType) { + _propertyDataChangedMap.put(changeType, Boolean.valueOf(true)); + } + + /** + * Indicate that a full read should be done on the next refresh + */ + public synchronized void requireFullRefresh() { + for(HelixConstants.ChangeType type : HelixConstants.ChangeType.values()) { + _propertyDataChangedMap.put(type, Boolean.valueOf(true)); + } + } + + /** + * toString method to print the data cache state + */ + @Override + public String toString() { + StringBuilder sb = new StringBuilder(); + sb.append("liveInstaceMap:" + _liveInstanceMap).append("\n"); + sb.append("externalViewMap:" + _externalViewMap).append("\n"); + sb.append("instanceConfigMap:" + _instanceConfigMap).append("\n"); + + return sb.toString(); + } +} + http://git-wip-us.apache.org/repos/asf/helix/blob/baf8b830/helix-core/src/main/java/org/apache/helix/spectator/RoutingDataCache.java ---------------------------------------------------------------------- diff --git a/helix-core/src/main/java/org/apache/helix/spectator/RoutingDataCache.java b/helix-core/src/main/java/org/apache/helix/spectator/RoutingDataCache.java index 2da0f97..a754f55 100644 --- a/helix-core/src/main/java/org/apache/helix/spectator/RoutingDataCache.java +++ b/helix-core/src/main/java/org/apache/helix/spectator/RoutingDataCache.java @@ -19,114 +19,17 @@ package org.apache.helix.spectator; * under the License. */ -import java.util.Collections; -import java.util.Map; -import java.util.concurrent.ConcurrentHashMap; import org.apache.helix.HelixConstants; -import org.apache.helix.HelixDataAccessor; -import org.apache.helix.PropertyKey; -import org.apache.helix.model.ExternalView; -import org.apache.helix.model.InstanceConfig; -import org.apache.helix.model.LiveInstance; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; +import org.apache.helix.common.BasicClusterDataCache; /** * Cache the cluster data that are needed by RoutingTableProvider. */ -public class RoutingDataCache { - private static final Logger LOG = LoggerFactory.getLogger(RoutingDataCache.class.getName()); - - private Map<String, LiveInstance> _liveInstanceMap; - private Map<String, InstanceConfig> _instanceConfigMap; - private Map<String, ExternalView> _externalViewMap; - String _clusterName; - - private Map<HelixConstants.ChangeType, Boolean> _propertyDataChangedMap; +public class RoutingDataCache extends BasicClusterDataCache { public RoutingDataCache(String clusterName) { - _propertyDataChangedMap = new ConcurrentHashMap<>(); - for (HelixConstants.ChangeType type : HelixConstants.ChangeType.values()) { - _propertyDataChangedMap.put(type, Boolean.valueOf(true)); - } - _clusterName = clusterName; - } - - /** - * This refreshes the cluster data by re-fetching the data from zookeeper in an efficient way - * - * @param accessor - * - * @return - */ - public synchronized void refresh(HelixDataAccessor accessor) { - LOG.info("START: ClusterDataCache.refresh()"); - long startTime = System.currentTimeMillis(); - PropertyKey.Builder keyBuilder = accessor.keyBuilder(); - - if (_propertyDataChangedMap.get(HelixConstants.ChangeType.EXTERNAL_VIEW)) { - long start = System.currentTimeMillis(); - _propertyDataChangedMap.put(HelixConstants.ChangeType.EXTERNAL_VIEW, Boolean.valueOf(false)); - _externalViewMap = accessor.getChildValuesMap(keyBuilder.externalViews()); - if (LOG.isDebugEnabled()) { - LOG.debug("Reload ExternalViews: " + _externalViewMap.keySet() + ". Takes " + ( - System.currentTimeMillis() - start) + " ms"); - } - } - - if (_propertyDataChangedMap.get(HelixConstants.ChangeType.LIVE_INSTANCE)) { - _propertyDataChangedMap.put(HelixConstants.ChangeType.LIVE_INSTANCE, Boolean.valueOf(false)); - _liveInstanceMap = accessor.getChildValuesMap(keyBuilder.liveInstances()); - LOG.debug("Reload LiveInstances: " + _liveInstanceMap.keySet()); - } - - if (_propertyDataChangedMap.get(HelixConstants.ChangeType.INSTANCE_CONFIG)) { - _propertyDataChangedMap - .put(HelixConstants.ChangeType.INSTANCE_CONFIG, Boolean.valueOf(false)); - _instanceConfigMap = accessor.getChildValuesMap(keyBuilder.instanceConfigs()); - LOG.debug("Reload InstanceConfig: " + _instanceConfigMap.keySet()); - } - - long endTime = System.currentTimeMillis(); - LOG.info( - "END: RoutingDataCache.refresh() for cluster " + _clusterName + ", took " + (endTime - - startTime) + " ms"); - - if (LOG.isDebugEnabled()) { - LOG.debug("LiveInstances: " + _liveInstanceMap.keySet()); - for (LiveInstance instance : _liveInstanceMap.values()) { - LOG.debug("live instance: " + instance.getInstanceName() + " " + instance.getSessionId()); - } - LOG.debug("ExternalViews: " + _externalViewMap.keySet()); - LOG.debug("InstanceConfigs: " + _instanceConfigMap.keySet()); - } - } - - /** - * Retrieves the ExternalView for all resources - * - * @return - */ - public Map<String, ExternalView> getExternalViews() { - return Collections.unmodifiableMap(_externalViewMap); - } - - /** - * Returns the LiveInstances for each of the instances that are curretnly up and running - * - * @return - */ - public Map<String, LiveInstance> getLiveInstances() { - return Collections.unmodifiableMap(_liveInstanceMap); - } - - /** - * Returns the instance config map - * - * @return - */ - public Map<String, InstanceConfig> getInstanceConfigMap() { - return Collections.unmodifiableMap(_instanceConfigMap); + super(clusterName); + requireFullRefresh(); } /** @@ -135,27 +38,5 @@ public class RoutingDataCache { public void notifyDataChange(HelixConstants.ChangeType changeType, String pathChanged) { _propertyDataChangedMap.put(changeType, Boolean.valueOf(true)); } - - /** - * Indicate that a full read should be done on the next refresh - */ - public synchronized void requireFullRefresh() { - for(HelixConstants.ChangeType type : HelixConstants.ChangeType.values()) { - _propertyDataChangedMap.put(type, Boolean.valueOf(true)); - } - } - - /** - * toString method to print the data cache state - */ - @Override - public String toString() { - StringBuilder sb = new StringBuilder(); - sb.append("liveInstaceMap:" + _liveInstanceMap).append("\n"); - sb.append("externalViewMap:" + _externalViewMap).append("\n"); - sb.append("instanceConfigMap:" + _instanceConfigMap).append("\n"); - - return sb.toString(); - } }
