diff --git a/.circleci/config.yml b/.circleci/config.yml index f83a34610d..91c789eb54 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -12,6 +12,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 85d8175750..177f42014e 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 @@ -86,7 +86,7 @@ public String name() { @Override public boolean isHardGoal() { - return true; + return false; } /** @@ -292,8 +292,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; @@ -305,9 +304,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); } } } @@ -343,7 +342,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 @@ -408,9 +407,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 bb69624eea..cf6b276bdf 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 @@ -156,9 +156,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; @@ -188,9 +187,7 @@ private static boolean expectedToOptimize(short replicationFactor, Class