use of com.linkedin.kafka.cruisecontrol.model.ClusterModel in project cruise-control by linkedin.
the class LoadMonitorTest method testClusterWithInvalidPartitions.
// Enough snapshot windows, some partitions are invalid in all snapshot windows.
@Test
public void testClusterWithInvalidPartitions() throws NotEnoughValidWindowsException {
TestContext context = prepareContext();
LoadMonitor loadMonitor = context.loadmonitor();
KafkaMetricSampleAggregator aggregator = context.aggregator();
ModelCompletenessRequirements requirements1 = new ModelCompletenessRequirements(1, 1.0, false);
ModelCompletenessRequirements requirements2 = new ModelCompletenessRequirements(1, 0.5, false);
ModelCompletenessRequirements requirements3 = new ModelCompletenessRequirements(2, 1.0, false);
ModelCompletenessRequirements requirements4 = new ModelCompletenessRequirements(2, 0.5, false);
// populate the metrics aggregator.
// two samples for each partition except T1P1
CruiseControlUnitTestUtils.populateSampleAggregator(3, 4, aggregator, PE_T0P0, 0, WINDOW_MS, METRIC_DEF);
CruiseControlUnitTestUtils.populateSampleAggregator(3, 4, aggregator, PE_T0P1, 0, WINDOW_MS, METRIC_DEF);
CruiseControlUnitTestUtils.populateSampleAggregator(3, 4, aggregator, PE_T1P0, 0, WINDOW_MS, METRIC_DEF);
try {
loadMonitor.clusterModel(-1, Long.MAX_VALUE, requirements1, new OperationProgress());
fail("Should have thrown NotEnoughValidWindowsException.");
} catch (NotEnoughValidWindowsException nevwe) {
// let it go
}
ClusterModel clusterModel = loadMonitor.clusterModel(-1L, Long.MAX_VALUE, requirements2, new OperationProgress());
assertNull(clusterModel.partition(T1P0));
assertNull(clusterModel.partition(T1P1));
assertEquals(2, clusterModel.partition(T0P0).leader().load().numWindows());
assertEquals(13, clusterModel.partition(T0P0).leader().load().expectedUtilizationFor(Resource.DISK), 0.0);
assertEquals(6.5, clusterModel.partition(T0P0).leader().load().expectedUtilizationFor(Resource.CPU), 0.0);
assertEquals(6.5, clusterModel.partition(T0P0).leader().load().expectedUtilizationFor(Resource.NW_IN), 0.0);
assertEquals(6.5, clusterModel.partition(T0P0).leader().load().expectedUtilizationFor(Resource.NW_OUT), 0.0);
try {
loadMonitor.clusterModel(-1L, Long.MAX_VALUE, requirements3, new OperationProgress());
fail("Should have thrown NotEnoughValidWindowsException.");
} catch (NotEnoughValidWindowsException nevwe) {
// let it go
}
clusterModel = loadMonitor.clusterModel(-1L, Long.MAX_VALUE, requirements4, new OperationProgress());
assertNull(clusterModel.partition(T1P0));
assertNull(clusterModel.partition(T1P1));
assertEquals(2, clusterModel.partition(T0P0).leader().load().numWindows());
assertEquals(13, clusterModel.partition(T0P0).leader().load().expectedUtilizationFor(Resource.DISK), 0.0);
assertEquals(6.5, clusterModel.partition(T0P0).leader().load().expectedUtilizationFor(Resource.CPU), 0.0);
assertEquals(6.5, clusterModel.partition(T0P0).leader().load().expectedUtilizationFor(Resource.NW_IN), 0.0);
assertEquals(6.5, clusterModel.partition(T0P0).leader().load().expectedUtilizationFor(Resource.NW_OUT), 0.0);
}
use of com.linkedin.kafka.cruisecontrol.model.ClusterModel in project cruise-control by linkedin.
the class LoadMonitorTest method testBasicClusterModel.
// Test the case with enough snapshot windows and valid partitions.
@Test
public void testBasicClusterModel() throws NotEnoughValidWindowsException {
TestContext context = prepareContext();
LoadMonitor loadMonitor = context.loadmonitor();
KafkaMetricSampleAggregator aggregator = context.aggregator();
CruiseControlUnitTestUtils.populateSampleAggregator(3, 4, aggregator, PE_T0P0, 0, WINDOW_MS, METRIC_DEF);
CruiseControlUnitTestUtils.populateSampleAggregator(3, 4, aggregator, PE_T0P1, 0, WINDOW_MS, METRIC_DEF);
CruiseControlUnitTestUtils.populateSampleAggregator(3, 4, aggregator, PE_T1P0, 0, WINDOW_MS, METRIC_DEF);
CruiseControlUnitTestUtils.populateSampleAggregator(3, 4, aggregator, PE_T1P1, 0, WINDOW_MS, METRIC_DEF);
ClusterModel clusterModel = loadMonitor.clusterModel(-1, Long.MAX_VALUE, new ModelCompletenessRequirements(2, 1.0, false), new OperationProgress());
assertEquals(6.5, clusterModel.partition(T0P0).leader().load().expectedUtilizationFor(Resource.CPU), 0.0);
assertEquals(6.5, clusterModel.partition(T0P0).leader().load().expectedUtilizationFor(Resource.NW_IN), 0.0);
assertEquals(6.5, clusterModel.partition(T0P0).leader().load().expectedUtilizationFor(Resource.NW_OUT), 0.0);
assertEquals(13, clusterModel.partition(T0P0).leader().load().expectedUtilizationFor(Resource.DISK), 0.0);
}
use of com.linkedin.kafka.cruisecontrol.model.ClusterModel in project cruise-control by linkedin.
the class LoadMonitorTest method testClusterModelWithPartlyInvalidPartitions.
// Enough snapshot windows, some partitions are not available in some snapshot windows.
@Test
public void testClusterModelWithPartlyInvalidPartitions() throws NotEnoughValidWindowsException {
TestContext context = prepareContext();
LoadMonitor loadMonitor = context.loadmonitor();
KafkaMetricSampleAggregator aggregator = context.aggregator();
ModelCompletenessRequirements requirements1 = new ModelCompletenessRequirements(1, 1.0, false);
ModelCompletenessRequirements requirements2 = new ModelCompletenessRequirements(1, 0.5, false);
ModelCompletenessRequirements requirements3 = new ModelCompletenessRequirements(2, 1.0, false);
ModelCompletenessRequirements requirements4 = new ModelCompletenessRequirements(2, 0.5, false);
// populate the metrics aggregator.
// four samples for each partition except T1P1
CruiseControlUnitTestUtils.populateSampleAggregator(3, 4, aggregator, PE_T0P0, 0, WINDOW_MS, METRIC_DEF);
CruiseControlUnitTestUtils.populateSampleAggregator(3, 4, aggregator, PE_T0P1, 0, WINDOW_MS, METRIC_DEF);
CruiseControlUnitTestUtils.populateSampleAggregator(3, 4, aggregator, PE_T1P0, 0, WINDOW_MS, METRIC_DEF);
CruiseControlUnitTestUtils.populateSampleAggregator(1, 1, aggregator, PE_T1P1, 1, WINDOW_MS, METRIC_DEF);
ClusterModel clusterModel = loadMonitor.clusterModel(-1, Long.MAX_VALUE, requirements1, new OperationProgress());
for (TopicPartition tp : Arrays.asList(T0P0, T0P1, T1P0, T1P1)) {
assertNotNull(clusterModel.partition(tp));
}
assertEquals(1, clusterModel.partition(T0P0).leader().load().numWindows());
assertEquals(13, clusterModel.partition(T0P0).leader().load().expectedUtilizationFor(Resource.DISK), 0.0);
assertEquals(11.5, clusterModel.partition(T0P0).leader().load().expectedUtilizationFor(Resource.CPU), 0.0);
assertEquals(11.5, clusterModel.partition(T0P0).leader().load().expectedUtilizationFor(Resource.NW_IN), 0.0);
assertEquals(11.5, clusterModel.partition(T0P0).leader().load().expectedUtilizationFor(Resource.NW_OUT), 0.0);
assertEquals(10, clusterModel.partition(T1P1).leader().load().expectedUtilizationFor(Resource.DISK), 0.0);
assertEquals(10, clusterModel.partition(T1P1).leader().load().expectedUtilizationFor(Resource.CPU), 0.0);
assertEquals(10, clusterModel.partition(T1P1).leader().load().expectedUtilizationFor(Resource.NW_IN), 0.0);
assertEquals(10, clusterModel.partition(T1P1).leader().load().expectedUtilizationFor(Resource.NW_OUT), 0.0);
clusterModel = loadMonitor.clusterModel(-1L, Long.MAX_VALUE, requirements2, new OperationProgress());
assertNull(clusterModel.partition(T1P0));
assertNull(clusterModel.partition(T1P1));
assertEquals(2, clusterModel.partition(T0P0).leader().load().numWindows());
assertEquals(13, clusterModel.partition(T0P0).leader().load().expectedUtilizationFor(Resource.DISK), 0.0);
assertEquals(6.5, clusterModel.partition(T0P0).leader().load().expectedUtilizationFor(Resource.CPU), 0.0);
assertEquals(6.5, clusterModel.partition(T0P0).leader().load().expectedUtilizationFor(Resource.NW_IN), 0.0);
assertEquals(6.5, clusterModel.partition(T0P0).leader().load().expectedUtilizationFor(Resource.NW_OUT), 0.0);
try {
loadMonitor.clusterModel(-1L, Long.MAX_VALUE, requirements3, new OperationProgress());
fail("Should have thrown NotEnoughValidWindowsException.");
} catch (NotEnoughValidWindowsException nevwe) {
// let it go
}
clusterModel = loadMonitor.clusterModel(-1L, Long.MAX_VALUE, requirements4, new OperationProgress());
assertNull(clusterModel.partition(T1P0));
assertNull(clusterModel.partition(T1P1));
assertEquals(2, clusterModel.partition(T0P0).leader().load().numWindows());
assertEquals(13, clusterModel.partition(T0P0).leader().load().expectedUtilizationFor(Resource.DISK), 0.0);
assertEquals(6.5, clusterModel.partition(T0P0).leader().load().expectedUtilizationFor(Resource.CPU), 0.0);
assertEquals(6.5, clusterModel.partition(T0P0).leader().load().expectedUtilizationFor(Resource.NW_IN), 0.0);
assertEquals(6.5, clusterModel.partition(T0P0).leader().load().expectedUtilizationFor(Resource.NW_OUT), 0.0);
}
use of com.linkedin.kafka.cruisecontrol.model.ClusterModel in project cruise-control by linkedin.
the class KafkaAssignerDiskUsageDistributionGoalTest method test.
@Test
public void test() {
Properties props = KafkaCruiseControlUnitTestUtils.getKafkaCruiseControlProperties();
props.setProperty(KafkaCruiseControlConfig.MAX_REPLICAS_PER_BROKER_CONFIG, Long.toString(10L));
props.setProperty(KafkaCruiseControlConfig.DISK_BALANCE_THRESHOLD_CONFIG, "1.05");
BalancingConstraint balancingConstraint = new BalancingConstraint(new KafkaCruiseControlConfig(props));
KafkaAssignerDiskUsageDistributionGoal goal = new KafkaAssignerDiskUsageDistributionGoal(balancingConstraint);
ClusterModel clusterModel = createClusterModel();
goal.optimize(clusterModel, Collections.emptySet(), Collections.emptySet());
for (Broker b : clusterModel.brokers()) {
System.out.println("Broker " + b.id() + " = " + b.load().expectedUtilizationFor(DISK));
}
}
use of com.linkedin.kafka.cruisecontrol.model.ClusterModel in project cruise-control by linkedin.
the class KafkaAssignerDiskUsageDistributionGoalTest method testSwapReplicas.
@Test
public void testSwapReplicas() {
Properties props = KafkaCruiseControlUnitTestUtils.getKafkaCruiseControlProperties();
props.setProperty(KafkaCruiseControlConfig.MAX_REPLICAS_PER_BROKER_CONFIG, Long.toString(10L));
props.setProperty(KafkaCruiseControlConfig.DISK_BALANCE_THRESHOLD_CONFIG, "1.05");
BalancingConstraint balancingConstraint = new BalancingConstraint(new KafkaCruiseControlConfig(props));
KafkaAssignerDiskUsageDistributionGoal goal = new KafkaAssignerDiskUsageDistributionGoal(balancingConstraint);
ClusterModel clusterModel = createClusterModel();
double meanDiskUsage = clusterModel.load().expectedUtilizationFor(DISK) / clusterModel.capacityFor(DISK);
assertTrue(goal.swapReplicas(clusterModel.broker(0), clusterModel.broker(1), meanDiskUsage, clusterModel, Collections.emptySet()));
assertFalse(goal.swapReplicas(clusterModel.broker(0), clusterModel.broker(2), meanDiskUsage, clusterModel, Collections.emptySet()));
assertTrue(goal.swapReplicas(clusterModel.broker(2), clusterModel.broker(3), meanDiskUsage, clusterModel, Collections.emptySet()));
}
Aggregations