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

ChenSammi 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 e33a7c77739 HDDS-15452. Split DataNodeMetricsServiceResponse response 
into state specific DTOs (#10426)
e33a7c77739 is described below

commit e33a7c777393830cd55323b64015a8ee80658a31
Author: Priyesh Karatha <[email protected]>
AuthorDate: Tue Jun 23 17:24:18 2026 +0530

    HDDS-15452. Split DataNodeMetricsServiceResponse response into state 
specific DTOs (#10426)
---
 .../AbstractTestStorageDistributionEndpoint.java   |  14 +--
 .../ozone/recon/api/DataNodeMetricsService.java    |  52 ++++++---
 .../ozone/recon/api/PendingDeletionEndpoint.java   |  12 +-
 .../recon/api/StorageDistributionEndpoint.java     |  18 ++-
 .../api/types/DataNodeMetricsCompleteResponse.java |  79 +++++++++++++
 .../api/types/DataNodeMetricsProgressResponse.java |  53 +++++++++
 .../api/types/DataNodeMetricsServiceResponse.java  | 130 ---------------------
 .../recon/api/TestPendingDeletionEndpoint.java     |  35 +++---
 .../recon/api/TestStorageDistributionEndpoint.java |  30 +++--
 9 files changed, 227 insertions(+), 196 deletions(-)

diff --git 
a/hadoop-ozone/integration-test-recon/src/test/java/org/apache/hadoop/ozone/recon/AbstractTestStorageDistributionEndpoint.java
 
b/hadoop-ozone/integration-test-recon/src/test/java/org/apache/hadoop/ozone/recon/AbstractTestStorageDistributionEndpoint.java
index 8345c51b690..aeba50400a9 100644
--- 
a/hadoop-ozone/integration-test-recon/src/test/java/org/apache/hadoop/ozone/recon/AbstractTestStorageDistributionEndpoint.java
+++ 
b/hadoop-ozone/integration-test-recon/src/test/java/org/apache/hadoop/ozone/recon/AbstractTestStorageDistributionEndpoint.java
@@ -63,7 +63,7 @@
 import org.apache.hadoop.ozone.om.helpers.OmMultipartInfo;
 import org.apache.hadoop.ozone.om.protocol.OzoneManagerProtocol;
 import org.apache.hadoop.ozone.recon.api.DataNodeMetricsService;
-import org.apache.hadoop.ozone.recon.api.types.DataNodeMetricsServiceResponse;
+import org.apache.hadoop.ozone.recon.api.types.DataNodeMetricsCompleteResponse;
 import org.apache.hadoop.ozone.recon.api.types.DatanodeStorageReport;
 import org.apache.hadoop.ozone.recon.api.types.ScmPendingDeletion;
 import 
org.apache.hadoop.ozone.recon.api.types.StorageCapacityDistributionResponse;
@@ -313,8 +313,8 @@ protected boolean verifyPendingDeletionAfterKeyDeletionDn() 
{
       StringBuilder urlBuilder = new StringBuilder();
       
urlBuilder.append(getReconWebAddress(conf)).append(PENDING_DELETION_ENDPOINT).append("?component=dn");
       String response = TestReconEndpointUtil.makeHttpCall(conf, urlBuilder);
-      DataNodeMetricsServiceResponse pendingDeletion =
-          MAPPER.readValue(response, DataNodeMetricsServiceResponse.class);
+      DataNodeMetricsCompleteResponse pendingDeletion =
+          MAPPER.readValue(response, DataNodeMetricsCompleteResponse.class);
       assertNotNull(pendingDeletion);
       assertEquals(300, pendingDeletion.getTotalPendingDeletionSize());
       assertEquals(DataNodeMetricsService.MetricCollectionStatus.FINISHED, 
pendingDeletion.getStatus());
@@ -336,8 +336,8 @@ protected boolean verifyPendingDeletionClearsAtDn() {
       StringBuilder urlBuilder = new StringBuilder();
       
urlBuilder.append(getReconWebAddress(conf)).append(PENDING_DELETION_ENDPOINT).append("?component=dn");
       String response = TestReconEndpointUtil.makeHttpCall(conf, urlBuilder);
-      DataNodeMetricsServiceResponse pendingDeletion =
-          MAPPER.readValue(response, DataNodeMetricsServiceResponse.class);
+      DataNodeMetricsCompleteResponse pendingDeletion =
+          MAPPER.readValue(response, DataNodeMetricsCompleteResponse.class);
       assertNotNull(pendingDeletion);
       assertEquals(0, pendingDeletion.getTotalPendingDeletionSize());
       assertEquals(DataNodeMetricsService.MetricCollectionStatus.FINISHED, 
pendingDeletion.getStatus());
@@ -358,8 +358,8 @@ protected boolean 
verifyPendingDeletionAfterKeyDeletionOnDnFailure() {
       StringBuilder urlBuilder = new StringBuilder();
       
urlBuilder.append(getReconWebAddress(conf)).append(PENDING_DELETION_ENDPOINT).append("?component=dn");
       String response = TestReconEndpointUtil.makeHttpCall(conf, urlBuilder);
-      DataNodeMetricsServiceResponse pendingDeletion =
-          MAPPER.readValue(response, DataNodeMetricsServiceResponse.class);
+      DataNodeMetricsCompleteResponse pendingDeletion =
+          MAPPER.readValue(response, DataNodeMetricsCompleteResponse.class);
       assertNotNull(pendingDeletion);
       assertEquals(1, pendingDeletion.getTotalNodeQueryFailures());
       assertTrue(pendingDeletion.getPendingDeletionPerDataNode()
diff --git 
a/hadoop-ozone/recon/src/main/java/org/apache/hadoop/ozone/recon/api/DataNodeMetricsService.java
 
b/hadoop-ozone/recon/src/main/java/org/apache/hadoop/ozone/recon/api/DataNodeMetricsService.java
index 369c5514d31..d71d383e772 100644
--- 
a/hadoop-ozone/recon/src/main/java/org/apache/hadoop/ozone/recon/api/DataNodeMetricsService.java
+++ 
b/hadoop-ozone/recon/src/main/java/org/apache/hadoop/ozone/recon/api/DataNodeMetricsService.java
@@ -48,7 +48,8 @@
 import org.apache.hadoop.hdds.scm.server.OzoneStorageContainerManager;
 import org.apache.hadoop.hdds.server.http.HttpConfig;
 import org.apache.hadoop.ozone.recon.MetricsServiceProviderFactory;
-import org.apache.hadoop.ozone.recon.api.types.DataNodeMetricsServiceResponse;
+import org.apache.hadoop.ozone.recon.api.types.DataNodeMetricsCompleteResponse;
+import org.apache.hadoop.ozone.recon.api.types.DataNodeMetricsProgressResponse;
 import org.apache.hadoop.ozone.recon.api.types.DatanodePendingDeletionMetrics;
 import org.apache.hadoop.ozone.recon.scm.ReconNodeManager;
 import org.apache.hadoop.ozone.recon.tasks.DataNodeMetricsCollectionTask;
@@ -74,6 +75,7 @@ public class DataNodeMetricsService {
   private final AtomicBoolean isRunning = new AtomicBoolean(false);
   
   private MetricCollectionStatus currentStatus = 
MetricCollectionStatus.NOT_STARTED;
+  private volatile String failedMessage = "Metrics collection task failed. 
Please retry after some time.";
   private List<DatanodePendingDeletionMetrics> pendingDeletionList;
   private Long totalPendingDeletion = 0L;
   private int totalNodesQueried;
@@ -160,6 +162,7 @@ private void collectMetrics(List<DatanodeInfo> nodes) {
     } catch (Exception e) {
       resetState();
       currentStatus = MetricCollectionStatus.FAILED;
+      failedMessage = e.getLocalizedMessage();
       isRunning.set(false);
     }
   }
@@ -301,27 +304,40 @@ private void resetState() {
     totalNodesFailed = 0;
   }
 
-  public DataNodeMetricsServiceResponse getCollectedMetrics(Integer limit) {
+  /**
+   * Returns either {@link DataNodeMetricsCompleteResponse} when collection is
+   * finished, or {@link DataNodeMetricsProgressResponse} otherwise.
+   */
+  public Object getCollectedMetrics(Integer limit) {
     startTask();
     if (currentStatus == MetricCollectionStatus.FINISHED) {
-      DataNodeMetricsServiceResponse.Builder dnMetricsBuilder = 
DataNodeMetricsServiceResponse.newBuilder();
-      dnMetricsBuilder
-          .setStatus(currentStatus)
-          .setTotalPendingDeletionSize(totalPendingDeletion)
-          .setTotalNodesQueried(totalNodesQueried)
-          .setTotalNodeQueryFailures(totalNodesFailed);
+      List<DatanodePendingDeletionMetrics> list =
+          (limit == null) ? pendingDeletionList :
+              pendingDeletionList.subList(0, Math.min(limit, 
pendingDeletionList.size()));
+      return new DataNodeMetricsCompleteResponse(
+          currentStatus,
+          totalNodesQueried,
+          totalNodesFailed,
+          totalPendingDeletion,
+          list);
+    }
 
-      if (null == limit) {
-        return 
dnMetricsBuilder.setPendingDeletion(pendingDeletionList).build();
-      } else {
-        return dnMetricsBuilder.setPendingDeletion(
-            pendingDeletionList.subList(0, Math.min(limit, 
pendingDeletionList.size())
-        )).build();
-      }
+    return new DataNodeMetricsProgressResponse(
+        currentStatus,
+        buildProgressMessage(currentStatus, failedMessage));
+  }
+
+  private static String buildProgressMessage(MetricCollectionStatus status, 
String failedMessage) {
+    switch (status) {
+    case IN_PROGRESS:
+      return "Metrics collection task is currently running. Please wait for 
task to finish.";
+    case FAILED:
+      return failedMessage;
+    case NOT_STARTED:
+      return "Metrics collection task has not started yet. Please retry 
shortly.";
+    default:
+      return "Metrics collection task is not complete yet. Please retry 
shortly.";
     }
-    return DataNodeMetricsServiceResponse.newBuilder()
-        .setStatus(currentStatus)
-        .build();
   }
 
   @PreDestroy
diff --git 
a/hadoop-ozone/recon/src/main/java/org/apache/hadoop/ozone/recon/api/PendingDeletionEndpoint.java
 
b/hadoop-ozone/recon/src/main/java/org/apache/hadoop/ozone/recon/api/PendingDeletionEndpoint.java
index bb4ea53ae9f..4554379b6ca 100644
--- 
a/hadoop-ozone/recon/src/main/java/org/apache/hadoop/ozone/recon/api/PendingDeletionEndpoint.java
+++ 
b/hadoop-ozone/recon/src/main/java/org/apache/hadoop/ozone/recon/api/PendingDeletionEndpoint.java
@@ -26,7 +26,7 @@
 import javax.ws.rs.core.Response;
 import org.apache.hadoop.hdds.protocol.proto.HddsProtos;
 import org.apache.hadoop.hdds.scm.protocol.StorageContainerLocationProtocol;
-import org.apache.hadoop.ozone.recon.api.types.DataNodeMetricsServiceResponse;
+import org.apache.hadoop.ozone.recon.api.types.DataNodeMetricsCompleteResponse;
 import org.apache.hadoop.ozone.recon.api.types.ScmPendingDeletion;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -86,12 +86,12 @@ private Response handleDataNodeMetrics(Integer limit) {
           .entity("Limit query parameter must be at-least 1").build();
     }
 
-    DataNodeMetricsServiceResponse response = 
dataNodeMetricsService.getCollectedMetrics(limit);
-    if (response.getStatus() == 
DataNodeMetricsService.MetricCollectionStatus.FINISHED) {
-      return Response.ok(response).build();
-    } else {
-      return Response.accepted(response).build();
+    Object response = dataNodeMetricsService.getCollectedMetrics(limit);
+    if (response instanceof DataNodeMetricsCompleteResponse) {
+      DataNodeMetricsCompleteResponse completeResponse = 
(DataNodeMetricsCompleteResponse) response;
+      return Response.ok(completeResponse).build();
     }
+    return Response.accepted(response).build();
   }
 
   private Response handleScmPendingDeletion() {
diff --git 
a/hadoop-ozone/recon/src/main/java/org/apache/hadoop/ozone/recon/api/StorageDistributionEndpoint.java
 
b/hadoop-ozone/recon/src/main/java/org/apache/hadoop/ozone/recon/api/StorageDistributionEndpoint.java
index b546d774b47..74584f843cb 100644
--- 
a/hadoop-ozone/recon/src/main/java/org/apache/hadoop/ozone/recon/api/StorageDistributionEndpoint.java
+++ 
b/hadoop-ozone/recon/src/main/java/org/apache/hadoop/ozone/recon/api/StorageDistributionEndpoint.java
@@ -46,7 +46,7 @@
 import org.apache.hadoop.ozone.recon.ReconContext;
 import org.apache.hadoop.ozone.recon.ReconUtils;
 import org.apache.hadoop.ozone.recon.api.types.DUResponse;
-import org.apache.hadoop.ozone.recon.api.types.DataNodeMetricsServiceResponse;
+import org.apache.hadoop.ozone.recon.api.types.DataNodeMetricsCompleteResponse;
 import org.apache.hadoop.ozone.recon.api.types.DatanodePendingDeletionMetrics;
 import org.apache.hadoop.ozone.recon.api.types.DatanodeStorageReport;
 import org.apache.hadoop.ozone.recon.api.types.GlobalNamespaceReport;
@@ -168,18 +168,26 @@ public Response getStorageDistribution() {
   @Path("/download")
   public Response downloadDataNodeStorageDistribution() {
 
-    DataNodeMetricsServiceResponse metricsResponse =
-        dataNodeMetricsService.getCollectedMetrics(null);
+    Object metricsResponse = dataNodeMetricsService.getCollectedMetrics(null);
 
-    if (metricsResponse.getStatus() != 
DataNodeMetricsService.MetricCollectionStatus.FINISHED) {
+    if (!(metricsResponse instanceof DataNodeMetricsCompleteResponse)) {
       return Response.status(Response.Status.ACCEPTED)
           .entity(metricsResponse)
           .type(MediaType.APPLICATION_JSON)
           .build();
     }
 
+    DataNodeMetricsCompleteResponse completeResponse =
+        (DataNodeMetricsCompleteResponse) metricsResponse;
+
+    if (completeResponse.getStatus() != 
DataNodeMetricsService.MetricCollectionStatus.FINISHED) {
+      return Response.status(Response.Status.ACCEPTED)
+          .entity(completeResponse)
+          .type(MediaType.APPLICATION_JSON)
+          .build();
+    }
     List<DatanodePendingDeletionMetrics> pendingDeletionMetrics =
-        metricsResponse.getPendingDeletionPerDataNode();
+        completeResponse.getPendingDeletionPerDataNode();
 
     if (pendingDeletionMetrics == null) {
       return Response.status(Response.Status.INTERNAL_SERVER_ERROR)
diff --git 
a/hadoop-ozone/recon/src/main/java/org/apache/hadoop/ozone/recon/api/types/DataNodeMetricsCompleteResponse.java
 
b/hadoop-ozone/recon/src/main/java/org/apache/hadoop/ozone/recon/api/types/DataNodeMetricsCompleteResponse.java
new file mode 100644
index 00000000000..3e9764ef478
--- /dev/null
+++ 
b/hadoop-ozone/recon/src/main/java/org/apache/hadoop/ozone/recon/api/types/DataNodeMetricsCompleteResponse.java
@@ -0,0 +1,79 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.hadoop.ozone.recon.api.types;
+
+import com.fasterxml.jackson.annotation.JsonCreator;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import java.util.List;
+import org.apache.hadoop.ozone.recon.api.DataNodeMetricsService;
+
+/**
+ * Response returned when metrics collection is complete.
+ * Includes the metric payload fields.
+ */
+public class DataNodeMetricsCompleteResponse {
+
+  @JsonProperty("status")
+  private final DataNodeMetricsService.MetricCollectionStatus status;
+
+  @JsonProperty("totalNodesQueried")
+  private final int totalNodesQueried;
+
+  @JsonProperty("totalNodeQueriesFailed")
+  private final long totalNodeQueryFailures;
+
+  @JsonProperty("totalPendingDeletionSize")
+  private final Long totalPendingDeletionSize;
+
+  @JsonProperty("pendingDeletionPerDataNode")
+  private final List<DatanodePendingDeletionMetrics> 
pendingDeletionPerDataNode;
+
+  @JsonCreator
+  public DataNodeMetricsCompleteResponse(
+      @JsonProperty("status") DataNodeMetricsService.MetricCollectionStatus 
status,
+      @JsonProperty("totalNodesQueried") int totalNodesQueried,
+      @JsonProperty("totalNodeQueriesFailed") long totalNodeQueriesFailed,
+      @JsonProperty("totalPendingDeletionSize") Long totalPendingDeletionSize,
+      @JsonProperty("pendingDeletionPerDataNode") 
List<DatanodePendingDeletionMetrics> pendingDeletionPerDataNode) {
+    this.status = status;
+    this.totalNodesQueried = totalNodesQueried;
+    this.totalNodeQueryFailures = totalNodeQueriesFailed;
+    this.totalPendingDeletionSize = totalPendingDeletionSize;
+    this.pendingDeletionPerDataNode = pendingDeletionPerDataNode;
+  }
+
+  public DataNodeMetricsService.MetricCollectionStatus getStatus() {
+    return status;
+  }
+
+  public int getTotalNodesQueried() {
+    return totalNodesQueried;
+  }
+
+  public long getTotalNodeQueryFailures() {
+    return totalNodeQueryFailures;
+  }
+
+  public Long getTotalPendingDeletionSize() {
+    return totalPendingDeletionSize;
+  }
+
+  public List<DatanodePendingDeletionMetrics> getPendingDeletionPerDataNode() {
+    return pendingDeletionPerDataNode;
+  }
+}
diff --git 
a/hadoop-ozone/recon/src/main/java/org/apache/hadoop/ozone/recon/api/types/DataNodeMetricsProgressResponse.java
 
b/hadoop-ozone/recon/src/main/java/org/apache/hadoop/ozone/recon/api/types/DataNodeMetricsProgressResponse.java
new file mode 100644
index 00000000000..7678a5a7fdf
--- /dev/null
+++ 
b/hadoop-ozone/recon/src/main/java/org/apache/hadoop/ozone/recon/api/types/DataNodeMetricsProgressResponse.java
@@ -0,0 +1,53 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.hadoop.ozone.recon.api.types;
+
+import com.fasterxml.jackson.annotation.JsonCreator;
+import com.fasterxml.jackson.annotation.JsonInclude;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import org.apache.hadoop.ozone.recon.api.DataNodeMetricsService;
+
+/**
+ * Response returned while metrics collection is still in progress.
+ * Intentionally omits metric payload fields.
+ */
+@JsonInclude(JsonInclude.Include.NON_NULL)
+public class DataNodeMetricsProgressResponse {
+
+  @JsonProperty("status")
+  private final DataNodeMetricsService.MetricCollectionStatus status;
+
+  @JsonProperty("message")
+  private final String message;
+
+  @JsonCreator
+  public DataNodeMetricsProgressResponse(
+      @JsonProperty("status") DataNodeMetricsService.MetricCollectionStatus 
status,
+      @JsonProperty("message") String message) {
+    this.status = status;
+    this.message = message;
+  }
+
+  public DataNodeMetricsService.MetricCollectionStatus getStatus() {
+    return status;
+  }
+
+  public String getMessage() {
+    return message;
+  }
+}
diff --git 
a/hadoop-ozone/recon/src/main/java/org/apache/hadoop/ozone/recon/api/types/DataNodeMetricsServiceResponse.java
 
b/hadoop-ozone/recon/src/main/java/org/apache/hadoop/ozone/recon/api/types/DataNodeMetricsServiceResponse.java
deleted file mode 100644
index bd1284d60ee..00000000000
--- 
a/hadoop-ozone/recon/src/main/java/org/apache/hadoop/ozone/recon/api/types/DataNodeMetricsServiceResponse.java
+++ /dev/null
@@ -1,130 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License. You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.apache.hadoop.ozone.recon.api.types;
-
-import com.fasterxml.jackson.annotation.JsonProperty;
-import java.util.List;
-import org.apache.hadoop.ozone.recon.api.DataNodeMetricsService;
-
-/**
- * Represents a response from the DataNodeMetricsService.
- * This class encapsulates the result of a metrics collection task,
- * including the collection status, total pending deletions across all data 
nodes,
- * and details about pending deletions for each data node.
- *
- * Instances of this class are created using the {@link Builder} class.
- */
-public class DataNodeMetricsServiceResponse {
-  @JsonProperty("status")
-  private DataNodeMetricsService.MetricCollectionStatus status;
-  @JsonProperty("totalPendingDeletionSize")
-  private Long totalPendingDeletionSize;
-  @JsonProperty("pendingDeletionPerDataNode")
-  private List<DatanodePendingDeletionMetrics> pendingDeletionPerDataNode;
-  @JsonProperty("totalNodesQueried")
-  private int totalNodesQueried;
-  @JsonProperty("totalNodeQueriesFailed")
-  private long totalNodeQueryFailures;
-
-  public DataNodeMetricsServiceResponse(Builder builder) {
-    this.status = builder.status;
-    this.totalPendingDeletionSize = builder.totalPendingDeletionSize;
-    this.pendingDeletionPerDataNode = builder.pendingDeletion;
-    this.totalNodesQueried = builder.totalNodesQueried;
-    this.totalNodeQueryFailures = builder.totalNodeQueryFailures;
-  }
-
-  public DataNodeMetricsServiceResponse() {
-    this.status = DataNodeMetricsService.MetricCollectionStatus.NOT_STARTED;
-    this.totalPendingDeletionSize = 0L;
-    this.pendingDeletionPerDataNode = null;
-    this.totalNodesQueried = 0;
-    this.totalNodeQueryFailures = 0;
-  }
-
-  public DataNodeMetricsService.MetricCollectionStatus getStatus() {
-    return status;
-  }
-
-  public Long getTotalPendingDeletionSize() {
-    return totalPendingDeletionSize;
-  }
-
-  public List<DatanodePendingDeletionMetrics> getPendingDeletionPerDataNode() {
-    return pendingDeletionPerDataNode;
-  }
-
-  public int getTotalNodesQueried() {
-    return totalNodesQueried;
-  }
-
-  public long getTotalNodeQueryFailures() {
-    return totalNodeQueryFailures;
-  }
-
-  public  static Builder newBuilder() {
-    return new Builder();
-  }
-
-  /**
-   * Builder class for constructing instances of {@link 
DataNodeMetricsServiceResponse}.
-   * This class provides a fluent interface for setting the various properties
-   * of a DataNodeMetricsServiceResponse object before creating a new 
immutable instance.
-   * The Builder is designed to be used in a staged and intuitive manner.
-   * The properties that can be configured include:
-   * - Status of the metric collection process.
-   * - Total number of blocks pending deletion across all data nodes.
-   * - Metrics related to pending deletions from individual data nodes.
-   */
-  public static final class Builder {
-    private DataNodeMetricsService.MetricCollectionStatus status;
-    private Long totalPendingDeletionSize;
-    private List<DatanodePendingDeletionMetrics> pendingDeletion;
-    private int totalNodesQueried;
-    private long totalNodeQueryFailures;
-
-    public Builder setStatus(DataNodeMetricsService.MetricCollectionStatus 
status) {
-      this.status = status;
-      return this;
-    }
-
-    public Builder setTotalPendingDeletionSize(Long totalPendingDeletionSize) {
-      this.totalPendingDeletionSize = totalPendingDeletionSize;
-      return this;
-    }
-
-    public Builder setPendingDeletion(List<DatanodePendingDeletionMetrics> 
pendingDeletion) {
-      this.pendingDeletion = pendingDeletion;
-      return this;
-    }
-
-    public Builder setTotalNodesQueried(int totalNodesQueried) {
-      this.totalNodesQueried = totalNodesQueried;
-      return this;
-    }
-
-    public Builder setTotalNodeQueryFailures(long totalNodeQueryFailures) {
-      this.totalNodeQueryFailures = totalNodeQueryFailures;
-      return this;
-    }
-
-    public DataNodeMetricsServiceResponse build() {
-      return new DataNodeMetricsServiceResponse(this);
-    }
-  }
-}
diff --git 
a/hadoop-ozone/recon/src/test/java/org/apache/hadoop/ozone/recon/api/TestPendingDeletionEndpoint.java
 
b/hadoop-ozone/recon/src/test/java/org/apache/hadoop/ozone/recon/api/TestPendingDeletionEndpoint.java
index 7951f9b2b3e..8a198775807 100644
--- 
a/hadoop-ozone/recon/src/test/java/org/apache/hadoop/ozone/recon/api/TestPendingDeletionEndpoint.java
+++ 
b/hadoop-ozone/recon/src/test/java/org/apache/hadoop/ozone/recon/api/TestPendingDeletionEndpoint.java
@@ -28,7 +28,8 @@
 import javax.ws.rs.core.Response;
 import org.apache.hadoop.hdds.protocol.proto.HddsProtos;
 import org.apache.hadoop.hdds.scm.protocol.StorageContainerLocationProtocol;
-import org.apache.hadoop.ozone.recon.api.types.DataNodeMetricsServiceResponse;
+import org.apache.hadoop.ozone.recon.api.types.DataNodeMetricsCompleteResponse;
+import org.apache.hadoop.ozone.recon.api.types.DataNodeMetricsProgressResponse;
 import org.apache.hadoop.ozone.recon.api.types.DatanodePendingDeletionMetrics;
 import org.apache.hadoop.ozone.recon.api.types.ScmPendingDeletion;
 import org.junit.jupiter.api.BeforeEach;
@@ -105,14 +106,12 @@ public void testDnComponentWithInvalidLimit() {
 
   @Test
   public void testDnComponentReturnsOkWhenFinished() {
-    DataNodeMetricsServiceResponse metricsResponse = 
DataNodeMetricsServiceResponse.newBuilder()
-        .setStatus(DataNodeMetricsService.MetricCollectionStatus.FINISHED)
-        .setTotalPendingDeletionSize(100L)
-        .setTotalNodesQueried(1)
-        .setTotalNodeQueryFailures(0)
-        .setPendingDeletion(Arrays.asList(
-            new DatanodePendingDeletionMetrics("dn1", "uuid-1", 100L)))
-        .build();
+    DataNodeMetricsCompleteResponse metricsResponse = new 
DataNodeMetricsCompleteResponse(
+        DataNodeMetricsService.MetricCollectionStatus.FINISHED,
+        1,
+        0,
+        100L,
+        Arrays.asList(new DatanodePendingDeletionMetrics("dn1", "uuid-1", 
100L)));
     
when(dataNodeMetricsService.getCollectedMetrics(5)).thenReturn(metricsResponse);
 
     Response response = 
pendingDeletionEndpoint.getPendingDeletionByComponent("DN", 5);
@@ -123,12 +122,12 @@ public void testDnComponentReturnsOkWhenFinished() {
 
   @Test
   public void testDnComponentAllowsNullLimit() {
-    DataNodeMetricsServiceResponse metricsResponse = 
DataNodeMetricsServiceResponse.newBuilder()
-        .setStatus(DataNodeMetricsService.MetricCollectionStatus.FINISHED)
-        .setTotalPendingDeletionSize(100L)
-        .setTotalNodesQueried(1)
-        .setTotalNodeQueryFailures(0)
-        .build();
+    DataNodeMetricsCompleteResponse metricsResponse = new 
DataNodeMetricsCompleteResponse(
+        DataNodeMetricsService.MetricCollectionStatus.FINISHED,
+        1,
+        0,
+        100L,
+        Arrays.asList(new DatanodePendingDeletionMetrics("dn1", "uuid-1", 
100L)));
     
when(dataNodeMetricsService.getCollectedMetrics(null)).thenReturn(metricsResponse);
 
     Response response = 
pendingDeletionEndpoint.getPendingDeletionByComponent("dn", null);
@@ -139,9 +138,9 @@ public void testDnComponentAllowsNullLimit() {
 
   @Test
   public void testDnComponentReturnsAcceptedWhenInProgress() {
-    DataNodeMetricsServiceResponse metricsResponse = 
DataNodeMetricsServiceResponse.newBuilder()
-        .setStatus(DataNodeMetricsService.MetricCollectionStatus.IN_PROGRESS)
-        .build();
+    DataNodeMetricsProgressResponse metricsResponse = new 
DataNodeMetricsProgressResponse(
+        DataNodeMetricsService.MetricCollectionStatus.IN_PROGRESS,
+        "Metrics collection task is currently running. Please wait for task to 
finish.");
     
when(dataNodeMetricsService.getCollectedMetrics(2)).thenReturn(metricsResponse);
 
     Response response = 
pendingDeletionEndpoint.getPendingDeletionByComponent("dn", 2);
diff --git 
a/hadoop-ozone/recon/src/test/java/org/apache/hadoop/ozone/recon/api/TestStorageDistributionEndpoint.java
 
b/hadoop-ozone/recon/src/test/java/org/apache/hadoop/ozone/recon/api/TestStorageDistributionEndpoint.java
index fc96c60677f..6bbc448472c 100644
--- 
a/hadoop-ozone/recon/src/test/java/org/apache/hadoop/ozone/recon/api/TestStorageDistributionEndpoint.java
+++ 
b/hadoop-ozone/recon/src/test/java/org/apache/hadoop/ozone/recon/api/TestStorageDistributionEndpoint.java
@@ -44,7 +44,8 @@
 import org.apache.hadoop.hdds.scm.server.OzoneStorageContainerManager;
 import org.apache.hadoop.ozone.recon.ReconContext;
 import org.apache.hadoop.ozone.recon.api.types.DUResponse;
-import org.apache.hadoop.ozone.recon.api.types.DataNodeMetricsServiceResponse;
+import org.apache.hadoop.ozone.recon.api.types.DataNodeMetricsCompleteResponse;
+import org.apache.hadoop.ozone.recon.api.types.DataNodeMetricsProgressResponse;
 import org.apache.hadoop.ozone.recon.api.types.DatanodePendingDeletionMetrics;
 import org.apache.hadoop.ozone.recon.api.types.DatanodeStorageReport;
 import 
org.apache.hadoop.ozone.recon.api.types.StorageCapacityDistributionResponse;
@@ -159,9 +160,9 @@ public void testStorageDistributionApiReturnsSuccess() 
throws Exception {
 
   @Test
   public void testDownloadReturnsAcceptedWhenCollectionInProgress() {
-    DataNodeMetricsServiceResponse metricsResponse = 
DataNodeMetricsServiceResponse.newBuilder()
-        .setStatus(DataNodeMetricsService.MetricCollectionStatus.IN_PROGRESS)
-        .build();
+    DataNodeMetricsProgressResponse metricsResponse = new 
DataNodeMetricsProgressResponse(
+        DataNodeMetricsService.MetricCollectionStatus.IN_PROGRESS,
+        "Metrics collection task is currently running. Please wait for task to 
finish.");
     
when(dataNodeMetricsService.getCollectedMetrics(null)).thenReturn(metricsResponse);
     Response response = 
storageDistributionEndpoint.downloadDataNodeStorageDistribution();
 
@@ -172,9 +173,12 @@ public void 
testDownloadReturnsAcceptedWhenCollectionInProgress() {
 
   @Test
   public void testDownloadReturnsServerErrorWhenMetricsMissing() {
-    DataNodeMetricsServiceResponse metricsResponse = 
DataNodeMetricsServiceResponse.newBuilder()
-        .setStatus(DataNodeMetricsService.MetricCollectionStatus.FINISHED)
-        .build();
+    DataNodeMetricsCompleteResponse metricsResponse = new 
DataNodeMetricsCompleteResponse(
+        DataNodeMetricsService.MetricCollectionStatus.FINISHED,
+        0,
+        0,
+        0L,
+        null);
     
when(dataNodeMetricsService.getCollectedMetrics(null)).thenReturn(metricsResponse);
     Response response = 
storageDistributionEndpoint.downloadDataNodeStorageDistribution();
 
@@ -275,11 +279,13 @@ private List<String> mockStorageDistributionData(int 
numNodes) throws Exception
     when(reconGlobalStatsManager.getGlobalStatsValue(anyString()))
         .thenReturn(new GlobalStatsValue(GLOBAL_STAT_KEY_COUNT));
 
-    DataNodeMetricsServiceResponse metricsResponse =
-        DataNodeMetricsServiceResponse.newBuilder()
-            .setStatus(DataNodeMetricsService.MetricCollectionStatus.FINISHED)
-            .setPendingDeletion(pendingDeletionMetrics)
-            .build();
+    DataNodeMetricsCompleteResponse metricsResponse =
+        new DataNodeMetricsCompleteResponse(
+            DataNodeMetricsService.MetricCollectionStatus.FINISHED,
+            0,
+            0,
+            null,
+            pendingDeletionMetrics);
     when(dataNodeMetricsService.getCollectedMetrics(null))
         .thenReturn(metricsResponse);
     return csvRows;


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

Reply via email to