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]

Reply via email to