diff --git a/.circleci/config.yml b/.circleci/config.yml index 23ad1bcef2..162dce4ad2 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -11,6 +11,8 @@ jobs: - checkout - restore_cache: key: dependency-cache-{{ checksum "build.gradle" }} + - run: + command: git tag 2.5.0-SNAPSHOT - run: command: ./gradlew --no-daemon clean javadoc - run: diff --git a/cruise-control/src/main/java/com/linkedin/kafka/cruisecontrol/analyzer/goals/MinTopicLeadersPerBrokerGoal.java b/cruise-control/src/main/java/com/linkedin/kafka/cruisecontrol/analyzer/goals/MinTopicLeadersPerBrokerGoal.java index 5c218289ae..4877582bd1 100644 --- a/cruise-control/src/main/java/com/linkedin/kafka/cruisecontrol/analyzer/goals/MinTopicLeadersPerBrokerGoal.java +++ b/cruise-control/src/main/java/com/linkedin/kafka/cruisecontrol/analyzer/goals/MinTopicLeadersPerBrokerGoal.java @@ -81,7 +81,7 @@ public ModelCompletenessRequirements clusterModelCompletenessRequirements() { @Override public boolean isHardGoal() { - return true; + return false; } /** @@ -287,8 +287,7 @@ protected void updateGoalState(ClusterModel clusterModel, OptimizationOptions op finish(); } - private void ensureBrokersAllHaveEnoughLeaderOfTopics(ClusterModel clusterModel, OptimizationOptions optimizationOptions) - throws OptimizationFailureException { + private void ensureBrokersAllHaveEnoughLeaderOfTopics(ClusterModel clusterModel, OptimizationOptions optimizationOptions) { if (_mustHaveTopicMinLeadersPerBroker.isEmpty()) { // Early termination to avoid some unnecessary computation return; @@ -300,9 +299,9 @@ private void ensureBrokersAllHaveEnoughLeaderOfTopics(ClusterModel clusterModel, for (String mustHaveLeaderPerBrokerTopicName : _mustHaveTopicMinLeadersPerBroker.keySet()) { int leaderCount = broker.numLeadersFor(mustHaveLeaderPerBrokerTopicName); if (leaderCount < minTopicLeadersPerBroker(mustHaveLeaderPerBrokerTopicName)) { - throw new OptimizationFailureException(String.format("[%s] Broker %d has insufficient per-broker leaders for topic %s (required: %d " - + "current: %d).", name(), broker.id(), mustHaveLeaderPerBrokerTopicName, - minTopicLeadersPerBroker(mustHaveLeaderPerBrokerTopicName), leaderCount)); + LOG.warn("[{}] Broker {} has insufficient per-broker leaders for topic {} (required: {} current: {}).", + name(), broker.id(), mustHaveLeaderPerBrokerTopicName, + minTopicLeadersPerBroker(mustHaveLeaderPerBrokerTopicName), leaderCount); } } } @@ -338,7 +337,7 @@ private void maybeMoveLeaderOfTopicToBroker(String topicMustHaveLeaderPerBroker, Broker broker, ClusterModel clusterModel, Set optimizedGoals, - OptimizationOptions optimizationOptions) throws OptimizationFailureException { + OptimizationOptions optimizationOptions) { int topicLeaderCountOnReceiverBroker = broker.numLeadersFor(topicMustHaveLeaderPerBroker); if (topicLeaderCountOnReceiverBroker >= minTopicLeadersPerBroker(topicMustHaveLeaderPerBroker)) { // This broker has enough leader replica(s) for the given topic @@ -403,9 +402,10 @@ private void maybeMoveLeaderOfTopicToBroker(String topicMustHaveLeaderPerBroker, } } } - throw new OptimizationFailureException(String.format("[%s] Cannot make broker %d have at least %d leaders from topic %s.", + LOG.warn("{} Cannot make broker {} have at least {} leaders from topic {}. Leaders on broker: {}", name(), broker.id(), - minTopicLeadersPerBroker(topicMustHaveLeaderPerBroker), topicMustHaveLeaderPerBroker)); + minTopicLeadersPerBroker(topicMustHaveLeaderPerBroker), + topicMustHaveLeaderPerBroker, topicLeaderCountOnReceiverBroker); } /** diff --git a/cruise-control/src/test/java/com/linkedin/kafka/cruisecontrol/analyzer/ReplicationFactorChangeTest.java b/cruise-control/src/test/java/com/linkedin/kafka/cruisecontrol/analyzer/ReplicationFactorChangeTest.java index 7442d9c10f..c6d5d66f61 100644 --- a/cruise-control/src/test/java/com/linkedin/kafka/cruisecontrol/analyzer/ReplicationFactorChangeTest.java +++ b/cruise-control/src/test/java/com/linkedin/kafka/cruisecontrol/analyzer/ReplicationFactorChangeTest.java @@ -160,9 +160,8 @@ private static Class expectedExceptionClass(short replicati Class goalClass, boolean smallCluster) { if ((replicationFactor == LARGE_REPLICATION_FACTOR && goalClass == RackAwareGoal.class) - || (replicationFactor == LARGE_REPLICATION_FACTOR && goalClass == ReplicaCapacityGoal.class && !smallCluster) - || (replicationFactor == SMALL_REPLICATION_FACTOR && goalClass == MinTopicLeadersPerBrokerGoal.class) - || (replicationFactor == LARGE_REPLICATION_FACTOR && goalClass == MinTopicLeadersPerBrokerGoal.class && !smallCluster)) { + || (replicationFactor == LARGE_REPLICATION_FACTOR && goalClass == ReplicaCapacityGoal.class && !smallCluster) + ) { return OptimizationFailureException.class; } return null; @@ -192,9 +191,7 @@ private static boolean expectedToOptimize(short replicationFactor, Class