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

siddhant 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 2250a481d6 HDDS-7799. Add container count to datanode usage info 
(#4209)
2250a481d6 is described below

commit 2250a481d60babf6de96860e03f00f2a56fd98ee
Author: djordje-mijatovic <[email protected]>
AuthorDate: Wed Feb 8 12:38:25 2023 +0100

    HDDS-7799. Add container count to datanode usage info (#4209)
---
 .../interface-client/src/main/proto/hdds.proto     |  1 +
 .../hadoop/hdds/scm/node/DatanodeUsageInfo.java    | 12 ++++++++
 .../hadoop/hdds/scm/node/SCMNodeManager.java       | 13 +++++++--
 .../hdds/scm/server/SCMClientProtocolServer.java   | 15 ++--------
 .../hdds/scm/cli/datanode/UsageInfoSubcommand.java | 12 +++++++-
 .../scm/cli/datanode/TestUsageInfoSubcommand.java  |  4 +++
 .../hadoop/ozone/TestContainerOperations.java      | 34 ++++++++++++++++++++++
 7 files changed, 74 insertions(+), 17 deletions(-)

diff --git a/hadoop-hdds/interface-client/src/main/proto/hdds.proto 
b/hadoop-hdds/interface-client/src/main/proto/hdds.proto
index 555431b199..2ff39cab58 100644
--- a/hadoop-hdds/interface-client/src/main/proto/hdds.proto
+++ b/hadoop-hdds/interface-client/src/main/proto/hdds.proto
@@ -186,6 +186,7 @@ message DatanodeUsageInfoProto {
     optional int64 used = 2;
     optional int64 remaining = 3;
     optional DatanodeDetailsProto node = 4;
+    optional int64 containerCount = 5;
 }
 
 /**
diff --git 
a/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/node/DatanodeUsageInfo.java
 
b/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/node/DatanodeUsageInfo.java
index 8de0a412c2..14353cfa7e 100644
--- 
a/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/node/DatanodeUsageInfo.java
+++ 
b/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/node/DatanodeUsageInfo.java
@@ -31,6 +31,7 @@ public class DatanodeUsageInfo {
 
   private DatanodeDetails datanodeDetails;
   private SCMNodeStat scmNodeStat;
+  private int containerCount;
 
   /**
    * Constructs a DatanodeUsageInfo with DatanodeDetails and SCMNodeStat.
@@ -43,6 +44,7 @@ public class DatanodeUsageInfo {
       SCMNodeStat scmNodeStat) {
     this.datanodeDetails = datanodeDetails;
     this.scmNodeStat = scmNodeStat;
+    this.containerCount = -1;
   }
 
   /**
@@ -135,6 +137,14 @@ public class DatanodeUsageInfo {
     return scmNodeStat;
   }
 
+  public int getContainerCount() {
+    return containerCount;
+  }
+
+  public void setContainerCount(int containerCount) {
+    this.containerCount = containerCount;
+  }
+
   /**
    * Gets Comparator that compares two DatanodeUsageInfo on the basis of
    * their utilization values. Utilization is (capacity - remaining) divided
@@ -196,6 +206,8 @@ public class DatanodeUsageInfo {
       builder.setUsed(scmNodeStat.getScmUsed().get());
       builder.setRemaining(scmNodeStat.getRemaining().get());
     }
+
+    builder.setContainerCount(containerCount);
     return builder;
   }
 }
diff --git 
a/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/node/SCMNodeManager.java
 
b/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/node/SCMNodeManager.java
index a697dd2846..7a62088ba7 100644
--- 
a/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/node/SCMNodeManager.java
+++ 
b/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/node/SCMNodeManager.java
@@ -826,8 +826,8 @@ public class SCMNodeManager implements NodeManager {
     // create a DatanodeUsageInfo from each DatanodeDetails and add it to the
     // list
     for (DatanodeDetails node : healthyNodes) {
-      SCMNodeStat stat = getNodeStatInternal(node);
-      datanodeUsageInfoList.add(new DatanodeUsageInfo(node, stat));
+      DatanodeUsageInfo datanodeUsageInfo = getUsageInfo(node);
+      datanodeUsageInfoList.add(datanodeUsageInfo);
     }
 
     // sort the list according to appropriate comparator
@@ -850,7 +850,14 @@ public class SCMNodeManager implements NodeManager {
   @Override
   public DatanodeUsageInfo getUsageInfo(DatanodeDetails dn) {
     SCMNodeStat stat = getNodeStatInternal(dn);
-    return new DatanodeUsageInfo(dn, stat);
+    DatanodeUsageInfo usageInfo = new DatanodeUsageInfo(dn, stat);
+    try {
+      int containerCount = getContainers(dn).size();
+      usageInfo.setContainerCount(containerCount);
+    } catch (NodeNotFoundException ex) {
+      LOG.error("Unknown datanode {}.", dn, ex);
+    }
+    return usageInfo;
   }
 
   /**
diff --git 
a/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/server/SCMClientProtocolServer.java
 
b/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/server/SCMClientProtocolServer.java
index 0a7eeb81e5..5b98aad4b1 100644
--- 
a/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/server/SCMClientProtocolServer.java
+++ 
b/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/server/SCMClientProtocolServer.java
@@ -46,7 +46,6 @@ import 
org.apache.hadoop.hdds.scm.container.balancer.ContainerBalancerConfigurat
 import 
org.apache.hadoop.hdds.scm.container.balancer.IllegalContainerBalancerStateException;
 import 
org.apache.hadoop.hdds.scm.container.balancer.InvalidContainerBalancerConfigurationException;
 import 
org.apache.hadoop.hdds.scm.container.common.helpers.ContainerWithPipeline;
-import org.apache.hadoop.hdds.scm.container.placement.metrics.SCMNodeStat;
 import org.apache.hadoop.hdds.scm.events.SCMEvents;
 import org.apache.hadoop.hdds.scm.exceptions.SCMException;
 import org.apache.hadoop.hdds.scm.exceptions.SCMException.ResultCodes;
@@ -1048,18 +1047,8 @@ public class SCMClientProtocolServer implements
    */
   private HddsProtos.DatanodeUsageInfoProto getUsageInfoFromDatanodeDetails(
       DatanodeDetails node, int clientVersion) {
-    SCMNodeStat stat = scm.getScmNodeManager().getNodeStat(node).get();
-
-    long capacity = stat.getCapacity().get();
-    long used = stat.getScmUsed().get();
-    long remaining = stat.getRemaining().get();
-
-    return HddsProtos.DatanodeUsageInfoProto.newBuilder()
-        .setCapacity(capacity)
-        .setUsed(used)
-        .setRemaining(remaining)
-        .setNode(node.toProto(clientVersion))
-        .build();
+    DatanodeUsageInfo usageInfo = scm.getScmNodeManager().getUsageInfo(node);
+    return usageInfo.toProto(clientVersion);
   }
 
   /**
diff --git 
a/hadoop-hdds/tools/src/main/java/org/apache/hadoop/hdds/scm/cli/datanode/UsageInfoSubcommand.java
 
b/hadoop-hdds/tools/src/main/java/org/apache/hadoop/hdds/scm/cli/datanode/UsageInfoSubcommand.java
index d404a6ce1e..5bd6b42b44 100644
--- 
a/hadoop-hdds/tools/src/main/java/org/apache/hadoop/hdds/scm/cli/datanode/UsageInfoSubcommand.java
+++ 
b/hadoop-hdds/tools/src/main/java/org/apache/hadoop/hdds/scm/cli/datanode/UsageInfoSubcommand.java
@@ -151,8 +151,10 @@ public class UsageInfoSubcommand extends ScmSubcommand {
     // print total remaining space and its percentage in a readable format
     System.out.printf("%-13s: %s (%s) %n", "Remaining", info.getRemaining()
         + " B", StringUtils.byteDesc(info.getRemaining()));
-    System.out.printf("%-13s: %s %n%n", "Remaining %",
+    System.out.printf("%-13s: %s %n", "Remaining %",
         PERCENT_FORMAT.format(info.getRemainingRatio()));
+    System.out.printf("%-13s: %d %n%n", "Container(s)",
+            info.getContainerCount());
   }
 
   /**
@@ -177,6 +179,7 @@ public class UsageInfoSubcommand extends ScmSubcommand {
     private long capacity = 0;
     private long used = 0;
     private long remaining = 0;
+    private long containerCount = 0;
 
     DatanodeUsage(HddsProtos.DatanodeUsageInfoProto proto) {
       if (proto.hasNode()) {
@@ -191,6 +194,9 @@ public class UsageInfoSubcommand extends ScmSubcommand {
       if (proto.hasRemaining()) {
         remaining = proto.getRemaining();
       }
+      if (proto.hasContainerCount()) {
+        containerCount = proto.getContainerCount();
+      }
     }
 
     public DatanodeDetails getDatanodeDetails() {
@@ -213,6 +219,10 @@ public class UsageInfoSubcommand extends ScmSubcommand {
       return remaining;
     }
 
+    public long getContainerCount() {
+      return containerCount;
+    }
+
     @JsonSerialize(using = DecimalJsonSerializer.class)
     public double getTotalUsedPercent() {
       return getTotalUsedRatio() * 100;
diff --git 
a/hadoop-hdds/tools/src/test/java/org/apache/hadoop/hdds/scm/cli/datanode/TestUsageInfoSubcommand.java
 
b/hadoop-hdds/tools/src/test/java/org/apache/hadoop/hdds/scm/cli/datanode/TestUsageInfoSubcommand.java
index f82acc8c24..0cc8ed9be6 100644
--- 
a/hadoop-hdds/tools/src/test/java/org/apache/hadoop/hdds/scm/cli/datanode/TestUsageInfoSubcommand.java
+++ 
b/hadoop-hdds/tools/src/test/java/org/apache/hadoop/hdds/scm/cli/datanode/TestUsageInfoSubcommand.java
@@ -92,6 +92,9 @@ public class TestUsageInfoSubcommand {
         json.get(0).get("ozoneUsedPercent").doubleValue(), 0.001);
     Assertions.assertEquals(80.00,
         json.get(0).get("remainingPercent").doubleValue(), 0.001);
+
+    Assertions.assertEquals(5,
+            json.get(0).get("containerCount").longValue());
   }
 
   private List<HddsProtos.DatanodeUsageInfoProto> getUsageProto() {
@@ -101,6 +104,7 @@ public class TestUsageInfoSubcommand {
         .setCapacity(100)
         .setRemaining(80)
         .setUsed(10)
+        .setContainerCount(5)
         .build());
     return result;
   }
diff --git 
a/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/TestContainerOperations.java
 
b/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/TestContainerOperations.java
index 708bbc003d..dba8136f96 100644
--- 
a/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/TestContainerOperations.java
+++ 
b/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/TestContainerOperations.java
@@ -132,4 +132,38 @@ public class TestContainerOperations {
           .anyMatch(port -> REPLICATION.name().equals(port.getName())));
     }
   }
+
+  @Test
+  public void testDatanodeUsageInfoContainerCount() throws IOException {
+    List<DatanodeDetails> dnList = cluster.getStorageContainerManager()
+            .getScmNodeManager()
+            .getAllNodes();
+
+    for (DatanodeDetails dn : dnList) {
+      List<HddsProtos.DatanodeUsageInfoProto> usageInfoList =
+              storageClient.getDatanodeUsageInfo(
+                      dn.getIpAddress(), dn.getUuidString());
+
+      assertEquals(1, usageInfoList.size());
+      assertEquals(0, usageInfoList.get(0).getContainerCount());
+    }
+
+    storageClient.createContainer(HddsProtos
+            .ReplicationType.STAND_ALONE, HddsProtos.ReplicationFactor
+            .ONE, OzoneConsts.OZONE);
+
+    int[] totalContainerCount = new int[2];
+    for (DatanodeDetails dn : dnList) {
+      List<HddsProtos.DatanodeUsageInfoProto> usageInfoList =
+              storageClient.getDatanodeUsageInfo(
+                      dn.getIpAddress(), dn.getUuidString());
+
+      assertEquals(1, usageInfoList.size());
+      assertTrue(usageInfoList.get(0).getContainerCount() >= 0 &&
+              usageInfoList.get(0).getContainerCount() <= 1);
+      totalContainerCount[(int)usageInfoList.get(0).getContainerCount()]++;
+    }
+    assertEquals(2, totalContainerCount[0]);
+    assertEquals(1, totalContainerCount[1]);
+  }
 }


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

Reply via email to