siddhantsangwan commented on a change in pull request #2578:
URL: https://github.com/apache/ozone/pull/2578#discussion_r718451563
##########
File path:
hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/container/balancer/ContainerBalancer.java
##########
@@ -348,17 +361,24 @@ private boolean initializeIteration() {
}
private IterationResult doIteration() {
+ // note that potential and selected targets are updated in the following
+ // loop
List<DatanodeDetails> potentialTargets = getPotentialTargets();
Set<DatanodeDetails> selectedTargets =
new HashSet<>(potentialTargets.size());
moveSelectionToFutureMap = new HashMap<>(unBalancedNodes.size());
// match each overUtilized node with a target
for (DatanodeUsageInfo datanodeUsageInfo : overUtilizedNodes) {
+ if (!balancerRunning || Thread.currentThread().isInterrupted()) {
Review comment:
Yes, I think checking only `balancerRunning` is enough. I'll change this.
##########
File path:
hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/container/balancer/ContainerBalancer.java
##########
@@ -203,13 +205,17 @@ private void balance() {
} catch (InterruptedException e) {
LOG.info("Container Balancer was interrupted while waiting for" +
" next iteration.");
- stop();
+ if (!isBalancerRunning()) {
+ stop();
+ }
return;
}
}
}
}
- stop();
+ if (!isBalancerRunning()) {
Review comment:
Yes, I meant to check `isBalancerRunning` without the `!` to avoid a
deadlock. Thanks for pointing this mistake out!
##########
File path:
hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/container/balancer/ContainerBalancer.java
##########
@@ -718,8 +747,10 @@ public void stop() {
return;
}
balancerRunning = false;
- currentBalancingThread.interrupt();
- currentBalancingThread.join(1000);
+ if (Thread.currentThread().getId() != currentBalancingThread.getId()) {
+ currentBalancingThread.interrupt();
+ currentBalancingThread.join(0);
+ }
// allow garbage collector to collect balancing thread
currentBalancingThread = null;
Review comment:
Could `interrupt` be called on balancer from a test method?
##########
File path:
hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/container/balancer/ContainerBalancer.java
##########
@@ -184,7 +184,9 @@ private void balance() {
for (int i = 0; i < idleIteration && balancerRunning; i++) {
// stop balancing if iteration is not initialized
if (!initializeIteration()) {
- stop();
+ if (!isBalancerRunning()) {
+ stop();
+ }
return;
}
doIteration();
Review comment:
Checking if balancer is running also inherently means checking for
`ITERATION_INTERRUPTED`. So by checking `isBalancerRunning` we can check both:
If iteration was interrupted and if balancer was stopped (after intializing the
iteration) from CLI.
--
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
To unsubscribe, e-mail: [email protected]
For queries about this service, please contact Infrastructure at:
[email protected]
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]