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 206686837b HDDS-10046. Replace PrecomputedVolumeSpace with 
SpaceUsageSource.Fixed (#5904)
206686837b is described below

commit 206686837bd7fc3a470652d97b749efca08fd0e1
Author: Doroszlai, Attila <[email protected]>
AuthorDate: Fri Jan 5 08:25:02 2024 +0100

    HDDS-10046. Replace PrecomputedVolumeSpace with SpaceUsageSource.Fixed 
(#5904)
---
 .../apache/hadoop/hdds/fs/SpaceUsageSource.java    | 43 ++++++++++++++++++++++
 .../hadoop/hdds/fs/MockSpaceUsageSource.java       | 30 +--------------
 .../container/common/impl/HddsDispatcher.java      |  6 +--
 .../container/common/volume/StorageVolume.java     | 10 ++---
 .../ozone/container/common/volume/VolumeInfo.java  |  8 ++--
 .../ozone/container/common/volume/VolumeUsage.java | 40 ++++----------------
 6 files changed, 64 insertions(+), 73 deletions(-)

diff --git 
a/hadoop-hdds/common/src/main/java/org/apache/hadoop/hdds/fs/SpaceUsageSource.java
 
b/hadoop-hdds/common/src/main/java/org/apache/hadoop/hdds/fs/SpaceUsageSource.java
index f3e54f375c..c25c0a40c5 100644
--- 
a/hadoop-hdds/common/src/main/java/org/apache/hadoop/hdds/fs/SpaceUsageSource.java
+++ 
b/hadoop-hdds/common/src/main/java/org/apache/hadoop/hdds/fs/SpaceUsageSource.java
@@ -40,4 +40,47 @@ public interface SpaceUsageSource {
   long getCapacity();
 
   long getAvailable();
+
+  default SpaceUsageSource snapshot() {
+    return new Fixed(getCapacity(), getAvailable(), getUsedSpace());
+  }
+
+  SpaceUsageSource UNKNOWN = new Fixed(0, 0, 0);
+
+  /**
+   * A static source of space usage.  Can be a point in time snapshot of a
+   * real volume usage, or can be used for testing.
+   */
+  final class Fixed implements SpaceUsageSource {
+
+    private final long capacity;
+    private final long available;
+    private final long used;
+
+    Fixed(long capacity, long available, long used) {
+      this.capacity = capacity;
+      this.available = available;
+      this.used = used;
+    }
+
+    @Override
+    public long getCapacity() {
+      return capacity;
+    }
+
+    @Override
+    public long getAvailable() {
+      return available;
+    }
+
+    @Override
+    public long getUsedSpace() {
+      return used;
+    }
+
+    @Override
+    public SpaceUsageSource snapshot() {
+      return this; // immutable
+    }
+  }
 }
diff --git 
a/hadoop-hdds/common/src/test/java/org/apache/hadoop/hdds/fs/MockSpaceUsageSource.java
 
b/hadoop-hdds/common/src/test/java/org/apache/hadoop/hdds/fs/MockSpaceUsageSource.java
index 4055f080b9..26c861dc68 100644
--- 
a/hadoop-hdds/common/src/test/java/org/apache/hadoop/hdds/fs/MockSpaceUsageSource.java
+++ 
b/hadoop-hdds/common/src/test/java/org/apache/hadoop/hdds/fs/MockSpaceUsageSource.java
@@ -36,35 +36,7 @@ public final class MockSpaceUsageSource {
 
   public static SpaceUsageSource fixed(long capacity, long available,
       long used) {
-    return new Fixed(capacity, available, used);
-  }
-
-  private static final class Fixed implements SpaceUsageSource {
-
-    private final long capacity;
-    private final long available;
-    private final long used;
-
-    Fixed(long capacity, long available, long used) {
-      this.capacity = capacity;
-      this.available = available;
-      this.used = used;
-    }
-
-    @Override
-    public long getCapacity() {
-      return capacity;
-    }
-
-    @Override
-    public long getAvailable() {
-      return available;
-    }
-
-    @Override
-    public long getUsedSpace() {
-      return used;
-    }
+    return new SpaceUsageSource.Fixed(capacity, available, used);
   }
 
   private MockSpaceUsageSource() {
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 1b0ef29c77..eeb3548d5f 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
@@ -25,6 +25,7 @@ import org.apache.hadoop.hdds.HddsConfigKeys;
 import org.apache.hadoop.hdds.HddsUtils;
 import org.apache.hadoop.hdds.client.BlockID;
 import org.apache.hadoop.hdds.conf.ConfigurationSource;
+import org.apache.hadoop.hdds.fs.SpaceUsageSource;
 import org.apache.hadoop.hdds.protocol.datanode.proto.ContainerProtos;
 import 
org.apache.hadoop.hdds.protocol.datanode.proto.ContainerProtos.ContainerCommandRequestProto;
 import 
org.apache.hadoop.hdds.protocol.datanode.proto.ContainerProtos.ContainerCommandResponseProto;
@@ -78,7 +79,6 @@ 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
@@ -585,8 +585,8 @@ public class HddsDispatcher implements ContainerDispatcher, 
Auditor {
         .orElse(Boolean.FALSE);
     if (isOpen) {
       HddsVolume volume = container.getContainerData().getVolume();
-      PrecomputedVolumeSpace precomputedVolumeSpace =
-          volume.getPrecomputedVolumeSpace();
+      SpaceUsageSource precomputedVolumeSpace =
+          volume.getCurrentUsage();
       long volumeCapacity = precomputedVolumeSpace.getCapacity();
       long volumeFreeSpaceToSpare =
           VolumeUsage.getMinVolumeFreeSpace(conf, volumeCapacity);
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 fc329ebeb0..44ae1c0e79 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
@@ -23,6 +23,7 @@ import com.google.common.base.Preconditions;
 import org.apache.hadoop.fs.StorageType;
 import org.apache.hadoop.hdds.conf.ConfigurationSource;
 import org.apache.hadoop.hdds.fs.SpaceUsageCheckFactory;
+import org.apache.hadoop.hdds.fs.SpaceUsageSource;
 import org.apache.hadoop.hdfs.server.datanode.StorageLocation;
 import org.apache.hadoop.hdfs.server.datanode.checker.Checkable;
 import org.apache.hadoop.hdfs.server.datanode.checker.VolumeCheckResult;
@@ -50,7 +51,6 @@ 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;
 
 
 /**
@@ -456,14 +456,14 @@ public abstract class StorageVolume
 
   }
 
-  public long getAvailable(PrecomputedVolumeSpace precomputedVolumeSpace) {
+  public long getAvailable(SpaceUsageSource precomputedVolumeSpace) {
     return volumeInfo.map(info -> info.getAvailable(precomputedVolumeSpace))
         .orElse(0L);
   }
 
-  public PrecomputedVolumeSpace getPrecomputedVolumeSpace() {
-    return volumeInfo.map(VolumeInfo::getPrecomputedVolumeSpace)
-        .orElse(new PrecomputedVolumeSpace(0L, 0L));
+  public SpaceUsageSource getCurrentUsage() {
+    return volumeInfo.map(VolumeInfo::getCurrentUsage)
+        .orElse(SpaceUsageSource.UNKNOWN);
   }
 
   public long getUsedSpace() {
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 61c0b422c7..6ee35ba6b0 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
@@ -29,10 +29,10 @@ import org.apache.hadoop.hdds.fs.SpaceUsageCheckFactory;
 import org.apache.hadoop.hdds.fs.SpaceUsageCheckParams;
 
 import com.google.common.annotations.VisibleForTesting;
+import org.apache.hadoop.hdds.fs.SpaceUsageSource;
 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;
@@ -240,13 +240,13 @@ public final class VolumeInfo {
     return Math.max(Math.min(avail, usage.getAvailable()), 0);
   }
 
-  public long getAvailable(PrecomputedVolumeSpace precomputedValues) {
+  public long getAvailable(SpaceUsageSource precomputedValues) {
     long avail = precomputedValues.getCapacity() - usage.getUsedSpace();
     return Math.max(Math.min(avail, usage.getAvailable(precomputedValues)), 0);
   }
 
-  public PrecomputedVolumeSpace getPrecomputedVolumeSpace() {
-    return usage.getPrecomputedVolumeSpace();
+  public SpaceUsageSource getCurrentUsage() {
+    return usage.snapshot();
   }
 
   public void incrementUsedSpace(long 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 57cf0a8b9d..b2a66ba16b 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,7 +65,7 @@ public class VolumeUsage implements SpaceUsageSource {
     return source.getAvailable() - getRemainingReserved();
   }
 
-  public long getAvailable(PrecomputedVolumeSpace precomputedVolumeSpace) {
+  public long getAvailable(SpaceUsageSource precomputedVolumeSpace) {
     long available = precomputedVolumeSpace.getAvailable();
     return available - getRemainingReserved(precomputedVolumeSpace);
   }
@@ -75,6 +75,11 @@ public class VolumeUsage implements SpaceUsageSource {
     return source.getUsedSpace();
   }
 
+  @Override
+  public SpaceUsageSource snapshot() {
+    return source.snapshot();
+  }
+
   public void incrementUsedSpace(long usedSpace) {
     source.incrementUsedSpace(usedSpace);
   }
@@ -94,7 +99,7 @@ public class VolumeUsage implements SpaceUsageSource {
     return Math.max(totalUsed - source.getUsedSpace(), 0L);
   }
 
-  private long getOtherUsed(PrecomputedVolumeSpace precomputedVolumeSpace) {
+  private long getOtherUsed(SpaceUsageSource precomputedVolumeSpace) {
     long totalUsed = precomputedVolumeSpace.getCapacity() -
         precomputedVolumeSpace.getAvailable();
     return Math.max(totalUsed - source.getUsedSpace(), 0L);
@@ -105,7 +110,7 @@ public class VolumeUsage implements SpaceUsageSource {
   }
 
   private long getRemainingReserved(
-      PrecomputedVolumeSpace precomputedVolumeSpace) {
+      SpaceUsageSource precomputedVolumeSpace) {
     return Math.max(reservedInBytes - getOtherUsed(precomputedVolumeSpace), 
0L);
   }
 
@@ -169,33 +174,4 @@ public class VolumeUsage implements SpaceUsageSource {
     return (volumeAvailableSpace - volumeCommittedBytesCount) >
         Math.max(requiredSpace, volumeFreeSpaceToSpare);
   }
-
-  /**
-   * 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