blob: 68f163cb95d0804145e21f589546dbb1625b57ee [file] [log] [blame]
package org.apache.helix.spectator;
/*
* 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.Map;
import java.util.Set;
import org.apache.helix.HelixConstants;
import org.apache.helix.HelixDataAccessor;
import org.apache.helix.PropertyType;
import org.apache.helix.common.caches.BasicClusterDataCache;
import org.apache.helix.common.caches.CurrentStateCache;
import org.apache.helix.common.caches.CurrentStateSnapshot;
import org.apache.helix.common.caches.TargetExternalViewCache;
import org.apache.helix.model.CurrentState;
import org.apache.helix.model.ExternalView;
import org.apache.helix.model.LiveInstance;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
* Cache the cluster data that are needed by RoutingTableProvider.
*/
class RoutingDataCache extends BasicClusterDataCache {
private static Logger LOG = LoggerFactory.getLogger(RoutingDataCache.class.getName());
private final PropertyType _sourceDataType;
private CurrentStateCache _currentStateCache;
private TargetExternalViewCache _targetExternalViewCache;
public RoutingDataCache(String clusterName, PropertyType sourceDataType) {
super(clusterName);
_sourceDataType = sourceDataType;
_currentStateCache = new CurrentStateCache(clusterName);
_targetExternalViewCache = new TargetExternalViewCache(clusterName);
requireFullRefresh();
}
/**
* This refreshes the cluster data by re-fetching the data from zookeeper in an efficient way
*
* @param accessor
*
* @return
*/
@Override
public synchronized void refresh(HelixDataAccessor accessor) {
LOG.info("START: RoutingDataCache.refresh() for cluster " + _clusterName);
long startTime = System.currentTimeMillis();
super.refresh(accessor);
if (_sourceDataType.equals(PropertyType.TARGETEXTERNALVIEW) && _propertyDataChangedMap
.get(HelixConstants.ChangeType.TARGET_EXTERNAL_VIEW)) {
long start = System.currentTimeMillis();
_propertyDataChangedMap
.put(HelixConstants.ChangeType.TARGET_EXTERNAL_VIEW, Boolean.valueOf(false));
_targetExternalViewCache.refresh(accessor);
LOG.info("Reload " + _targetExternalViewCache.getExternalViewMap().keySet().size()
+ " TargetExternalViews. Takes " + (System.currentTimeMillis() - start) + " ms");
}
if (_sourceDataType.equals(PropertyType.CURRENTSTATES) && _propertyDataChangedMap
.get(HelixConstants.ChangeType.CURRENT_STATE)) {
long start = System.currentTimeMillis();
Map<String, LiveInstance> liveInstanceMap = getLiveInstances();
_currentStateCache.refresh(accessor, liveInstanceMap);
LOG.info("Reload CurrentStates. Takes " + (System.currentTimeMillis() - start) + " ms");
}
long endTime = System.currentTimeMillis();
LOG.info("END: RoutingDataCache.refresh() for cluster " + _clusterName + ", took " + (endTime
- startTime) + " ms");
if (LOG.isDebugEnabled()) {
LOG.debug("CurrentStates: " + _currentStateCache);
LOG.debug("TargetExternalViews: " + _targetExternalViewCache.getExternalViewMap());
}
}
/**
* Retrieves the TargetExternalView for all resources
*
* @return
*/
public Map<String, ExternalView> getTargetExternalViews() {
return _targetExternalViewCache.getExternalViewMap();
}
/**
* Get map of current states in cluster. {InstanceName -> {SessionId -> {ResourceName ->
* CurrentState}}}
*
* @return
*/
public Map<String, Map<String, Map<String, CurrentState>>> getCurrentStatesMap() {
return _currentStateCache.getCurrentStatesMap();
}
public CurrentStateSnapshot getCurrentStateSnapshot() {
return _currentStateCache.getSnapshot();
}
}