Skip to content
Merged
Show file tree
Hide file tree
Changes from 5 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -20,8 +20,10 @@
import java.io.IOException;
import java.util.ArrayList;
import java.util.LinkedHashMap;
import java.util.LinkedHashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.concurrent.Callable;
import org.apache.hadoop.hdds.HddsConfigKeys;
import org.apache.hadoop.hdds.conf.OzoneConfiguration;
Expand Down Expand Up @@ -74,6 +76,10 @@ public Void call() throws Exception {
return null;
}

// Remove duplicates while preserving order
Set<String> uniqueDatanodes = new LinkedHashSet<>(targetDatanodes);
List<String> deduplicatedDatanodes = new ArrayList<>(uniqueDatanodes);
Comment thread
Gargi-jais11 marked this conversation as resolved.
Outdated

// Track if we're using batch mode for display
isBatchMode = options.isInServiceDatanodes();

Expand All @@ -83,7 +89,7 @@ public Void call() throws Exception {
List<Object> jsonResults = new ArrayList<>();

// Execute commands and collect results
for (String dn : targetDatanodes) {
for (String dn : deduplicatedDatanodes) {
try {
Object result = executeCommand(dn);
successNodes.add(dn);
Expand Down Expand Up @@ -220,7 +226,9 @@ protected Map<String, Object> getConfigurationMap() {
*/
private Map<String, Object> createErrorResult(String datanode, String errorMsg) {
Map<String, Object> errorResult = new LinkedHashMap<>();
errorResult.put("datanode", datanode);
// Format datanode string with hostname if available
String formattedDatanode = formatDatanodeDisplayName(datanode);
errorResult.put("datanode", formattedDatanode);
errorResult.put("action", getActionName());
errorResult.put("status", "failure");
errorResult.put("errorMsg", errorMsg);
Expand All @@ -233,5 +241,21 @@ private Map<String, Object> createErrorResult(String datanode, String errorMsg)

return errorResult;
}

/**
* Format a datanode address string to include hostname if available.
* Queries SCM to get the hostname for the given IP address and port.
*
* @param address the datanode address in "ip:port" format
* @return formatted string "hostname (ip:port)" or "ip:port" if hostname is not available
*/
protected String formatDatanodeDisplayName(String address) {
try (ScmClient scmClient = new ContainerOperationClient(new OzoneConfiguration())) {
return DiskBalancerSubCommandUtil.getDatanodeHostAndIp(scmClient, address);
Comment thread
Gargi-jais11 marked this conversation as resolved.
Outdated
} catch (IOException e) {
// If SCM query fails, return original address
return address;
}
}
}

Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,8 @@

package org.apache.hadoop.hdds.scm.cli.datanode;

import static java.util.stream.Collectors.toList;

import java.io.IOException;
import java.util.ArrayList;
import java.util.LinkedHashMap;
Expand Down Expand Up @@ -72,8 +74,10 @@ protected void displayResults(List<String> successNodes, List<String> failedNode

// Display error messages for failed nodes
if (!failedNodes.isEmpty()) {
System.err.printf("Failed to get DiskBalancer report from nodes: [%s]%n",
String.join(", ", failedNodes));
System.err.printf("Failed to get DiskBalancer report from nodes: [%s]%n",
String.join(", ", failedNodes.stream()
.map(this::formatDatanodeDisplayName)
.collect(toList())));
}

// Display consolidated report for successful nodes
Expand All @@ -91,15 +95,20 @@ private String generateReport(List<DatanodeDiskBalancerInfoProto> protos) {
Double.compare(b.getCurrentVolumeDensitySum(), a.getCurrentVolumeDensitySum()));

StringBuilder formatBuilder = new StringBuilder("Report result:%n" +
"%-50s %s%n");
"%-55s %s%n");

List<String> contentList = new ArrayList<>();
contentList.add("Datanode");
contentList.add("VolumeDensity");

for (DatanodeDiskBalancerInfoProto proto : sortedProtos) {
formatBuilder.append("%-50s %s%n");
Comment thread
Gargi-jais11 marked this conversation as resolved.
Outdated
contentList.add(proto.getNode().getHostName());
// Format datanode string with hostname and IP address
String[] hostnameIpPort = DiskBalancerSubCommandUtil.extractHostIpAndPort(
Comment thread
Gargi-jais11 marked this conversation as resolved.
Outdated
proto.getNode());
String formattedDatanode = DiskBalancerSubCommandUtil.getDatanodeHostAndIp(
hostnameIpPort[0], hostnameIpPort[1], Integer.parseInt(hostnameIpPort[2]));
contentList.add(formattedDatanode);
contentList.add(String.valueOf(proto.getCurrentVolumeDensitySum()));
}

Expand All @@ -121,7 +130,12 @@ protected String getActionName() {
private Map<String, Object> createReportResult(
HddsProtos.DatanodeDiskBalancerInfoProto report) {
Map<String, Object> result = new LinkedHashMap<>();
result.put("datanode", report.getNode().getHostName());
// Format datanode string with hostname and IP address
String[] hostnameIpPort = DiskBalancerSubCommandUtil.extractHostIpAndPort(
report.getNode());
String formattedDatanode = DiskBalancerSubCommandUtil.getDatanodeHostAndIp(
hostnameIpPort[0], hostnameIpPort[1], Integer.parseInt(hostnameIpPort[2]));
result.put("datanode", formattedDatanode);
result.put("action", "report");
result.put("status", "success");
result.put("volumeDensity", report.getCurrentVolumeDensitySum());
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,8 @@

package org.apache.hadoop.hdds.scm.cli.datanode;

import static java.util.stream.Collectors.toList;

import java.io.IOException;
import java.util.LinkedHashMap;
import java.util.List;
Expand Down Expand Up @@ -65,7 +67,9 @@ protected Object executeCommand(String hostName) throws IOException {
diskBalancerProxy.startDiskBalancer(config);

Map<String, Object> result = new LinkedHashMap<>();
result.put("datanode", hostName);
// Format datanode string with hostname if available
String formattedDatanode = formatDatanodeDisplayName(hostName);
result.put("datanode", formattedDatanode);
result.put("action", "start");
result.put("status", "success");
Map<String, Object> configMap = getConfigurationMap();
Expand Down Expand Up @@ -107,19 +111,25 @@ protected void displayResults(List<String> successNodes,
if (isBatchMode()) {
if (!failedNodes.isEmpty()) {
System.err.printf("Failed to start DiskBalancer on nodes: [%s]%n",
String.join(", ", failedNodes));
String.join(", ", failedNodes.stream()
.map(this::formatDatanodeDisplayName)
.collect(toList())));
} else {
System.out.println("Started DiskBalancer on all IN_SERVICE nodes.");
}
} else {
// Detailed message for specific nodes
if (!successNodes.isEmpty()) {
System.out.printf("Started DiskBalancer on nodes: [%s]%n",
String.join(", ", successNodes));
String.join(", ", successNodes.stream()
.map(this::formatDatanodeDisplayName)
.collect(toList())));
}
if (!failedNodes.isEmpty()) {
System.err.printf("Failed to start DiskBalancer on nodes: [%s]%n",
String.join(", ", failedNodes));
String.join(", ", failedNodes.stream()
.map(this::formatDatanodeDisplayName)
.collect(toList())));
}
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,8 @@

package org.apache.hadoop.hdds.scm.cli.datanode;

import static java.util.stream.Collectors.toList;

import java.io.IOException;
import java.util.ArrayList;
import java.util.LinkedHashMap;
Expand Down Expand Up @@ -72,8 +74,10 @@ protected void displayResults(List<String> successNodes, List<String> failedNode

// Display error messages for failed nodes
if (!failedNodes.isEmpty()) {
System.err.printf("Failed to get DiskBalancer status from nodes: [%s]%n",
String.join(", ", failedNodes));
System.err.printf("Failed to get DiskBalancer status from nodes: [%s]%n",
String.join(", ", failedNodes.stream()
.map(this::formatDatanodeDisplayName)
.collect(toList())));
}

// Display consolidated status for successful nodes
Expand All @@ -86,7 +90,7 @@ protected void displayResults(List<String> successNodes, List<String> failedNode

private String generateStatus(List<DatanodeDiskBalancerInfoProto> protos) {
StringBuilder formatBuilder = new StringBuilder("Status result:%n" +
"%-35s %-15s %-15s %-15s %-12s %-20s %-12s %-12s %-15s %-18s %-20s%n");
"%-55s %-15s %-15s %-15s %-12s %-20s %-12s %-12s %-15s %-18s %-20s%n");

List<String> contentList = new ArrayList<>();
contentList.add("Datanode");
Expand All @@ -102,12 +106,17 @@ private String generateStatus(List<DatanodeDiskBalancerInfoProto> protos) {
contentList.add("EstTimeLeft(min)");

for (HddsProtos.DatanodeDiskBalancerInfoProto proto : protos) {
formatBuilder.append("%-35s %-15s %-15s %-15s %-12s %-20s %-12s %-12s %-15s %-18s %-20s%n");
formatBuilder.append("%-60s %-12s %-15s %-15s %-12s %-20s %-12s %-12s %-15s %-18s %-20s%n");
Comment thread
Gargi-jais11 marked this conversation as resolved.
long estimatedTimeLeft = calculateEstimatedTimeLeft(proto);
long bytesMovedMB = (long) Math.ceil(proto.getBytesMoved() / (1024.0 * 1024.0));
long bytesToMoveMB = (long) Math.ceil(proto.getBytesToMove() / (1024.0 * 1024.0));

contentList.add(proto.getNode().getHostName());
// Format datanode string with hostname and IP address
String[] hostnameIpPort = DiskBalancerSubCommandUtil.extractHostIpAndPort(
proto.getNode());
String formattedDatanode = DiskBalancerSubCommandUtil.getDatanodeHostAndIp(
hostnameIpPort[0], hostnameIpPort[1], Integer.parseInt(hostnameIpPort[2]));
contentList.add(formattedDatanode);
contentList.add(proto.getRunningStatus().name());
contentList.add(
String.format("%.4f", proto.getDiskBalancerConf().getThreshold()));
Expand Down Expand Up @@ -149,7 +158,12 @@ protected String getActionName() {
*/
private Map<String, Object> createStatusResult(DatanodeDiskBalancerInfoProto status) {
Map<String, Object> result = new LinkedHashMap<>();
result.put("datanode", status.getNode().getHostName());
// Format datanode string with hostname and IP address
String[] hostnameIpPort = DiskBalancerSubCommandUtil.extractHostIpAndPort(
status.getNode());
String formattedDatanode = DiskBalancerSubCommandUtil.getDatanodeHostAndIp(
hostnameIpPort[0], hostnameIpPort[1], Integer.parseInt(hostnameIpPort[2]));
result.put("datanode", formattedDatanode);
result.put("action", "status");
result.put("status", "success");
result.put("serviceStatus", status.getRunningStatus().name());
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,8 @@

package org.apache.hadoop.hdds.scm.cli.datanode;

import static java.util.stream.Collectors.toList;

import java.io.IOException;
import java.util.List;
import java.util.Map;
Expand All @@ -41,7 +43,9 @@ protected Object executeCommand(String hostName) throws IOException {
try {
diskBalancerProxy.stopDiskBalancer();
Map<String, Object> result = new java.util.LinkedHashMap<>();
result.put("datanode", hostName);
// Format datanode string with hostname if available
String formattedDatanode = formatDatanodeDisplayName(hostName);
result.put("datanode", formattedDatanode);
result.put("action", "stop");
result.put("status", "success");
return result;
Expand All @@ -61,19 +65,25 @@ protected void displayResults(List<String> successNodes, List<String> failedNode
// Simpler message for batch mode
if (!failedNodes.isEmpty()) {
System.err.printf("Failed to stop DiskBalancer on nodes: [%s]%n",
String.join(", ", failedNodes));
String.join(", ", failedNodes.stream()
.map(this::formatDatanodeDisplayName)
.collect(toList())));
} else {
System.out.println("Stopped DiskBalancer on all IN_SERVICE nodes.");
}
} else {
// Detailed message for specific nodes
if (!successNodes.isEmpty()) {
System.out.printf("Stopped DiskBalancer on nodes: [%s]%n",
String.join(", ", successNodes));
String.join(", ", successNodes.stream()
.map(this::formatDatanodeDisplayName)
.collect(toList())));
}
if (!failedNodes.isEmpty()) {
System.err.printf("Failed to stop DiskBalancer on nodes: [%s]%n",
String.join(", ", failedNodes));
String.join(", ", failedNodes.stream()
.map(this::formatDatanodeDisplayName)
.collect(toList())));
}
}
}
Expand Down
Loading