blob: 548ae31f0537a1f3690c56c133c7a56c819c96b2 [file] [log] [blame]
package org.apache.helix.api.config;
/*
* 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.io.IOException;
import java.util.HashMap;
import java.util.Map;
import org.codehaus.jackson.map.ObjectMapper;
import org.codehaus.jackson.map.ObjectReader;
import org.codehaus.jackson.map.ObjectWriter;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class StateTransitionThrottleConfig {
private static final Logger logger =
LoggerFactory.getLogger(StateTransitionThrottleConfig.class.getName());
public final static int DEFAULT_NUM_TRANSIT_REPLICAS = 1;
private enum ConfigProperty {
CONFIG_TYPE,
REBALANCE_TYPE,
THROTTLE_SCOPE,
MAX_PARTITION_IN_TRANSITION
}
public enum ThrottleScope {
CLUSTER,
RESOURCE,
INSTANCE,
PARTITION
}
public enum RebalanceType {
LOAD_BALANCE, // A rebalance type for load balance excluding dropping a replica
RECOVERY_BALANCE,
ANY, // A rebalance type used for general throttling (to account for all types of rebalance)
NONE
}
RebalanceType _rebalanceType;
ThrottleScope _throttleScope;
Long _maxPartitionInTransition;
public StateTransitionThrottleConfig(RebalanceType rebalanceType, ThrottleScope throttleScope,
long maxPartitionInTransition) {
_rebalanceType = rebalanceType;
_throttleScope = throttleScope;
_maxPartitionInTransition = maxPartitionInTransition;
}
public RebalanceType getRebalanceType() {
return _rebalanceType;
}
public ThrottleScope getThrottleScope() {
return _throttleScope;
}
public Long getMaxPartitionInTransition() {
return _maxPartitionInTransition;
}
private final static ObjectMapper OBJECT_MAPPER = new ObjectMapper();
/**
* Generate the JSON String for StateTransitionThrottleConfig.
* @return Json String for this config.
*/
public String toJSON() {
Map<String, String> configMap = new HashMap<>();
configMap.put(ConfigProperty.REBALANCE_TYPE.name(), _rebalanceType.name());
configMap.put(ConfigProperty.THROTTLE_SCOPE.name(), _throttleScope.name());
configMap.put(ConfigProperty.MAX_PARTITION_IN_TRANSITION.name(),
String.valueOf(_maxPartitionInTransition));
String jsonStr = null;
try {
ObjectWriter objectWriter = OBJECT_MAPPER.writer();
jsonStr = objectWriter.writeValueAsString(configMap);
} catch (IOException e) {
logger.error("Failed to convert config map to JSON object! {}", configMap);
}
return jsonStr;
}
/**
* Instantiate a throttle config from a config JSON string.
* @param configJsonStr
* @return StateTransitionThrottleConfig or null if the given configs map is not a valid
* StateTransitionThrottleConfig.
*/
public static StateTransitionThrottleConfig fromJSON(String configJsonStr) {
StateTransitionThrottleConfig throttleConfig = null;
try {
ObjectReader objectReader = OBJECT_MAPPER.reader(Map.class);
Map<String, String> configsMap = objectReader.readValue(configJsonStr);
throttleConfig = fromConfigMap(configsMap);
} catch (IOException e) {
logger.error("Failed to convert JSON string to config map! {}", configJsonStr);
}
return throttleConfig;
}
/**
* Instantiate a throttle config from a config map.
* @param configsMap
* @return StateTransitionThrottleConfig or null if the given configs map is not a valid
* StateTransitionThrottleConfig.
*/
public static StateTransitionThrottleConfig fromConfigMap(Map<String, String> configsMap) {
if (!configsMap.containsKey(ConfigProperty.REBALANCE_TYPE.name())
|| !configsMap.containsKey(ConfigProperty.THROTTLE_SCOPE.name())) {
// not a valid StateTransitionThrottleConfig
return null;
}
StateTransitionThrottleConfig config;
try {
RebalanceType rebalanceType =
RebalanceType.valueOf(configsMap.get(ConfigProperty.REBALANCE_TYPE.name()));
ThrottleScope throttleScope =
ThrottleScope.valueOf(configsMap.get(ConfigProperty.THROTTLE_SCOPE.name()));
Long maxPartition =
Long.valueOf(configsMap.get(ConfigProperty.MAX_PARTITION_IN_TRANSITION.name()));
config = new StateTransitionThrottleConfig(rebalanceType, throttleScope, maxPartition);
} catch (IllegalArgumentException ex) {
return null;
}
return config;
}
}