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

arafat2198 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 4f29762efc2 HDDS-14555. [Recon] Clarify Open Key Bytes breakdown in 
Cluster Capacity page (#9705).
4f29762efc2 is described below

commit 4f29762efc2848507b074908e0b2b59ff7bbec94
Author: Priyesh Karatha <[email protected]>
AuthorDate: Fri Feb 27 13:48:40 2026 +0530

    HDDS-14555. [Recon] Clarify Open Key Bytes breakdown in Cluster Capacity 
page (#9705).
---
 .../recon/TestStorageDistributionEndpoint.java     | 41 +++++++++++++++-
 .../recon/api/StorageDistributionEndpoint.java     | 32 +++++++------
 .../ozone/recon/api/types/OpenKeyBytesInfo.java    | 56 ++++++++++++++++++++++
 .../ozone/recon/api/types/UsedSpaceBreakDown.java  |  6 +--
 .../webapps/recon/ozone-recon-web/api/db.json      |  6 ++-
 .../mocks/capacityMocks/capacityResponseMocks.ts   |  6 ++-
 .../src/v2/constants/capacity.constants.tsx        |  6 ++-
 .../src/v2/pages/capacity/capacity.less            | 11 +++++
 .../src/v2/pages/capacity/capacity.tsx             | 26 ++++++++--
 .../ozone-recon-web/src/v2/types/capacity.types.ts |  8 +++-
 .../src/views/datanodes/datanodes.less             |  2 +-
 .../recon/api/TestStorageDistributionEndpoint.java |  6 ++-
 12 files changed, 178 insertions(+), 28 deletions(-)

diff --git 
a/hadoop-ozone/integration-test-recon/src/test/java/org/apache/hadoop/ozone/recon/TestStorageDistributionEndpoint.java
 
b/hadoop-ozone/integration-test-recon/src/test/java/org/apache/hadoop/ozone/recon/TestStorageDistributionEndpoint.java
index a7e880a79f7..2a3ca2bb91a 100644
--- 
a/hadoop-ozone/integration-test-recon/src/test/java/org/apache/hadoop/ozone/recon/TestStorageDistributionEndpoint.java
+++ 
b/hadoop-ozone/integration-test-recon/src/test/java/org/apache/hadoop/ozone/recon/TestStorageDistributionEndpoint.java
@@ -35,7 +35,9 @@
 
 import com.fasterxml.jackson.databind.ObjectMapper;
 import java.time.Duration;
+import java.util.ArrayList;
 import java.util.Collections;
+import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 import java.util.Objects;
@@ -63,6 +65,7 @@
 import org.apache.hadoop.ozone.client.OzoneBucket;
 import org.apache.hadoop.ozone.client.OzoneClient;
 import org.apache.hadoop.ozone.client.OzoneVolume;
+import org.apache.hadoop.ozone.client.io.OzoneOutputStream;
 import org.apache.hadoop.ozone.container.common.impl.ContainerSet;
 import org.apache.hadoop.ozone.container.common.interfaces.DBHandle;
 import 
org.apache.hadoop.ozone.container.common.statemachine.DatanodeConfiguration;
@@ -73,6 +76,8 @@
 import org.apache.hadoop.ozone.om.helpers.OmKeyArgs;
 import org.apache.hadoop.ozone.om.helpers.OmKeyLocationInfo;
 import org.apache.hadoop.ozone.om.helpers.OmKeyLocationInfoGroup;
+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.DatanodeStorageReport;
@@ -167,6 +172,8 @@ public void 
testStorageDistributionEndpoint(ReplicationConfig replicationConfig)
     volume.createBucket("bucket1", bucketArgs);
     OzoneBucket bucket = volume.getBucket("bucket1");
 
+    createOpenKeysAndMultipartKeys(volume.getName(), bucket.getName(), 
replicationConfig);
+
     String rootPath = String.format("%s://%s.%s/", 
OzoneConsts.OZONE_URI_SCHEME, bucket.getName(),
         bucket.getVolumeName());
 
@@ -204,6 +211,34 @@ public void 
testStorageDistributionEndpoint(ReplicationConfig replicationConfig)
     
GenericTestUtils.waitFor(this::verifyPendingDeletionAfterKeyDeletionOnDnFailure,
 2000, 60000);
   }
 
+  private void createOpenKeysAndMultipartKeys(String volumeName,
+      String bucketName, ReplicationConfig config) throws Exception {
+    ObjectStore objectStore = client.getObjectStore();
+    OzoneManagerProtocol ozoneManagerClient =
+        client.getObjectStore().getClientProxy().getOzoneManagerClient();
+
+    OmKeyArgs openKey = new OmKeyArgs.Builder()
+        .setVolumeName(volumeName)
+        .setBucketName(bucketName)
+        .setKeyName("openkey1")
+        .setReplicationConfig(config)
+        .setDataSize(10)// this sets unreplicated size; replicated = 10 * 3 = 
30
+        .setAcls(new ArrayList<>())
+        .setOwnerName("ownerName")
+        .build();
+    ozoneManagerClient.openKey(openKey);
+    //Create a Multipart open key
+    OmMultipartInfo multipartInfo = objectStore.getClientProxy()
+        .initiateMultipartUpload(volumeName, bucketName, "mpukey1",
+            config, new HashMap<>());
+
+    OzoneOutputStream partStream = objectStore.getClientProxy()
+        .createMultipartKey(volumeName, bucketName, "mpukey1",
+            10L, 1, multipartInfo.getUploadID());
+    partStream.write(new byte[10]);
+    partStream.close();
+  }
+
   private boolean verifyStorageDistributionAfterKeyCreation() {
     try {
       StringBuilder urlBuilder = new StringBuilder();
@@ -213,8 +248,10 @@ private boolean 
verifyStorageDistributionAfterKeyCreation() {
           MAPPER.readValue(response, 
StorageCapacityDistributionResponse.class);
 
       assertEquals(20, storageResponse.getGlobalNamespace().getTotalKeys());
-      assertEquals(60, 
storageResponse.getGlobalNamespace().getTotalUsedSpace());
-      assertEquals(0, 
storageResponse.getUsedSpaceBreakDown().getOpenKeyBytes());
+      assertEquals(120, 
storageResponse.getGlobalNamespace().getTotalUsedSpace());
+      assertEquals(60, 
storageResponse.getUsedSpaceBreakDown().getOpenKeyBytes().getTotalOpenKeyBytes());
+      assertEquals(30, 
storageResponse.getUsedSpaceBreakDown().getOpenKeyBytes().getMultipartOpenKeyBytes());
+      assertEquals(30, 
storageResponse.getUsedSpaceBreakDown().getOpenKeyBytes().getOpenKeyAndFileBytes());
       assertEquals(60, 
storageResponse.getUsedSpaceBreakDown().getCommittedKeyBytes());
       assertEquals(3, storageResponse.getDataNodeUsage().size());
       List<DatanodeStorageReport> reports = storageResponse.getDataNodeUsage();
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 1365c31f2df..2cfc64dd68a 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,6 +46,7 @@
 import org.apache.hadoop.ozone.recon.api.types.DatanodeStorageReport;
 import org.apache.hadoop.ozone.recon.api.types.GlobalNamespaceReport;
 import org.apache.hadoop.ozone.recon.api.types.GlobalStorageReport;
+import org.apache.hadoop.ozone.recon.api.types.OpenKeyBytesInfo;
 import 
org.apache.hadoop.ozone.recon.api.types.StorageCapacityDistributionResponse;
 import org.apache.hadoop.ozone.recon.api.types.UsedSpaceBreakDown;
 import org.apache.hadoop.ozone.recon.scm.ReconNodeManager;
@@ -97,15 +98,21 @@ public Response getStorageDistribution() {
     try {
       List<DatanodeStorageReport> nodeStorageReports = 
collectDatanodeReports();
       GlobalStorageReport globalStorageReport = calculateGlobalStorageReport();
+      OpenKeyBytesInfo totalOpenKeySize;
+      try {
+        totalOpenKeySize = calculateOpenKeySizes();
+      } catch (Exception e) {
+        LOG.error("Error calculating open key sizes", e);
+        totalOpenKeySize = new OpenKeyBytesInfo(0L, 0L);
+      }
 
       Map<String, Long> namespaceMetrics = new HashMap<>();
       try {
-        namespaceMetrics = calculateNamespaceMetrics();
+        namespaceMetrics = calculateNamespaceMetrics(totalOpenKeySize);
       } catch (Exception e) {
         LOG.error("Error calculating namespace metrics", e);
         // Initialize with default values
         namespaceMetrics.put("totalUsedNamespace", 0L);
-        namespaceMetrics.put("totalOpenKeySize", 0L);
         namespaceMetrics.put("totalCommittedSize", 0L);
         namespaceMetrics.put("pendingDirectorySize", 0L);
         namespaceMetrics.put("pendingKeySize", 0L);
@@ -113,7 +120,7 @@ public Response getStorageDistribution() {
       }
 
       StorageCapacityDistributionResponse response = 
buildStorageDistributionResponse(
-              nodeStorageReports, globalStorageReport, namespaceMetrics);
+              nodeStorageReports, globalStorageReport, namespaceMetrics, 
totalOpenKeySize);
       return Response.ok(response).build();
     } catch (Exception e) {
       LOG.error("Error getting storage distribution", e);
@@ -233,14 +240,14 @@ private GlobalStorageReport 
calculateGlobalStorageReport() {
     }
   }
 
-  private Map<String, Long> calculateNamespaceMetrics() throws IOException {
+  private Map<String, Long> calculateNamespaceMetrics(OpenKeyBytesInfo 
totalOpenKeySize) throws IOException {
     Map<String, Long> metrics = new HashMap<>();
     Map<String, Long> totalPendingAtOmSide = 
reconGlobalMetricsService.calculatePendingSizes();
-    long totalOpenKeySize = calculateOpenKeySizes();
     long totalCommittedSize = calculateCommittedSize();
     long pendingDirectorySize = 
totalPendingAtOmSide.getOrDefault("pendingDirectorySize", 0L);
     long pendingKeySize = totalPendingAtOmSide.getOrDefault("pendingKeySize", 
0L);
-    long totalUsedNamespace = pendingDirectorySize + pendingKeySize + 
totalOpenKeySize + totalCommittedSize;
+    long totalUsedNamespace = pendingDirectorySize + pendingKeySize +
+        totalOpenKeySize.getTotalOpenKeyBytes() + totalCommittedSize;
 
     long totalKeys = 0L;
     // Keys from OBJECT_STORE buckets.
@@ -255,8 +262,6 @@ private Map<String, Long> calculateNamespaceMetrics() 
throws IOException {
     if (fileRecord != null) {
       totalKeys += fileRecord.getValue();
     }
-
-    metrics.put("totalOpenKeySize", totalOpenKeySize);
     metrics.put("totalCommittedSize", totalCommittedSize);
     metrics.put("totalUsedNamespace", totalUsedNamespace);
     metrics.put("totalKeys", totalKeys);
@@ -266,11 +271,11 @@ private Map<String, Long> calculateNamespaceMetrics() 
throws IOException {
   private StorageCapacityDistributionResponse buildStorageDistributionResponse(
           List<DatanodeStorageReport> nodeStorageReports,
           GlobalStorageReport storageMetrics,
-          Map<String, Long> namespaceMetrics) {
+          Map<String, Long> namespaceMetrics,
+          OpenKeyBytesInfo totalOpenKeySize) {
 
     // Safely get values from namespaceMetrics with null checks
     Long totalUsedNamespace = namespaceMetrics.get("totalUsedNamespace");
-    Long totalOpenKeySize = namespaceMetrics.get("totalOpenKeySize");
     Long totalCommittedSize = namespaceMetrics.get("totalCommittedSize");
     Long totalKeys = namespaceMetrics.get("totalKeys");
     Long totalContainerPreAllocated = nodeStorageReports.stream()
@@ -284,8 +289,7 @@ private StorageCapacityDistributionResponse 
buildStorageDistributionResponse(
                     totalUsedNamespace != null ? totalUsedNamespace : 0L,
                     totalKeys != null ? totalKeys : 0L))
             .setUsedSpaceBreakDown(new UsedSpaceBreakDown(
-                    totalOpenKeySize != null ? totalOpenKeySize : 0L,
-                    totalCommittedSize != null ? totalCommittedSize : 0L, 
totalContainerPreAllocated))
+                    totalOpenKeySize, totalCommittedSize != null ? 
totalCommittedSize : 0L, totalContainerPreAllocated))
             .build();
   }
 
@@ -296,12 +300,12 @@ public List<DatanodeStorageReport> 
collectDatanodeReports() {
         .collect(Collectors.toList());
   }
 
-  private long calculateOpenKeySizes() {
+  private OpenKeyBytesInfo calculateOpenKeySizes() {
     Map<String, Long> openKeySummary = 
reconGlobalMetricsService.getOpenKeySummary();
     Map<String, Long> openKeyMPUSummary = 
reconGlobalMetricsService.getMPUKeySummary();
     long openKeyDataSize = 
openKeySummary.getOrDefault("totalReplicatedDataSize", 0L);
     long totalMPUKeySize = 
openKeyMPUSummary.getOrDefault("totalReplicatedDataSize", 0L);
-    return openKeyDataSize + totalMPUKeySize;
+    return new OpenKeyBytesInfo(openKeyDataSize, totalMPUKeySize);
   }
 
   private long calculateCommittedSize() {
diff --git 
a/hadoop-ozone/recon/src/main/java/org/apache/hadoop/ozone/recon/api/types/OpenKeyBytesInfo.java
 
b/hadoop-ozone/recon/src/main/java/org/apache/hadoop/ozone/recon/api/types/OpenKeyBytesInfo.java
new file mode 100644
index 00000000000..bea90da4fea
--- /dev/null
+++ 
b/hadoop-ozone/recon/src/main/java/org/apache/hadoop/ozone/recon/api/types/OpenKeyBytesInfo.java
@@ -0,0 +1,56 @@
+/*
+ * 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;
+
+/**
+ * Represents information about the open keys in a storage system.
+ * This class provides details regarding different types of open key bytes
+ * and calculates the total size of open key bytes.
+ */
+public class OpenKeyBytesInfo {
+
+  @JsonProperty("openKeyAndFileBytes")
+  private long openKeyAndFileBytes;
+
+  @JsonProperty("multipartOpenKeyBytes")
+  private long multipartOpenKeyBytes;
+
+  @JsonProperty("totalOpenKeyBytes")
+  private long totalOpenKeyBytes;
+
+  public OpenKeyBytesInfo() { }
+
+  public OpenKeyBytesInfo(long openKeyAndFileBytes, long 
multipartOpenKeyBytes) {
+    this.openKeyAndFileBytes = openKeyAndFileBytes;
+    this.multipartOpenKeyBytes = multipartOpenKeyBytes;
+  }
+
+  public long getTotalOpenKeyBytes() {
+    return openKeyAndFileBytes + multipartOpenKeyBytes;
+  }
+
+  public long getOpenKeyAndFileBytes() {
+    return openKeyAndFileBytes;
+  }
+
+  public long getMultipartOpenKeyBytes() {
+    return multipartOpenKeyBytes;
+  }
+}
diff --git 
a/hadoop-ozone/recon/src/main/java/org/apache/hadoop/ozone/recon/api/types/UsedSpaceBreakDown.java
 
b/hadoop-ozone/recon/src/main/java/org/apache/hadoop/ozone/recon/api/types/UsedSpaceBreakDown.java
index 8d82d89058a..c7c6d2aa7f8 100644
--- 
a/hadoop-ozone/recon/src/main/java/org/apache/hadoop/ozone/recon/api/types/UsedSpaceBreakDown.java
+++ 
b/hadoop-ozone/recon/src/main/java/org/apache/hadoop/ozone/recon/api/types/UsedSpaceBreakDown.java
@@ -45,7 +45,7 @@
 public class UsedSpaceBreakDown {
 
   @JsonProperty("openKeyBytes")
-  private long openKeyBytes;
+  private OpenKeyBytesInfo openKeyBytes;
 
   @JsonProperty("committedKeyBytes")
   private long committedKeyBytes;
@@ -56,13 +56,13 @@ public class UsedSpaceBreakDown {
   public UsedSpaceBreakDown() {
   }
 
-  public UsedSpaceBreakDown(long openKeyBytes, long committedKeyBytes, long 
preAllocatedContainerBytes) {
+  public UsedSpaceBreakDown(OpenKeyBytesInfo openKeyBytes, long 
committedKeyBytes, long preAllocatedContainerBytes) {
     this.openKeyBytes = openKeyBytes;
     this.committedKeyBytes = committedKeyBytes;
     this.preAllocatedContainerBytes = preAllocatedContainerBytes;
   }
 
-  public long getOpenKeyBytes() {
+  public OpenKeyBytesInfo getOpenKeyBytes() {
     return openKeyBytes;
   }
 
diff --git 
a/hadoop-ozone/recon/src/main/resources/webapps/recon/ozone-recon-web/api/db.json
 
b/hadoop-ozone/recon/src/main/resources/webapps/recon/ozone-recon-web/api/db.json
index 37663e3704e..7b1bf48bf32 100644
--- 
a/hadoop-ozone/recon/src/main/resources/webapps/recon/ozone-recon-web/api/db.json
+++ 
b/hadoop-ozone/recon/src/main/resources/webapps/recon/ozone-recon-web/api/db.json
@@ -6878,7 +6878,11 @@
         "totalKeys": 1576
     },
     "usedSpaceBreakdown": {
-        "openKeyBytes": 19255266,
+        "openKeyBytes": {
+          "totalOpenKeyBytes": 19255266,
+          "openKeyAndFileBytes": 19255266,
+          "multipartOpenKeyBytes": 0
+        },
         "committedKeyBytes": 1249923,
         "preAllocatedContainerBytes": 1022024
     },
diff --git 
a/hadoop-ozone/recon/src/main/resources/webapps/recon/ozone-recon-web/src/__tests__/mocks/capacityMocks/capacityResponseMocks.ts
 
b/hadoop-ozone/recon/src/main/resources/webapps/recon/ozone-recon-web/src/__tests__/mocks/capacityMocks/capacityResponseMocks.ts
index 970521e962d..2459fdbd69e 100644
--- 
a/hadoop-ozone/recon/src/main/resources/webapps/recon/ozone-recon-web/src/__tests__/mocks/capacityMocks/capacityResponseMocks.ts
+++ 
b/hadoop-ozone/recon/src/main/resources/webapps/recon/ozone-recon-web/src/__tests__/mocks/capacityMocks/capacityResponseMocks.ts
@@ -27,7 +27,11 @@ export const StorageDistribution = {
     totalKeys: 12
   },
   usedSpaceBreakdown: {
-    openKeyBytes: 1024,
+    openKeyBytes: {
+      totalOpenKeyBytes: 1024,
+      openKeyAndFileBytes: 512,
+      multipartOpenKeyBytes: 512
+    },
     committedKeyBytes: 2048,
     preAllocatedContainerBytes: 1024
   },
diff --git 
a/hadoop-ozone/recon/src/main/resources/webapps/recon/ozone-recon-web/src/v2/constants/capacity.constants.tsx
 
b/hadoop-ozone/recon/src/main/resources/webapps/recon/ozone-recon-web/src/v2/constants/capacity.constants.tsx
index 1699d7ffeb4..3f51c0879c5 100644
--- 
a/hadoop-ozone/recon/src/main/resources/webapps/recon/ozone-recon-web/src/v2/constants/capacity.constants.tsx
+++ 
b/hadoop-ozone/recon/src/main/resources/webapps/recon/ozone-recon-web/src/v2/constants/capacity.constants.tsx
@@ -29,7 +29,11 @@ export const DEFAULT_CAPACITY_UTILIZATION: 
UtilizationResponse = {
     totalKeys: 0
   },
   usedSpaceBreakdown: {
-    openKeyBytes: 0,
+    openKeyBytes: {
+      totalOpenKeyBytes : 0,
+      openKeyAndFileBytes: 0,
+      multipartOpenKeyBytes: 0
+    },
     committedKeyBytes: 0,
     preAllocatedContainerBytes: 0
   },
diff --git 
a/hadoop-ozone/recon/src/main/resources/webapps/recon/ozone-recon-web/src/v2/pages/capacity/capacity.less
 
b/hadoop-ozone/recon/src/main/resources/webapps/recon/ozone-recon-web/src/v2/pages/capacity/capacity.less
index 0ab18485dec..abe26f953f0 100644
--- 
a/hadoop-ozone/recon/src/main/resources/webapps/recon/ozone-recon-web/src/v2/pages/capacity/capacity.less
+++ 
b/hadoop-ozone/recon/src/main/resources/webapps/recon/ozone-recon-web/src/v2/pages/capacity/capacity.less
@@ -68,6 +68,17 @@
   }
 }
 
+.openkeys-space-breakdown {
+  display: grid;
+  grid-template-columns: 150px auto;
+  grid-column-gap: 20px;
+  grid-row-gap: 4px;
+
+  .ant-tag {
+    text-align: center;
+  }
+}
+
 .dn-select-option-uuid {
   font-size: 14px;
   color: #5a656d;
diff --git 
a/hadoop-ozone/recon/src/main/resources/webapps/recon/ozone-recon-web/src/v2/pages/capacity/capacity.tsx
 
b/hadoop-ozone/recon/src/main/resources/webapps/recon/ozone-recon-web/src/v2/pages/capacity/capacity.tsx
index 8a132de138c..d9b5f093eac 100644
--- 
a/hadoop-ozone/recon/src/main/resources/webapps/recon/ozone-recon-web/src/v2/pages/capacity/capacity.tsx
+++ 
b/hadoop-ozone/recon/src/main/resources/webapps/recon/ozone-recon-web/src/v2/pages/capacity/capacity.tsx
@@ -229,7 +229,7 @@ const Capacity: React.FC<object> = () => {
       </>
     }>
       <CheckCircleFilled style={{ color: '#1ea57a', marginRight: 8, fontSize: 
14 }} />
-        Datanodes  
+        Datanodes
     </Popover>
   );
 
@@ -259,6 +259,26 @@ const Capacity: React.FC<object> = () => {
     </span>
   );
 
+  const openKeyUsageBreakdown = (
+    <span>
+      OPEN KEYS
+      <Popover
+        title="Open Key Breakdown"
+        placement='topLeft'
+        content={
+          <div className='openkeys-space-breakdown'>
+            Open Key/File Bytes
+            <Tag 
color='blue'>{filesize(storageDistribution.data.usedSpaceBreakdown.openKeyBytes?.openKeyAndFileBytes
 ?? 0, {round: 1})}</Tag>
+            Multipart Key Bytes
+            <Tag 
color='orange'>{filesize(storageDistribution.data.usedSpaceBreakdown.openKeyBytes?.multipartOpenKeyBytes
 ?? 0, {round: 1})}</Tag>
+          </div>
+        }
+      >
+        <InfoCircleOutlined style={{ color: '#2f84d8', fontSize: 12, 
marginLeft: 4 }} />
+      </Popover>
+    </span>
+  );
+
   return (
     <>
       <div className='page-header-v2'>
@@ -322,8 +342,8 @@ const Capacity: React.FC<object> = () => {
             title: 'TOTAL',
             value: storageDistribution.data.globalStorage.totalUsedSpace
           }, {
-            title: 'OPEN KEYS',
-            value: storageDistribution.data.usedSpaceBreakdown.openKeyBytes,
+            title: openKeyUsageBreakdown,
+            value: 
storageDistribution.data.usedSpaceBreakdown.openKeyBytes?.totalOpenKeyBytes ?? 
0,
             color: '#f47c2d'
           }, {
             title: 'COMMITTED KEYS',
diff --git 
a/hadoop-ozone/recon/src/main/resources/webapps/recon/ozone-recon-web/src/v2/types/capacity.types.ts
 
b/hadoop-ozone/recon/src/main/resources/webapps/recon/ozone-recon-web/src/v2/types/capacity.types.ts
index 5257c17b819..b399b36e8b8 100644
--- 
a/hadoop-ozone/recon/src/main/resources/webapps/recon/ozone-recon-web/src/v2/types/capacity.types.ts
+++ 
b/hadoop-ozone/recon/src/main/resources/webapps/recon/ozone-recon-web/src/v2/types/capacity.types.ts
@@ -28,11 +28,17 @@ type GlobalNamespace = {
 };
 
 type UsedSpaceBreakdown = {
-  openKeyBytes: number;
+  openKeyBytes: OpenKeyBytesInfo;
   committedKeyBytes: number;
   preAllocatedContainerBytes: number;
 };
 
+type OpenKeyBytesInfo = {
+  totalOpenKeyBytes: number;
+  openKeyAndFileBytes: number;
+  multipartOpenKeyBytes: number;
+};
+
 type DNPendingDeleteStat = {
   hostName: string;
   datanodeUuid: string;
diff --git 
a/hadoop-ozone/recon/src/main/resources/webapps/recon/ozone-recon-web/src/views/datanodes/datanodes.less
 
b/hadoop-ozone/recon/src/main/resources/webapps/recon/ozone-recon-web/src/views/datanodes/datanodes.less
index fe5d35e2350..b61435f8261 100644
--- 
a/hadoop-ozone/recon/src/main/resources/webapps/recon/ozone-recon-web/src/views/datanodes/datanodes.less
+++ 
b/hadoop-ozone/recon/src/main/resources/webapps/recon/ozone-recon-web/src/views/datanodes/datanodes.less
@@ -39,6 +39,6 @@
   }
 }
 
-.ant-popover-inner{
+.datanodes-container .ant-popover-inner {
   margin-left: 500px;
 }
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 6062ee8a1a5..d6a1ab80581 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
@@ -131,8 +131,12 @@ public void testStorageDistributionApiReturnsSuccess() 
throws Exception {
     assertEquals(OZONE_CAPACITY * 3, 
distributionResponse.getGlobalStorage().getTotalCapacity());
     assertEquals(totalNameSpace, 
distributionResponse.getGlobalNamespace().getTotalUsedSpace());
     assertEquals(EXPECTED_GLOBAL_TOTAL_KEYS, 
distributionResponse.getGlobalNamespace().getTotalKeys());
+    assertEquals(OPEN_KEY_BYTES,
+        
distributionResponse.getUsedSpaceBreakDown().getOpenKeyBytes().getOpenKeyAndFileBytes());
+    assertEquals(OPEN_MPU_KEY_BYTES,
+        
distributionResponse.getUsedSpaceBreakDown().getOpenKeyBytes().getMultipartOpenKeyBytes());
     assertEquals(OPEN_KEY_BYTES + OPEN_MPU_KEY_BYTES,
-        distributionResponse.getUsedSpaceBreakDown().getOpenKeyBytes());
+        
distributionResponse.getUsedSpaceBreakDown().getOpenKeyBytes().getTotalOpenKeyBytes());
     assertEquals(EXPECTED_COMMITTED_KEY_BYTES,
         distributionResponse.getUsedSpaceBreakDown().getCommittedKeyBytes());
     assertEquals(COMMITTED * 3,


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

Reply via email to