This is an automated email from the ASF dual-hosted git repository.
adoroszlai pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/ozone.git
The following commit(s) were added to refs/heads/master by this push:
new ad2d125d26 HDDS-8347. Investigate possible race conditions on
ContainerInfo in ContainerBalancer (#4643)
ad2d125d26 is described below
commit ad2d125d26fef2a3193e8a734b7ef845d3eee3ad
Author: Siddhant Sangwan <[email protected]>
AuthorDate: Thu May 4 01:44:19 2023 +0530
HDDS-8347. Investigate possible race conditions on ContainerInfo in
ContainerBalancer (#4643)
---
.../org/apache/hadoop/hdds/scm/container/ContainerInfo.java | 8 +++++++-
.../balancer/ContainerBalancerSelectionCriteria.java | 12 +++++++-----
2 files changed, 14 insertions(+), 6 deletions(-)
diff --git
a/hadoop-hdds/common/src/main/java/org/apache/hadoop/hdds/scm/container/ContainerInfo.java
b/hadoop-hdds/common/src/main/java/org/apache/hadoop/hdds/scm/container/ContainerInfo.java
index 74373e1e54..67a0d433cc 100644
---
a/hadoop-hdds/common/src/main/java/org/apache/hadoop/hdds/scm/container/ContainerInfo.java
+++
b/hadoop-hdds/common/src/main/java/org/apache/hadoop/hdds/scm/container/ContainerInfo.java
@@ -52,7 +52,13 @@ public class ContainerInfo implements
Comparator<ContainerInfo>,
@JsonIgnore
private PipelineID pipelineID;
private ReplicationConfig replicationConfig;
- private long usedBytes;
+ /*
+ usedBytes is a volatile field. Writes and Reads of volatile long are atomic
+ and each read of a volatile will see the last write to that volatile by any
+ thread. Note that operations such as `usedBytes++` are not atomic, even if
+ usedBytes is volatile.
+ */
+ private volatile long usedBytes;
private long numberOfKeys;
private Instant lastUsed;
// The wall-clock ms since the epoch at which the current state enters.
diff --git
a/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/container/balancer/ContainerBalancerSelectionCriteria.java
b/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/container/balancer/ContainerBalancerSelectionCriteria.java
index 1b1ef7537a..ec0e493c28 100644
---
a/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/container/balancer/ContainerBalancerSelectionCriteria.java
+++
b/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/container/balancer/ContainerBalancerSelectionCriteria.java
@@ -181,7 +181,8 @@ public class ContainerBalancerSelectionCriteria {
return !isContainerClosed(container, node) || isECContainer(container) ||
isContainerReplicatingOrDeleting(containerID) ||
!findSourceStrategy.canSizeLeaveSource(node, container.getUsedBytes())
- || breaksMaxSizeToMoveLimit(container, sizeMovedAlready);
+ || breaksMaxSizeToMoveLimit(container.containerID(),
+ container.getUsedBytes(), sizeMovedAlready);
}
/**
@@ -221,13 +222,14 @@ public class ContainerBalancerSelectionCriteria {
return false;
}
- private boolean breaksMaxSizeToMoveLimit(ContainerInfo container,
- long sizeMovedAlready) {
+ private boolean breaksMaxSizeToMoveLimit(ContainerID containerID,
+ long usedBytes,
+ long sizeMovedAlready) {
// check max size to move per iteration limit
- if (sizeMovedAlready + container.getUsedBytes() >
+ if (sizeMovedAlready + usedBytes >
balancerConfiguration.getMaxSizeToMovePerIteration()) {
LOG.debug("Removing container {} because it fails max size " +
- "to move per iteration check.", container.containerID());
+ "to move per iteration check.", containerID);
return true;
}
return false;
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]