diff --git a/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/node/NodeStateManager.java b/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/node/NodeStateManager.java index 4543a49b41c5..3307a292dca2 100644 --- a/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/node/NodeStateManager.java +++ b/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/node/NodeStateManager.java @@ -682,6 +682,11 @@ public Set getContainers(UUID uuid) return nodeStateMap.getContainers(uuid); } + public int getContainerCount(UUID uuid) + throws NodeNotFoundException { + return nodeStateMap.getContainerCount(uuid); + } + /** * Move Stale or Dead node to healthy if we got a heartbeat from them. * Move healthy nodes to stale nodes if it is needed. diff --git a/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/node/SCMNodeManager.java b/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/node/SCMNodeManager.java index 3790214f5268..818e1826328b 100644 --- a/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/node/SCMNodeManager.java +++ b/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/node/SCMNodeManager.java @@ -980,8 +980,7 @@ public DatanodeUsageInfo getUsageInfo(DatanodeDetails dn) { SCMNodeStat stat = getNodeStatInternal(dn); DatanodeUsageInfo usageInfo = new DatanodeUsageInfo(dn, stat); try { - int containerCount = getContainers(dn).size(); - usageInfo.setContainerCount(containerCount); + usageInfo.setContainerCount(getContainerCount(dn)); } catch (NodeNotFoundException ex) { LOG.error("Unknown datanode {}.", dn, ex); } @@ -1458,6 +1457,11 @@ public Set getContainers(DatanodeDetails datanodeDetails) return nodeStateManager.getContainers(datanodeDetails.getUuid()); } + public int getContainerCount(DatanodeDetails datanodeDetails) + throws NodeNotFoundException { + return nodeStateManager.getContainerCount(datanodeDetails.getUuid()); + } + @Override public void addDatanodeCommand(UUID dnId, SCMCommand command) { writeLock().lock(); diff --git a/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/node/states/NodeStateMap.java b/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/node/states/NodeStateMap.java index e8843fa21e6d..1dcdc17c908d 100644 --- a/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/node/states/NodeStateMap.java +++ b/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/node/states/NodeStateMap.java @@ -378,6 +378,16 @@ public Set getContainers(UUID uuid) } } + public int getContainerCount(UUID uuid) throws NodeNotFoundException { + lock.readLock().lock(); + try { + checkIfNodeExist(uuid); + return nodeToContainer.get(uuid).size(); + } finally { + lock.readLock().unlock(); + } + } + public void removeContainer(UUID uuid, ContainerID containerID) throws NodeNotFoundException { lock.writeLock().lock(); diff --git a/hadoop-ozone/recon/src/main/java/org/apache/hadoop/ozone/recon/api/NodeEndpoint.java b/hadoop-ozone/recon/src/main/java/org/apache/hadoop/ozone/recon/api/NodeEndpoint.java index a0bcfd302554..478b92fa81d1 100644 --- a/hadoop-ozone/recon/src/main/java/org/apache/hadoop/ozone/recon/api/NodeEndpoint.java +++ b/hadoop-ozone/recon/src/main/java/org/apache/hadoop/ozone/recon/api/NodeEndpoint.java @@ -152,9 +152,7 @@ public Response getDatanodes() { } }); try { - Set allContainers = nodeManager.getContainers(datanode); - - builder.withContainers(allContainers.size()); + builder.withContainers(nodeManager.getContainerCount(datanode)); builder.withOpenContainers(openContainers.get()); } catch (NodeNotFoundException ex) { LOG.warn("Cannot get containers, datanode {} not found.",