blob: 39fccd8d0f5e56cc55dea916b660579d0e9f0dfd [file] [log] [blame]
package org.apache.helix.controller.changedetector;
/*
* 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.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;
import java.util.stream.Collectors;
import org.apache.helix.HelixConstants;
import org.apache.helix.controller.changedetector.trimmer.ClusterConfigTrimmer;
import org.apache.helix.controller.changedetector.trimmer.IdealStateTrimmer;
import org.apache.helix.controller.changedetector.trimmer.InstanceConfigTrimmer;
import org.apache.helix.controller.changedetector.trimmer.ResourceConfigTrimmer;
import org.apache.helix.controller.dataproviders.ResourceControllerDataProvider;
import org.apache.helix.model.ClusterConfig;
import org.apache.helix.model.IdealState;
import org.apache.helix.model.InstanceConfig;
import org.apache.helix.model.LiveInstance;
import org.apache.helix.model.ResourceConfig;
/**
* ResourceChangeSnapshot is a POJO that contains the following Helix metadata:
* 1. InstanceConfig
* 2. IdealState
* 3. ResourceConfig
* 4. LiveInstance
* 5. Changed property types
* It serves as a snapshot of the main controller cache to enable the difference (change)
* calculation between two rounds of the pipeline run.
*/
class ResourceChangeSnapshot {
private Set<HelixConstants.ChangeType> _changedTypes;
private Map<String, InstanceConfig> _instanceConfigMap;
private Map<String, IdealState> _idealStateMap;
private Map<String, ResourceConfig> _resourceConfigMap;
private Map<String, LiveInstance> _liveInstances;
private ClusterConfig _clusterConfig;
/**
* Default constructor that constructs an empty snapshot.
*/
ResourceChangeSnapshot() {
_changedTypes = new HashSet<>();
_instanceConfigMap = new HashMap<>();
_idealStateMap = new HashMap<>();
_resourceConfigMap = new HashMap<>();
_liveInstances = new HashMap<>();
_clusterConfig = null;
}
/**
* Constructor using controller cache (ResourceControllerDataProvider).
*
* @param dataProvider
* @param ignoreNonTopologyChange if true, the snapshot won't record any trivial changes that
* do not impact the fundamental structure of the cluster.
* For example, instance disabled or not, rebalance throttling
* configurations, resource disabled or not, etc.
*/
ResourceChangeSnapshot(ResourceControllerDataProvider dataProvider,
boolean ignoreNonTopologyChange) {
_changedTypes = new HashSet<>(dataProvider.getRefreshedChangeTypes());
_instanceConfigMap = ignoreNonTopologyChange ?
dataProvider.getInstanceConfigMap().entrySet().parallelStream().collect(Collectors
.toMap(e -> e.getKey(),
e -> InstanceConfigTrimmer.getInstance().trimProperty(e.getValue()))) :
new HashMap<>(dataProvider.getInstanceConfigMap());
_idealStateMap = ignoreNonTopologyChange ?
dataProvider.getIdealStates().entrySet().parallelStream().collect(Collectors
.toMap(e -> e.getKey(),
e -> IdealStateTrimmer.getInstance().trimProperty(e.getValue()))) :
new HashMap<>(dataProvider.getIdealStates());
_resourceConfigMap = ignoreNonTopologyChange ?
dataProvider.getResourceConfigMap().entrySet().parallelStream().collect(Collectors
.toMap(e -> e.getKey(),
e -> ResourceConfigTrimmer.getInstance().trimProperty(e.getValue()))) :
new HashMap<>(dataProvider.getResourceConfigMap());
_clusterConfig = ignoreNonTopologyChange ?
ClusterConfigTrimmer.getInstance().trimProperty(dataProvider.getClusterConfig()) :
dataProvider.getClusterConfig();
_liveInstances = new HashMap<>(dataProvider.getLiveInstances());
}
/**
* Copy constructor for ResourceChangeCache.
* @param snapshot
*/
ResourceChangeSnapshot(ResourceChangeSnapshot snapshot) {
_changedTypes = new HashSet<>(snapshot._changedTypes);
_instanceConfigMap = new HashMap<>(snapshot._instanceConfigMap);
_idealStateMap = new HashMap<>(snapshot._idealStateMap);
_resourceConfigMap = new HashMap<>(snapshot._resourceConfigMap);
_liveInstances = new HashMap<>(snapshot._liveInstances);
_clusterConfig = snapshot._clusterConfig;
}
Set<HelixConstants.ChangeType> getChangedTypes() {
return _changedTypes;
}
Map<String, InstanceConfig> getInstanceConfigMap() {
return _instanceConfigMap;
}
Map<String, IdealState> getIdealStateMap() {
return _idealStateMap;
}
Map<String, ResourceConfig> getResourceConfigMap() {
return _resourceConfigMap;
}
Map<String, LiveInstance> getLiveInstances() {
return _liveInstances;
}
ClusterConfig getClusterConfig() {
return _clusterConfig;
}
}