This is an automated email from the ASF dual-hosted git repository.

sammichen 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 6d0a8306ab HDDS-12721. Log more details about volumes (#8181)
6d0a8306ab is described below

commit 6d0a8306aba01483edfeab04e8b527985fa471b0
Author: Doroszlai, Attila <[email protected]>
AuthorDate: Mon Apr 7 06:36:38 2025 +0200

    HDDS-12721. Log more details about volumes (#8181)
---
 .../container/common/impl/HddsDispatcher.java      |  8 +++++--
 .../common/impl/StorageLocationReport.java         | 26 +++++++++++++++++++++
 .../common/volume/AvailableSpaceFilter.java        | 27 +++++-----------------
 .../ozone/container/common/volume/DbVolume.java    |  7 +++---
 .../ozone/container/common/volume/HddsVolume.java  |  7 ++----
 .../container/common/volume/StorageVolume.java     |  5 +++-
 .../replication/DownloadAndImportReplicator.java   |  8 +++----
 .../replication/SendContainerRequestHandler.java   |  8 +++----
 8 files changed, 55 insertions(+), 41 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 a8a73c7838..26c6bcf4ee 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
@@ -70,7 +70,6 @@
 import 
org.apache.hadoop.ozone.container.common.transport.server.ratis.DispatcherContext;
 import org.apache.hadoop.ozone.container.common.volume.HddsVolume;
 import org.apache.hadoop.ozone.container.common.volume.VolumeSet;
-import org.apache.hadoop.ozone.container.common.volume.VolumeUsage;
 import 
org.apache.hadoop.ozone.container.ozoneimpl.OnDemandContainerDataScanner;
 import org.apache.hadoop.util.Time;
 import org.apache.ratis.statemachine.StateMachine;
@@ -615,7 +614,12 @@ private boolean isVolumeFull(Container container) {
         .orElse(Boolean.FALSE);
     if (isOpen) {
       HddsVolume volume = container.getContainerData().getVolume();
-      return VolumeUsage.getUsableSpace(volume.getReport()) <= 0;
+      StorageLocationReport volumeReport = volume.getReport();
+      boolean full = volumeReport.getUsableSpace() <= 0;
+      if (full) {
+        LOG.info("Container {} volume is full: {}", 
container.getContainerData().getContainerID(), volumeReport);
+      }
+      return full;
     }
     return false;
   }
diff --git 
a/hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/container/common/impl/StorageLocationReport.java
 
b/hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/container/common/impl/StorageLocationReport.java
index 9fd094c6a6..5f539e121b 100644
--- 
a/hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/container/common/impl/StorageLocationReport.java
+++ 
b/hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/container/common/impl/StorageLocationReport.java
@@ -24,6 +24,7 @@
 import 
org.apache.hadoop.hdds.protocol.proto.StorageContainerDatanodeProtocolProtos.MetadataStorageReportProto;
 import 
org.apache.hadoop.hdds.protocol.proto.StorageContainerDatanodeProtocolProtos.StorageReportProto;
 import 
org.apache.hadoop.ozone.container.common.interfaces.StorageLocationReportMXBean;
+import org.apache.hadoop.ozone.container.common.volume.VolumeUsage;
 
 /**
  * Storage location stats of datanodes that provide back store for containers.
@@ -54,6 +55,10 @@ private StorageLocationReport(Builder builder) {
     this.storageLocation = builder.storageLocation;
   }
 
+  public long getUsableSpace() {
+    return VolumeUsage.getUsableSpace(this);
+  }
+
   @Override
   public String getId() {
     return id;
@@ -227,6 +232,27 @@ public static StorageLocationReport 
getFromProtobuf(StorageReportProto report)
     return builder.build();
   }
 
+  @Override
+  public String toString() {
+    StringBuilder sb = new StringBuilder(128)
+        .append("{")
+        .append(" id=").append(id)
+        .append(" dir=").append(storageLocation)
+        .append(" type=").append(storageType);
+
+    if (failed) {
+      sb.append(" failed");
+    } else {
+      sb.append(" capacity=").append(capacity)
+          .append(" used=").append(scmUsed)
+          .append(" available=").append(remaining)
+          .append(" minFree=").append(freeSpaceToSpare)
+          .append(" committed=").append(committed);
+    }
+
+    return sb.append(" }").toString();
+  }
+
   /**
    * Returns StorageLocation.Builder instance.
    *
diff --git 
a/hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/container/common/volume/AvailableSpaceFilter.java
 
b/hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/container/common/volume/AvailableSpaceFilter.java
index ef50e73cb3..6769a8eeae 100644
--- 
a/hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/container/common/volume/AvailableSpaceFilter.java
+++ 
b/hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/container/common/volume/AvailableSpaceFilter.java
@@ -17,8 +17,8 @@
 
 package org.apache.hadoop.ozone.container.common.volume;
 
-import java.util.HashMap;
-import java.util.Map;
+import java.util.LinkedList;
+import java.util.List;
 import java.util.function.Predicate;
 import org.apache.hadoop.ozone.container.common.impl.StorageLocationReport;
 
@@ -29,24 +29,23 @@
 public class AvailableSpaceFilter implements Predicate<HddsVolume> {
 
   private final long requiredSpace;
-  private final Map<HddsVolume, AvailableSpace> fullVolumes =
-      new HashMap<>();
+  private final List<StorageLocationReport> fullVolumes = new LinkedList<>();
   private long mostAvailableSpace = Long.MIN_VALUE;
 
-  public AvailableSpaceFilter(long requiredSpace) {
+  AvailableSpaceFilter(long requiredSpace) {
     this.requiredSpace = requiredSpace;
   }
 
   @Override
   public boolean test(HddsVolume vol) {
     StorageLocationReport report = vol.getReport();
-    long available = VolumeUsage.getUsableSpace(report);
+    long available = report.getUsableSpace();
     boolean hasEnoughSpace = available > requiredSpace;
 
     mostAvailableSpace = Math.max(available, mostAvailableSpace);
 
     if (!hasEnoughSpace) {
-      fullVolumes.put(vol, new AvailableSpace(report));
+      fullVolumes.add(report);
     }
 
     return hasEnoughSpace;
@@ -65,18 +64,4 @@ public String toString() {
     return "required space: " + requiredSpace +
         ", volumes: " + fullVolumes;
   }
-
-  private static class AvailableSpace {
-    private final StorageLocationReport report;
-
-    AvailableSpace(StorageLocationReport report) {
-      this.report = report;
-    }
-
-    @Override
-    public String toString() {
-      return "free: " + report.getRemaining() +
-          ", committed: " + report.getCommitted();
-    }
-  }
 }
diff --git 
a/hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/container/common/volume/DbVolume.java
 
b/hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/container/common/volume/DbVolume.java
index 0f188e53b1..a1f13998b8 100644
--- 
a/hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/container/common/volume/DbVolume.java
+++ 
b/hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/container/common/volume/DbVolume.java
@@ -55,13 +55,12 @@ protected DbVolume(Builder b) throws IOException {
     super(b);
 
     this.hddsDbStorePathMap = new HashMap<>();
-    if (!b.getFailedVolume()) {
-      LOG.info("Creating DbVolume: {} of storage type: {}, {}",
-              getStorageDir(), b.getStorageType(),
-              getCurrentUsage());
 
+    if (!b.getFailedVolume()) {
       initialize();
     }
+
+    LOG.info("DbVolume: {}", getReport());
   }
 
   @Override
diff --git 
a/hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/container/common/volume/HddsVolume.java
 
b/hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/container/common/volume/HddsVolume.java
index a81bde59b4..55bd550210 100644
--- 
a/hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/container/common/volume/HddsVolume.java
+++ 
b/hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/container/common/volume/HddsVolume.java
@@ -129,11 +129,6 @@ private HddsVolume(Builder b) throws IOException {
       this.volumeInfoMetrics =
           new VolumeInfoMetrics(b.getVolumeRootStr(), this);
 
-      LOG.info("Creating HddsVolume: {} of storage type: {}, {}",
-          getStorageDir(),
-          b.getStorageType(),
-          getCurrentUsage());
-
       initialize();
     } else {
       // Builder is called with failedVolume set, so create a failed volume
@@ -142,6 +137,8 @@ private HddsVolume(Builder b) throws IOException {
       volumeIOStats = null;
       volumeInfoMetrics = new VolumeInfoMetrics(b.getVolumeRootStr(), this);
     }
+
+    LOG.info("HddsVolume: {}", getReport());
   }
 
   @Override
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 9269619da9..fe0fa89692 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
@@ -123,6 +123,8 @@ public enum VolumeState {
   private final StorageType storageType;
   private final String volumeRoot;
   private final File storageDir;
+  /** This is the raw storage dir location, saved for logging, to avoid 
repeated filesystem lookup. */
+  private final String storageDirStr;
   private String workingDirName;
   private File tmpDir;
   private File diskCheckDir;
@@ -173,6 +175,7 @@ protected StorageVolume(Builder<?> b) throws IOException {
       this.conf = null;
       this.dnConf = null;
     }
+    this.storageDirStr = storageDir.getAbsolutePath();
   }
 
   public void format(String cid) throws IOException {
@@ -459,7 +462,7 @@ protected StorageLocationReport.Builder reportBuilder() {
     StorageLocationReport.Builder builder = StorageLocationReport.newBuilder()
         .setFailed(isFailed())
         .setId(getStorageID())
-        .setStorageLocation(volumeRoot)
+        .setStorageLocation(storageDirStr)
         .setStorageType(storageType);
 
     if (!builder.isFailed()) {
diff --git 
a/hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/container/replication/DownloadAndImportReplicator.java
 
b/hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/container/replication/DownloadAndImportReplicator.java
index 8c44d0d078..dc53ea8c73 100644
--- 
a/hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/container/replication/DownloadAndImportReplicator.java
+++ 
b/hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/container/replication/DownloadAndImportReplicator.java
@@ -26,7 +26,7 @@
 import org.apache.hadoop.hdds.protocol.DatanodeDetails;
 import org.apache.hadoop.hdds.scm.ScmConfigKeys;
 import org.apache.hadoop.ozone.container.common.impl.ContainerSet;
-import org.apache.hadoop.ozone.container.common.volume.AvailableSpaceFilter;
+import org.apache.hadoop.ozone.container.common.impl.StorageLocationReport;
 import org.apache.hadoop.ozone.container.common.volume.HddsVolume;
 import 
org.apache.hadoop.ozone.container.replication.AbstractReplicationTask.Status;
 import org.slf4j.Logger;
@@ -83,10 +83,10 @@ public void replicate(ReplicationTask task) {
       targetVolume = containerImporter.chooseNextVolume();
       // Increment committed bytes and verify if it doesn't cross the space 
left.
       targetVolume.incCommittedBytes(containerSize * 2);
+      StorageLocationReport volumeReport = targetVolume.getReport();
       // Already committed bytes increased above, so required space is not 
required here in AvailableSpaceFilter
-      AvailableSpaceFilter filter = new AvailableSpaceFilter(0);
-      if (!filter.test(targetVolume)) {
-        LOG.warn("Container {} replication was unsuccessful, due to no space 
left", containerID);
+      if (volumeReport.getUsableSpace() <= 0) {
+        LOG.warn("Container {} replication was unsuccessful, no space left on 
volume {}", containerID, volumeReport);
         task.setStatus(Status.FAILED);
         return;
       }
diff --git 
a/hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/container/replication/SendContainerRequestHandler.java
 
b/hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/container/replication/SendContainerRequestHandler.java
index e76a44e680..5224498e72 100644
--- 
a/hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/container/replication/SendContainerRequestHandler.java
+++ 
b/hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/container/replication/SendContainerRequestHandler.java
@@ -29,7 +29,7 @@
 import 
org.apache.hadoop.hdds.scm.container.common.helpers.StorageContainerException;
 import org.apache.hadoop.hdds.utils.IOUtils;
 import org.apache.hadoop.ozone.container.common.helpers.ContainerUtils;
-import org.apache.hadoop.ozone.container.common.volume.AvailableSpaceFilter;
+import org.apache.hadoop.ozone.container.common.impl.StorageLocationReport;
 import org.apache.hadoop.ozone.container.common.volume.HddsVolume;
 import org.apache.hadoop.util.DiskChecker;
 import org.apache.ratis.grpc.util.ZeroCopyMessageMarshaller;
@@ -89,11 +89,11 @@ public void onNext(SendContainerRequest req) {
         volume = importer.chooseNextVolume();
         // Increment committed bytes and verify if it doesn't cross the space 
left.
         volume.incCommittedBytes(importer.getDefaultContainerSize() * 2);
+        StorageLocationReport volumeReport = volume.getReport();
         // Already committed bytes increased above, so required space is not 
required here in AvailableSpaceFilter
-        AvailableSpaceFilter filter = new AvailableSpaceFilter(0);
-        if (!filter.test(volume)) {
+        if (volumeReport.getUsableSpace() <= 0) {
           volume.incCommittedBytes(-importer.getDefaultContainerSize() * 2);
-          LOG.warn("Container {} import was unsuccessful, due to no space 
left", containerId);
+          LOG.warn("Container {} import was unsuccessful, no space left on 
volume {}", containerId, volumeReport);
           volume = null;
           throw new DiskChecker.DiskOutOfSpaceException("No more available 
volumes");
         }


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

Reply via email to