Skip to content

Commit df5683f

Browse files
authored
HDDS-10699. Refactor ContainerBalancerTask and TestContainerBalancerTask (#6537)
1 parent d3ffd7d commit df5683f

5 files changed

Lines changed: 212 additions & 224 deletions

File tree

hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/container/balancer/ContainerBalancerTask.java

Lines changed: 21 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -75,7 +75,6 @@ public class ContainerBalancerTask implements Runnable {
7575
private OzoneConfiguration ozoneConfiguration;
7676
private ContainerBalancer containerBalancer;
7777
private final SCMContext scmContext;
78-
private double threshold;
7978
private int totalNodesInCluster;
8079
private double maxDatanodesRatioToInvolvePerIteration;
8180
private long maxSizeToMovePerIteration;
@@ -84,17 +83,13 @@ public class ContainerBalancerTask implements Runnable {
8483
// count actual size moved in bytes
8584
private long sizeActuallyMovedInLatestIteration;
8685
private int iterations;
87-
private List<DatanodeUsageInfo> unBalancedNodes;
88-
private List<DatanodeUsageInfo> overUtilizedNodes;
89-
private List<DatanodeUsageInfo> underUtilizedNodes;
86+
private final List<DatanodeUsageInfo> overUtilizedNodes;
87+
private final List<DatanodeUsageInfo> underUtilizedNodes;
9088
private List<DatanodeUsageInfo> withinThresholdUtilizedNodes;
9189
private Set<String> excludeNodes;
9290
private Set<String> includeNodes;
9391
private ContainerBalancerConfiguration config;
9492
private ContainerBalancerMetrics metrics;
95-
private long clusterCapacity;
96-
private long clusterRemaining;
97-
private double clusterAvgUtilisation;
9893
private PlacementPolicyValidateProxy placementPolicyValidateProxy;
9994
private NetworkTopology networkTopology;
10095
private double upperLimit;
@@ -150,7 +145,6 @@ public ContainerBalancerTask(StorageContainerManager scm,
150145
this.overUtilizedNodes = new ArrayList<>();
151146
this.underUtilizedNodes = new ArrayList<>();
152147
this.withinThresholdUtilizedNodes = new ArrayList<>();
153-
this.unBalancedNodes = new ArrayList<>();
154148
this.placementPolicyValidateProxy = scm.getPlacementPolicyValidateProxy();
155149
this.networkTopology = scm.getClusterMap();
156150
this.nextIterationIndex = nextIterationIndex;
@@ -348,7 +342,6 @@ private boolean initializeIteration() {
348342
return false;
349343
}
350344

351-
this.threshold = config.getThresholdAsRatio();
352345
this.maxDatanodesRatioToInvolvePerIteration =
353346
config.getMaxDatanodesRatioToInvolvePerIteration();
354347
this.maxSizeToMovePerIteration = config.getMaxSizeToMovePerIteration();
@@ -368,22 +361,19 @@ private boolean initializeIteration() {
368361

369362
this.totalNodesInCluster = datanodeUsageInfos.size();
370363

371-
clusterAvgUtilisation = calculateAvgUtilization(datanodeUsageInfos);
364+
double clusterAvgUtilisation = calculateAvgUtilization(datanodeUsageInfos);
372365
if (LOG.isDebugEnabled()) {
373-
LOG.debug("Average utilization of the cluster is {}",
374-
clusterAvgUtilisation);
366+
LOG.debug("Average utilization of the cluster is {}", clusterAvgUtilisation);
375367
}
376368

377-
// over utilized nodes have utilization(that is, used / capacity) greater
378-
// than upper limit
369+
double threshold = config.getThresholdAsRatio();
370+
// over utilized nodes have utilization(that is, used / capacity) greater than upper limit
379371
this.upperLimit = clusterAvgUtilisation + threshold;
380-
// under utilized nodes have utilization(that is, used / capacity) less
381-
// than lower limit
372+
// under utilized nodes have utilization(that is, used / capacity) less than lower limit
382373
this.lowerLimit = clusterAvgUtilisation - threshold;
383374

384375
if (LOG.isDebugEnabled()) {
385-
LOG.debug("Lower limit for utilization is {} and Upper limit for " +
386-
"utilization is {}", lowerLimit, upperLimit);
376+
LOG.debug("Lower limit for utilization is {} and Upper limit for utilization is {}", lowerLimit, upperLimit);
387377
}
388378

389379
long totalOverUtilizedBytes = 0L, totalUnderUtilizedBytes = 0L;
@@ -433,12 +423,7 @@ private boolean initializeIteration() {
433423
OzoneConsts.GB);
434424
Collections.reverse(underUtilizedNodes);
435425

436-
unBalancedNodes = new ArrayList<>(
437-
overUtilizedNodes.size() + underUtilizedNodes.size());
438-
unBalancedNodes.addAll(overUtilizedNodes);
439-
unBalancedNodes.addAll(underUtilizedNodes);
440-
441-
if (unBalancedNodes.isEmpty()) {
426+
if (overUtilizedNodes.isEmpty() && underUtilizedNodes.isEmpty()) {
442427
LOG.info("Did not find any unbalanced Datanodes.");
443428
return false;
444429
}
@@ -487,7 +472,7 @@ private IterationResult doIteration() {
487472
findTargetStrategy.reInitialize(potentialTargets, config, upperLimit);
488473
findSourceStrategy.reInitialize(getPotentialSources(), config, lowerLimit);
489474

490-
moveSelectionToFutureMap = new HashMap<>(unBalancedNodes.size());
475+
moveSelectionToFutureMap = new HashMap<>(underUtilizedNodes.size() + overUtilizedNodes.size());
491476
boolean isMoveGeneratedInThisIteration = false;
492477
iterationResult = IterationResult.ITERATION_COMPLETED;
493478
boolean canAdaptWhenNearingLimits = true;
@@ -965,8 +950,8 @@ private long ratioToBytes(Long nodeCapacity, double utilizationRatio) {
965950
* @return Average utilization value
966951
*/
967952
@VisibleForTesting
968-
double calculateAvgUtilization(List<DatanodeUsageInfo> nodes) {
969-
if (nodes.size() == 0) {
953+
public static double calculateAvgUtilization(List<DatanodeUsageInfo> nodes) {
954+
if (nodes.isEmpty()) {
970955
LOG.warn("No nodes to calculate average utilization for in " +
971956
"ContainerBalancer.");
972957
return 0;
@@ -976,8 +961,8 @@ private long ratioToBytes(Long nodeCapacity, double utilizationRatio) {
976961
for (DatanodeUsageInfo node : nodes) {
977962
aggregatedStats.add(node.getScmNodeStat());
978963
}
979-
clusterCapacity = aggregatedStats.getCapacity().get();
980-
clusterRemaining = aggregatedStats.getRemaining().get();
964+
long clusterCapacity = aggregatedStats.getCapacity().get();
965+
long clusterRemaining = aggregatedStats.getRemaining().get();
981966

982967
return (clusterCapacity - clusterRemaining) / (double) clusterCapacity;
983968
}
@@ -1060,11 +1045,8 @@ private void incSizeSelectedForMoving(DatanodeDetails source,
10601045
*/
10611046
private void resetState() {
10621047
moveManager.resetState();
1063-
this.clusterCapacity = 0L;
1064-
this.clusterRemaining = 0L;
10651048
this.overUtilizedNodes.clear();
10661049
this.underUtilizedNodes.clear();
1067-
this.unBalancedNodes.clear();
10681050
this.containerToSourceMap.clear();
10691051
this.containerToTargetMap.clear();
10701052
this.selectedSources.clear();
@@ -1090,15 +1072,14 @@ private boolean isBalancerRunning() {
10901072
return taskStatus == Status.RUNNING;
10911073
}
10921074

1093-
/**
1094-
* Gets the list of unBalanced nodes, that is, the over and under utilized
1095-
* nodes in the cluster.
1096-
*
1097-
* @return List of DatanodeUsageInfo containing unBalanced nodes.
1098-
*/
10991075
@VisibleForTesting
1100-
List<DatanodeUsageInfo> getUnBalancedNodes() {
1101-
return unBalancedNodes;
1076+
public List<DatanodeUsageInfo> getOverUtilizedNodes() {
1077+
return overUtilizedNodes;
1078+
}
1079+
1080+
@VisibleForTesting
1081+
public List<DatanodeUsageInfo> getUnderUtilizedNodes() {
1082+
return underUtilizedNodes;
11021083
}
11031084

11041085
/**

hadoop-hdds/server-scm/src/test/java/org/apache/hadoop/hdds/scm/container/balancer/MockedSCM.java

Lines changed: 18 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -6,9 +6,9 @@
66
* to you under the Apache License, Version 2.0 (the
77
* "License"); you may not use this file except in compliance
88
* with the License. You may obtain a copy of the License at
9-
* <p>
10-
* http://www.apache.org/licenses/LICENSE-2.0
11-
* <p>
9+
*
10+
* http://www.apache.org/licenses/LICENSE-2.0
11+
*
1212
* Unless required by applicable law or agreed to in writing, software
1313
* distributed under the License is distributed on an "AS IS" BASIS,
1414
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
@@ -66,28 +66,32 @@ public final class MockedSCM {
6666
private final StorageContainerManager scm;
6767
private final TestableCluster cluster;
6868
private final MockNodeManager mockNodeManager;
69-
private MockedReplicationManager mockedReplicaManager;
70-
private MoveManager moveManager;
71-
private ContainerManager containerManager;
72-
69+
private final MockedReplicationManager mockedReplicaManager;
70+
private final MoveManager moveManager;
71+
private final ContainerManager containerManager;
7372
private MockedPlacementPolicies mockedPlacementPolicies;
7473

7574
public MockedSCM(@Nonnull TestableCluster testableCluster) {
7675
scm = mock(StorageContainerManager.class);
7776
cluster = testableCluster;
7877
mockNodeManager = new MockNodeManager(cluster.getDatanodeToContainersMap());
78+
try {
79+
moveManager = mockMoveManager();
80+
containerManager = mockContainerManager(cluster);
81+
mockedReplicaManager = MockedReplicationManager.doMock();
82+
} catch (NodeNotFoundException | ContainerReplicaNotFoundException | ContainerNotFoundException |
83+
TimeoutException e
84+
) {
85+
throw new RuntimeException("Can't create MockedSCM instance: ", e);
86+
}
7987
}
8088

81-
public void init(@Nonnull ContainerBalancerConfiguration balancerConfig) {
82-
init(balancerConfig, new OzoneConfiguration());
83-
}
84-
85-
public void init(@Nonnull ContainerBalancerConfiguration balancerConfig, @Nonnull OzoneConfiguration ozoneCfg) {
89+
private void init(@Nonnull ContainerBalancerConfiguration balancerConfig, @Nonnull OzoneConfiguration ozoneCfg) {
8690
ozoneCfg.setFromObject(balancerConfig);
8791
try {
8892
doMock(balancerConfig, ozoneCfg);
8993
} catch (IOException | NodeNotFoundException | TimeoutException e) {
90-
throw new RuntimeException("Can't initialize TestOzoneHDDS: ", e);
94+
throw new RuntimeException("Can't create MockedSCM instance: ", e);
9195
}
9296
}
9397

@@ -96,9 +100,6 @@ public void init(@Nonnull ContainerBalancerConfiguration balancerConfig, @Nonnul
96100
*/
97101
private void doMock(@Nonnull ContainerBalancerConfiguration cfg, @Nonnull OzoneConfiguration ozoneCfg)
98102
throws IOException, NodeNotFoundException, TimeoutException {
99-
containerManager = mockContainerManager(cluster);
100-
mockedReplicaManager = MockedReplicationManager.doMock();
101-
moveManager = mockMoveManager();
102103
StatefulServiceStateManager stateManager = MockedServiceStateManager.doMock();
103104
SCMServiceManager scmServiceManager = mockSCMServiceManger();
104105

@@ -137,7 +138,7 @@ public String toString() {
137138
}
138139

139140
public @Nonnull ContainerBalancerTask startBalancerTask(@Nonnull ContainerBalancerConfiguration config) {
140-
init(config);
141+
init(config, new OzoneConfiguration());
141142
return startBalancerTask(new ContainerBalancer(scm), config);
142143
}
143144

0 commit comments

Comments
 (0)