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 62bce67d7c HDDS-9380. Reduce the number of system calls for space 
usage when DN writes a key (#5388)
62bce67d7c is described below

commit 62bce67d7c7bf082ce05c0e404c6257312341381
Author: XiChen <[email protected]>
AuthorDate: Thu Oct 5 20:36:06 2023 +0800

    HDDS-9380. Reduce the number of system calls for space usage when DN writes 
a key (#5388)
---
 .../container/common/impl/HddsDispatcher.java      |  7 +++-
 .../container/common/volume/StorageVolume.java     | 12 ++++++
 .../ozone/container/common/volume/VolumeInfo.java  | 10 +++++
 .../ozone/container/common/volume/VolumeUsage.java | 45 ++++++++++++++++++++++
 4 files changed, 72 insertions(+), 2 deletions(-)

diff --git 
a/hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/container/common/impl/HddsDispatcher.java
 
b/hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/container/common/impl/HddsDispatcher.java
index 300c15bb72..71b8486600 100644
--- 
a/hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/container/common/impl/HddsDispatcher.java
+++ 
b/hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/container/common/impl/HddsDispatcher.java
@@ -78,6 +78,7 @@ import java.util.TreeMap;
 import static 
org.apache.hadoop.hdds.scm.protocolPB.ContainerCommandResponseBuilders.malformedRequest;
 import static 
org.apache.hadoop.hdds.scm.protocolPB.ContainerCommandResponseBuilders.unsupportedRequest;
 import static 
org.apache.hadoop.ozone.container.common.interfaces.Container.ScanResult;
+import static 
org.apache.hadoop.ozone.container.common.volume.VolumeUsage.PrecomputedVolumeSpace;
 
 /**
  * Ozone Container dispatcher takes a call from the netty server and routes it
@@ -580,10 +581,12 @@ public class HddsDispatcher implements 
ContainerDispatcher, Auditor {
         .orElse(Boolean.FALSE);
     if (isOpen) {
       HddsVolume volume = container.getContainerData().getVolume();
-      long volumeCapacity = volume.getCapacity();
+      PrecomputedVolumeSpace precomputedVolumeSpace =
+          volume.getPrecomputedVolumeSpace();
+      long volumeCapacity = precomputedVolumeSpace.getCapacity();
       long volumeFreeSpaceToSpare =
           VolumeUsage.getMinVolumeFreeSpace(conf, volumeCapacity);
-      long volumeFree = volume.getAvailable();
+      long volumeFree = volume.getAvailable(precomputedVolumeSpace);
       long volumeCommitted = volume.getCommittedBytes();
       long volumeAvailable = volumeFree - volumeCommitted;
       return (volumeAvailable <= volumeFreeSpaceToSpare);
diff --git 
a/hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/container/common/volume/StorageVolume.java
 
b/hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/container/common/volume/StorageVolume.java
index dd48f0bb17..fc329ebeb0 100644
--- 
a/hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/container/common/volume/StorageVolume.java
+++ 
b/hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/container/common/volume/StorageVolume.java
@@ -50,6 +50,8 @@ import java.util.concurrent.atomic.AtomicInteger;
 import java.util.stream.Stream;
 
 import static 
org.apache.hadoop.ozone.container.common.HDDSVolumeLayoutVersion.getLatestVersion;
+import static 
org.apache.hadoop.ozone.container.common.volume.VolumeUsage.PrecomputedVolumeSpace;
+
 
 /**
  * StorageVolume represents a generic Volume in datanode, could be
@@ -454,6 +456,16 @@ public abstract class StorageVolume
 
   }
 
+  public long getAvailable(PrecomputedVolumeSpace precomputedVolumeSpace) {
+    return volumeInfo.map(info -> info.getAvailable(precomputedVolumeSpace))
+        .orElse(0L);
+  }
+
+  public PrecomputedVolumeSpace getPrecomputedVolumeSpace() {
+    return volumeInfo.map(VolumeInfo::getPrecomputedVolumeSpace)
+        .orElse(new PrecomputedVolumeSpace(0L, 0L));
+  }
+
   public long getUsedSpace() {
     return volumeInfo.map(VolumeInfo::getScmUsed).orElse(0L);
 
diff --git 
a/hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/container/common/volume/VolumeInfo.java
 
b/hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/container/common/volume/VolumeInfo.java
index 310f3ca1ae..61c0b422c7 100644
--- 
a/hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/container/common/volume/VolumeInfo.java
+++ 
b/hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/container/common/volume/VolumeInfo.java
@@ -32,6 +32,7 @@ import com.google.common.annotations.VisibleForTesting;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+import static 
org.apache.hadoop.ozone.container.common.volume.VolumeUsage.PrecomputedVolumeSpace;
 import static 
org.apache.hadoop.hdds.scm.ScmConfigKeys.HDDS_DATANODE_DIR_DU_RESERVED;
 import static 
org.apache.hadoop.hdds.scm.ScmConfigKeys.HDDS_DATANODE_DIR_DU_RESERVED_PERCENT;
 import static 
org.apache.hadoop.hdds.scm.ScmConfigKeys.HDDS_DATANODE_DIR_DU_RESERVED_PERCENT_DEFAULT;
@@ -239,6 +240,15 @@ public final class VolumeInfo {
     return Math.max(Math.min(avail, usage.getAvailable()), 0);
   }
 
+  public long getAvailable(PrecomputedVolumeSpace precomputedValues) {
+    long avail = precomputedValues.getCapacity() - usage.getUsedSpace();
+    return Math.max(Math.min(avail, usage.getAvailable(precomputedValues)), 0);
+  }
+
+  public PrecomputedVolumeSpace getPrecomputedVolumeSpace() {
+    return usage.getPrecomputedVolumeSpace();
+  }
+
   public void incrementUsedSpace(long usedSpace) {
     usage.incrementUsedSpace(usedSpace);
   }
diff --git 
a/hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/container/common/volume/VolumeUsage.java
 
b/hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/container/common/volume/VolumeUsage.java
index 87e50d680a..e7a06abc9e 100644
--- 
a/hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/container/common/volume/VolumeUsage.java
+++ 
b/hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/container/common/volume/VolumeUsage.java
@@ -65,6 +65,11 @@ public class VolumeUsage implements SpaceUsageSource {
     return source.getAvailable() - getRemainingReserved();
   }
 
+  public long getAvailable(PrecomputedVolumeSpace precomputedVolumeSpace) {
+    long available = precomputedVolumeSpace.getAvailable();
+    return available - getRemainingReserved(precomputedVolumeSpace);
+  }
+
   @Override
   public long getUsedSpace() {
     return source.getUsedSpace();
@@ -89,10 +94,21 @@ public class VolumeUsage implements SpaceUsageSource {
     return Math.max(totalUsed - source.getUsedSpace(), 0L);
   }
 
+  private long getOtherUsed(PrecomputedVolumeSpace precomputedVolumeSpace) {
+    long totalUsed = precomputedVolumeSpace.getCapacity() -
+        precomputedVolumeSpace.getAvailable();
+    return Math.max(totalUsed - source.getUsedSpace(), 0L);
+  }
+
   private long getRemainingReserved() {
     return Math.max(reservedInBytes - getOtherUsed(), 0L);
   }
 
+  private long getRemainingReserved(
+      PrecomputedVolumeSpace precomputedVolumeSpace) {
+    return Math.max(reservedInBytes - getOtherUsed(precomputedVolumeSpace), 
0L);
+  }
+
   public synchronized void start() {
     source.start();
   }
@@ -145,4 +161,33 @@ public class VolumeUsage implements SpaceUsageSource {
         HDDS_DATANODE_VOLUME_MIN_FREE_SPACE_DEFAULT, StorageUnit.BYTES);
 
   }
+
+  /**
+   * Class representing precomputed space values of a volume.
+   * This class is intended to store precomputed values, such as capacity
+   * and available space of a volume, to avoid recalculating these
+   * values multiple times and to make method signatures simpler.
+   */
+  public static class PrecomputedVolumeSpace {
+    private final long capacity;
+    private final long available;
+
+    public PrecomputedVolumeSpace(long capacity, long available) {
+      this.capacity = capacity;
+      this.available = available;
+    }
+
+    public long getCapacity() {
+      return capacity;
+    }
+
+    public long getAvailable() {
+      return available;
+    }
+  }
+
+  public PrecomputedVolumeSpace getPrecomputedVolumeSpace() {
+    return new PrecomputedVolumeSpace(source.getCapacity(),
+        source.getAvailable());
+  }
 }


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to