diff --git a/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/pipeline/PipelineManagerImpl.java b/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/pipeline/PipelineManagerImpl.java index d943dc21e2a3..4d7afae6c25b 100644 --- a/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/pipeline/PipelineManagerImpl.java +++ b/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/pipeline/PipelineManagerImpl.java @@ -67,6 +67,8 @@ import java.util.concurrent.locks.ReentrantReadWriteLock; import java.util.stream.Collectors; +import static org.apache.hadoop.hdds.scm.pipeline.RatisPipelineUtils.pipelineLeaderFormat; + /** * SCM Pipeline Manager implementation. * All the write operations for pipelines must come via PipelineManager. @@ -697,6 +699,12 @@ public Map getPipelineInfo() throws NotLeaderException { return pipelineInfo; } + @Override + public Map>> getPipelineLeaders() { + List pipelines = getPipelines(); + return pipelineLeaderFormat(pipelines); + } + /** * Get SafeMode status. * @return boolean diff --git a/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/pipeline/PipelineManagerMXBean.java b/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/pipeline/PipelineManagerMXBean.java index 57eab610f4c1..cca9ee6e0969 100644 --- a/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/pipeline/PipelineManagerMXBean.java +++ b/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/pipeline/PipelineManagerMXBean.java @@ -36,4 +36,6 @@ public interface PipelineManagerMXBean { */ Map getPipelineInfo() throws NotLeaderException; + Map>> getPipelineLeaders(); + } diff --git a/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/pipeline/RatisPipelineUtils.java b/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/pipeline/RatisPipelineUtils.java index 6c68b8088332..913eef63c28a 100644 --- a/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/pipeline/RatisPipelineUtils.java +++ b/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/pipeline/RatisPipelineUtils.java @@ -19,6 +19,9 @@ import java.io.IOException; import java.util.List; +import java.util.Map; +import java.util.UUID; +import java.util.concurrent.ConcurrentHashMap; import java.util.stream.Collectors; import org.apache.hadoop.hdds.client.RatisReplicationConfig; @@ -117,4 +120,50 @@ static List checkPipelineContainSameDatanodes( p.sameDatanodes(pipeline))) .collect(Collectors.toList()); } + + /** + * Returns a map containing pipeline information which includes + * pipeline-id & the corresponding roles of all datanodes along with + * their respective datanode-id + * part of the pipeline. + * + * @param pipelines input pipeline + * @return map containing pipeline details + */ + public static Map>> + pipelineLeaderFormat(List pipelines) { + final Map>> pipelineInfo = + new ConcurrentHashMap<>(); + + pipelines.forEach(pipeline -> { + String leaderNode = ""; + List dataNodes = pipeline.getNodes(); + UUID pipelineId = pipeline.getId().getId(); + + try { + leaderNode = pipeline.getLeaderNode().getHostName(); + } catch (IOException ioEx) { + LOG.warn("Cannot get leader node for pipeline {}", + pipelineId, ioEx); + } + + int numOfNodes = dataNodes.size(); + Map> nodeInfo = new ConcurrentHashMap<>(); + for (int cnt = 0; cnt < numOfNodes; cnt++) { + Map info = new ConcurrentHashMap<>(); + DatanodeDetails node = dataNodes.get(cnt); + String role = + node.getHostName().equals(leaderNode) ? "Leader" : "Follower"; + String dataNodeUUID = node.getUuidString(); + String hostName = node.getHostName(); + info.put("Role", role); + info.put("UUID", dataNodeUUID); + info.put("HostName", hostName); + nodeInfo.put("DataNode-" + cnt, info); + } + pipelineInfo.put(pipelineId.toString(), nodeInfo); + }); + return pipelineInfo; + } + } diff --git a/hadoop-hdds/server-scm/src/test/java/org/apache/hadoop/hdds/scm/pipeline/MockPipelineManager.java b/hadoop-hdds/server-scm/src/test/java/org/apache/hadoop/hdds/scm/pipeline/MockPipelineManager.java index dd5cf9b401fd..7a3f9714d1b4 100644 --- a/hadoop-hdds/server-scm/src/test/java/org/apache/hadoop/hdds/scm/pipeline/MockPipelineManager.java +++ b/hadoop-hdds/server-scm/src/test/java/org/apache/hadoop/hdds/scm/pipeline/MockPipelineManager.java @@ -296,6 +296,11 @@ public Map getPipelineInfo() { return null; } + @Override + public Map>> getPipelineLeaders() { + return null; + } + @Override public void acquireReadLock() {