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

nanda 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 9e0f9677d4 HDDS-10967. Do Not Depend on Contiguous IDs for Proto Enum 
Initialization. (#6775)
9e0f9677d4 is described below

commit 9e0f9677d497ac444bcee029a593c27c3a65f989
Author: XiChen <[email protected]>
AuthorDate: Fri Jun 7 13:37:35 2024 +0800

    HDDS-10967. Do Not Depend on Contiguous IDs for Proto Enum Initialization. 
(#6775)
---
 .../hadoop/hdds/scm/XceiverClientMetrics.java      | 58 +++++++++-----------
 .../container/common/helpers/ContainerMetrics.java | 61 +++++++++-------------
 .../common/transport/server/ratis/CSMMetrics.java  | 16 +++---
 3 files changed, 59 insertions(+), 76 deletions(-)

diff --git 
a/hadoop-hdds/client/src/main/java/org/apache/hadoop/hdds/scm/XceiverClientMetrics.java
 
b/hadoop-hdds/client/src/main/java/org/apache/hadoop/hdds/scm/XceiverClientMetrics.java
index c750493675..d6a2faf3bb 100644
--- 
a/hadoop-hdds/client/src/main/java/org/apache/hadoop/hdds/scm/XceiverClientMetrics.java
+++ 
b/hadoop-hdds/client/src/main/java/org/apache/hadoop/hdds/scm/XceiverClientMetrics.java
@@ -33,6 +33,9 @@ import org.apache.hadoop.metrics2.lib.MutableCounterLong;
 import org.apache.hadoop.ozone.OzoneConfigKeys;
 import org.apache.hadoop.util.PerformanceMetrics;
 
+import java.util.EnumMap;
+
+
 /**
  * The client metrics for the Storage Container protocol.
  */
@@ -46,9 +49,9 @@ public class XceiverClientMetrics implements MetricsSource {
   private @Metric MutableCounterLong totalOps;
   private @Metric MutableCounterLong ecReconstructionTotal;
   private @Metric MutableCounterLong ecReconstructionFailsTotal;
-  private MutableCounterLong[] pendingOpsArray;
-  private MutableCounterLong[] opsArray;
-  private PerformanceMetrics[] containerOpsLatency;
+  private EnumMap<ContainerProtos.Type, MutableCounterLong> pendingOpsArray;
+  private EnumMap<ContainerProtos.Type, MutableCounterLong> opsArray;
+  private EnumMap<ContainerProtos.Type, PerformanceMetrics> 
containerOpsLatency;
   private MetricsRegistry registry;
   private OzoneConfiguration conf = new OzoneConfiguration();
   private int[] intervals = conf.getInts(OzoneConfigKeys
@@ -59,26 +62,18 @@ public class XceiverClientMetrics implements MetricsSource {
   }
 
   public void init() {
-    int numEnumEntries = ContainerProtos.Type.values().length;
     this.registry = new MetricsRegistry(SOURCE_NAME);
 
-    this.pendingOpsArray = new MutableCounterLong[numEnumEntries];
-    this.opsArray = new MutableCounterLong[numEnumEntries];
-    this.containerOpsLatency = new PerformanceMetrics[numEnumEntries];
-    for (int i = 0; i < numEnumEntries; i++) {
-      pendingOpsArray[i] = registry.newCounter(
-          "numPending" + ContainerProtos.Type.forNumber(i + 1),
-          "number of pending" + ContainerProtos.Type.forNumber(i + 1) + " ops",
-          (long) 0);
-      opsArray[i] = registry
-          .newCounter("opCount" + ContainerProtos.Type.forNumber(i + 1),
-              "number of" + ContainerProtos.Type.forNumber(i + 1) + " ops",
-              (long) 0);
-      containerOpsLatency[i] =
-          new PerformanceMetrics(registry,
-              ContainerProtos.Type.forNumber(i + 1) + "Latency",
-              "latency of " + ContainerProtos.Type.forNumber(i + 1),
-              "Ops", "Time", intervals);
+    this.pendingOpsArray = new EnumMap<>(ContainerProtos.Type.class);
+    this.opsArray = new EnumMap<>(ContainerProtos.Type.class);
+    this.containerOpsLatency = new EnumMap<>(ContainerProtos.Type.class);
+    for (ContainerProtos.Type type : ContainerProtos.Type.values()) {
+      pendingOpsArray.put(type, registry.newCounter("numPending" + type,
+          "number of pending" + type + " ops", (long) 0));
+      opsArray.put(type, registry.newCounter("opCount" + type,
+          "number of" + type + " ops", (long) 0));
+      containerOpsLatency.put(type, new PerformanceMetrics(registry,
+          type + "Latency", "latency of " + type, "Ops", "Time", intervals));
     }
   }
 
@@ -92,22 +87,22 @@ public class XceiverClientMetrics implements MetricsSource {
   public void incrPendingContainerOpsMetrics(ContainerProtos.Type type) {
     pendingOps.incr();
     totalOps.incr();
-    opsArray[type.ordinal()].incr();
-    pendingOpsArray[type.ordinal()].incr();
+    opsArray.get(type).incr();
+    pendingOpsArray.get(type).incr();
   }
 
   public void decrPendingContainerOpsMetrics(ContainerProtos.Type type) {
     pendingOps.incr(-1);
-    pendingOpsArray[type.ordinal()].incr(-1);
+    pendingOpsArray.get(type).incr(-1);
   }
 
   public void addContainerOpsLatency(ContainerProtos.Type type,
       long latencyMillis) {
-    containerOpsLatency[type.ordinal()].add(latencyMillis);
+    containerOpsLatency.get(type).add(latencyMillis);
   }
 
   public long getPendingContainerOpCountMetrics(ContainerProtos.Type type) {
-    return pendingOpsArray[type.ordinal()].value();
+    return pendingOpsArray.get(type).value();
   }
 
   public void incECReconstructionTotal() {
@@ -125,7 +120,7 @@ public class XceiverClientMetrics implements MetricsSource {
 
   @VisibleForTesting
   public long getContainerOpCountMetrics(ContainerProtos.Type type) {
-    return opsArray[type.ordinal()].value();
+    return opsArray.get(type).value();
   }
 
   @VisibleForTesting
@@ -147,11 +142,10 @@ public class XceiverClientMetrics implements 
MetricsSource {
     ecReconstructionTotal.snapshot(recordBuilder, true);
     ecReconstructionFailsTotal.snapshot(recordBuilder, true);
 
-    int numEnumEntries = ContainerProtos.Type.values().length;
-    for (int i = 0; i < numEnumEntries; i++) {
-      pendingOpsArray[i].snapshot(recordBuilder, true);
-      opsArray[i].snapshot(recordBuilder, true);
-      containerOpsLatency[i].snapshot(recordBuilder, true);
+    for (ContainerProtos.Type type : ContainerProtos.Type.values()) {
+      pendingOpsArray.get(type).snapshot(recordBuilder, b);
+      opsArray.get(type).snapshot(recordBuilder, b);
+      containerOpsLatency.get(type).snapshot(recordBuilder, b);
     }
   }
 }
diff --git 
a/hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/container/common/helpers/ContainerMetrics.java
 
b/hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/container/common/helpers/ContainerMetrics.java
index 337e4e3e29..4efa935bc8 100644
--- 
a/hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/container/common/helpers/ContainerMetrics.java
+++ 
b/hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/container/common/helpers/ContainerMetrics.java
@@ -31,6 +31,8 @@ import org.apache.hadoop.metrics2.lib.MutableCounterLong;
 import org.apache.hadoop.metrics2.lib.MutableQuantiles;
 import org.apache.hadoop.metrics2.lib.MutableRate;
 
+import java.util.EnumMap;
+
 /**
  *
  * This class is for maintaining  the various Storage Container
@@ -56,40 +58,35 @@ public class ContainerMetrics {
   @Metric private MutableCounterLong bytesReadStateMachine;
 
 
-  private MutableCounterLong[] numOpsArray;
-  private MutableCounterLong[] opsBytesArray;
-  private MutableRate[] opsLatency;
-  private MutableQuantiles[][] opsLatQuantiles;
+  private final EnumMap<ContainerProtos.Type, MutableCounterLong> numOpsArray;
+  private final EnumMap<ContainerProtos.Type, MutableCounterLong> 
opsBytesArray;
+  private final EnumMap<ContainerProtos.Type, MutableRate> opsLatency;
+  private final EnumMap<ContainerProtos.Type, MutableQuantiles[]> 
opsLatQuantiles;
   private MetricsRegistry registry = null;
 
   public ContainerMetrics(int[] intervals) {
-    int numEnumEntries = ContainerProtos.Type.values().length;
     final int len = intervals.length;
-    this.numOpsArray = new MutableCounterLong[numEnumEntries];
-    this.opsBytesArray = new MutableCounterLong[numEnumEntries];
-    this.opsLatency = new MutableRate[numEnumEntries];
-    this.opsLatQuantiles = new MutableQuantiles[numEnumEntries][len];
+    MutableQuantiles[] latQuantiles = new MutableQuantiles[len];
+    this.numOpsArray = new EnumMap<>(ContainerProtos.Type.class);
+    this.opsBytesArray = new EnumMap<>(ContainerProtos.Type.class);
+    this.opsLatency = new EnumMap<>(ContainerProtos.Type.class);
+    this.opsLatQuantiles = new EnumMap<>(ContainerProtos.Type.class);
     this.registry = new MetricsRegistry("StorageContainerMetrics");
-    for (int i = 0; i < numEnumEntries; i++) {
-      numOpsArray[i] = registry.newCounter(
-          "num" + ContainerProtos.Type.forNumber(i + 1),
-          "number of " + ContainerProtos.Type.forNumber(i + 1) + " ops",
-          (long) 0);
-      opsBytesArray[i] = registry.newCounter(
-          "bytes" + ContainerProtos.Type.forNumber(i + 1),
-          "bytes used by " + ContainerProtos.Type.forNumber(i + 1) + "op",
-          (long) 0);
-      opsLatency[i] = registry.newRate(
-          "latency" + ContainerProtos.Type.forNumber(i + 1),
-          ContainerProtos.Type.forNumber(i + 1) + " op");
+
+    for (ContainerProtos.Type type : ContainerProtos.Type.values()) {
+      numOpsArray.put(type, registry.newCounter(
+          "num" + type, "number of " + type + " ops", (long) 0));
+      opsBytesArray.put(type, registry.newCounter(
+          "bytes" + type, "bytes used by " + type + "op", (long) 0));
+      opsLatency.put(type, registry.newRate("latency" + type, type + " op"));
 
       for (int j = 0; j < len; j++) {
         int interval = intervals[j];
-        String quantileName = ContainerProtos.Type.forNumber(i + 1) + "Nanos"
-            + interval + "s";
-        opsLatQuantiles[i][j] = registry.newQuantiles(quantileName,
+        String quantileName = type + "Nanos" + interval + "s";
+        latQuantiles[j] = registry.newQuantiles(quantileName,
             "latency of Container ops", "ops", "latency", interval);
       }
+      opsLatQuantiles.put(type, latQuantiles);
     }
   }
 
@@ -110,27 +107,19 @@ public class ContainerMetrics {
 
   public void incContainerOpsMetrics(ContainerProtos.Type type) {
     numOps.incr();
-    numOpsArray[type.ordinal()].incr();
-  }
-
-  public long getContainerOpsMetrics(ContainerProtos.Type type) {
-    return numOpsArray[type.ordinal()].value();
+    numOpsArray.get(type).incr();
   }
 
   public void incContainerOpsLatencies(ContainerProtos.Type type,
                                        long latencyMillis) {
-    opsLatency[type.ordinal()].add(latencyMillis);
-    for (MutableQuantiles q: opsLatQuantiles[type.ordinal()]) {
+    opsLatency.get(type).add(latencyMillis);
+    for (MutableQuantiles q: opsLatQuantiles.get(type)) {
       q.add(latencyMillis);
     }
   }
 
   public void incContainerBytesStats(ContainerProtos.Type type, long bytes) {
-    opsBytesArray[type.ordinal()].incr(bytes);
-  }
-
-  public long getContainerBytesMetrics(ContainerProtos.Type type) {
-    return opsBytesArray[type.ordinal()].value();
+    opsBytesArray.get(type).incr(bytes);
   }
 
   public void incContainerDeleteFailedBlockCountNotZero() {
diff --git 
a/hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/container/common/transport/server/ratis/CSMMetrics.java
 
b/hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/container/common/transport/server/ratis/CSMMetrics.java
index 87572768e4..6bd1594618 100644
--- 
a/hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/container/common/transport/server/ratis/CSMMetrics.java
+++ 
b/hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/container/common/transport/server/ratis/CSMMetrics.java
@@ -19,6 +19,7 @@ package 
org.apache.hadoop.ozone.container.common.transport.server.ratis;
 
 import org.apache.hadoop.hdds.annotation.InterfaceAudience;
 import org.apache.hadoop.hdds.protocol.datanode.proto.ContainerProtos;
+import org.apache.hadoop.hdds.protocol.datanode.proto.ContainerProtos.Type;
 import org.apache.hadoop.metrics2.MetricsSystem;
 import org.apache.hadoop.metrics2.annotation.Metric;
 import org.apache.hadoop.metrics2.annotation.Metrics;
@@ -28,6 +29,8 @@ import org.apache.hadoop.metrics2.lib.MutableRate;
 import org.apache.hadoop.metrics2.lib.MetricsRegistry;
 import org.apache.ratis.protocol.RaftGroupId;
 
+import java.util.EnumMap;
+
 /**
  * This class is for maintaining Container State Machine statistics.
  */
@@ -46,7 +49,7 @@ public class CSMMetrics {
   private @Metric MutableCounterLong numBytesCommittedCount;
 
   private @Metric MutableRate transactionLatencyMs;
-  private MutableRate[] opsLatencyMs;
+  private final EnumMap<Type, MutableRate> opsLatencyMs;
   private MetricsRegistry registry = null;
 
   // Failure Metrics
@@ -66,13 +69,10 @@ public class CSMMetrics {
   private @Metric MutableRate writeStateMachineDataNs;
 
   public CSMMetrics() {
-    int numCmdTypes = ContainerProtos.Type.values().length;
-    this.opsLatencyMs = new MutableRate[numCmdTypes];
+    this.opsLatencyMs = new EnumMap<>(ContainerProtos.Type.class);
     this.registry = new MetricsRegistry(CSMMetrics.class.getSimpleName());
-    for (int i = 0; i < numCmdTypes; i++) {
-      opsLatencyMs[i] = registry.newRate(
-          ContainerProtos.Type.forNumber(i + 1).toString() + "Ms",
-          ContainerProtos.Type.forNumber(i + 1) + " op");
+    for (ContainerProtos.Type type : ContainerProtos.Type.values()) {
+      opsLatencyMs.put(type, registry.newRate(type.toString() + "Ms", type + " 
op"));
     }
   }
 
@@ -185,7 +185,7 @@ public class CSMMetrics {
 
   public void incPipelineLatencyMs(ContainerProtos.Type type,
       long latencyMillis) {
-    opsLatencyMs[type.ordinal()].add(latencyMillis);
+    opsLatencyMs.get(type).add(latencyMillis);
     transactionLatencyMs.add(latencyMillis);
   }
 


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

Reply via email to