use of com.linkedin.kafka.cruisecontrol.common.Resource.DISK in project cruise-control by linkedin.
the class KafkaAssignerDiskUsageDistributionGoal method optimize.
@Override
public boolean optimize(ClusterModel clusterModel, Set<Goal> optimizedGoals, Set<String> excludedTopics) {
double meanDiskUsage = clusterModel.load().expectedUtilizationFor(DISK) / clusterModel.capacityFor(DISK);
double upperThreshold = meanDiskUsage * (1 + balancePercentageWithMargin());
double lowerThreshold = meanDiskUsage * Math.max(0, (1 - balancePercentageWithMargin()));
Comparator<Broker> comparator = (b1, b2) -> {
int result = Double.compare(diskUsage(b2), diskUsage(b1));
return result == 0 ? Integer.compare(b1.id(), b2.id()) : result;
};
boolean improved;
int numIterations = 0;
do {
List<Broker> brokers = new ArrayList<>();
brokers.addAll(clusterModel.healthyBrokers());
brokers.sort(comparator);
improved = false;
LOG.debug("Starting iteration {}", numIterations);
for (Broker broker : brokers) {
if (checkAndOptimize(broker, clusterModel, meanDiskUsage, lowerThreshold, upperThreshold, excludedTopics)) {
improved = true;
}
}
numIterations++;
} while (improved);
boolean succeeded = isOptimized(clusterModel, upperThreshold, lowerThreshold);
LOG.debug("Finished optimization in {} iterations.", numIterations);
return succeeded;
}
Aggregations