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]