|
@@ -28,12 +28,14 @@ import static org.apache.hadoop.hdfs.DFSConfigKeys.DFS_ROUTER_READER_QUEUE_SIZE_
|
|
|
|
|
|
import java.io.FileNotFoundException;
|
|
|
import java.io.IOException;
|
|
|
+import java.lang.reflect.Array;
|
|
|
import java.net.InetSocketAddress;
|
|
|
import java.util.Collection;
|
|
|
import java.util.EnumSet;
|
|
|
import java.util.HashMap;
|
|
|
import java.util.Iterator;
|
|
|
import java.util.LinkedHashMap;
|
|
|
+import java.util.LinkedHashSet;
|
|
|
import java.util.LinkedList;
|
|
|
import java.util.List;
|
|
|
import java.util.Map;
|
|
@@ -961,8 +963,9 @@ public class RouterRpcServer extends AbstractService implements ClientProtocol {
|
|
|
RemoteMethod method = new RemoteMethod("getListing",
|
|
|
new Class<?>[] {String.class, startAfter.getClass(), boolean.class},
|
|
|
new RemoteParam(), startAfter, needLocation);
|
|
|
- Map<RemoteLocation, Object> listings =
|
|
|
- rpcClient.invokeConcurrent(locations, method, false, false);
|
|
|
+ Map<RemoteLocation, DirectoryListing> listings =
|
|
|
+ rpcClient.invokeConcurrent(
|
|
|
+ locations, method, false, false, DirectoryListing.class);
|
|
|
|
|
|
Map<String, HdfsFileStatus> nnListing = new TreeMap<>();
|
|
|
int totalRemainingEntries = 0;
|
|
@@ -971,9 +974,10 @@ public class RouterRpcServer extends AbstractService implements ClientProtocol {
|
|
|
if (listings != null) {
|
|
|
// Check the subcluster listing with the smallest name
|
|
|
String lastName = null;
|
|
|
- for (Entry<RemoteLocation, Object> entry : listings.entrySet()) {
|
|
|
+ for (Entry<RemoteLocation, DirectoryListing> entry :
|
|
|
+ listings.entrySet()) {
|
|
|
RemoteLocation location = entry.getKey();
|
|
|
- DirectoryListing listing = (DirectoryListing) entry.getValue();
|
|
|
+ DirectoryListing listing = entry.getValue();
|
|
|
if (listing == null) {
|
|
|
LOG.debug("Cannot get listing from {}", location);
|
|
|
} else {
|
|
@@ -1097,11 +1101,10 @@ public class RouterRpcServer extends AbstractService implements ClientProtocol {
|
|
|
|
|
|
RemoteMethod method = new RemoteMethod("getStats");
|
|
|
Set<FederationNamespaceInfo> nss = namenodeResolver.getNamespaces();
|
|
|
- Map<FederationNamespaceInfo, Object> results =
|
|
|
- rpcClient.invokeConcurrent(nss, method, true, false);
|
|
|
+ Map<FederationNamespaceInfo, long[]> results =
|
|
|
+ rpcClient.invokeConcurrent(nss, method, true, false, long[].class);
|
|
|
long[] combinedData = new long[STATS_ARRAY_LENGTH];
|
|
|
- for (Object o : results.values()) {
|
|
|
- long[] data = (long[]) o;
|
|
|
+ for (long[] data : results.values()) {
|
|
|
for (int i = 0; i < combinedData.length && i < data.length; i++) {
|
|
|
if (data[i] >= 0) {
|
|
|
combinedData[i] += data[i];
|
|
@@ -1134,11 +1137,13 @@ public class RouterRpcServer extends AbstractService implements ClientProtocol {
|
|
|
new Class<?>[] {DatanodeReportType.class}, type);
|
|
|
|
|
|
Set<FederationNamespaceInfo> nss = namenodeResolver.getNamespaces();
|
|
|
- Map<FederationNamespaceInfo, Object> results =
|
|
|
- rpcClient.invokeConcurrent(nss, method, true, false, timeOutMs);
|
|
|
- for (Entry<FederationNamespaceInfo, Object> entry : results.entrySet()) {
|
|
|
+ Map<FederationNamespaceInfo, DatanodeInfo[]> results =
|
|
|
+ rpcClient.invokeConcurrent(
|
|
|
+ nss, method, true, false, timeOutMs, DatanodeInfo[].class);
|
|
|
+ for (Entry<FederationNamespaceInfo, DatanodeInfo[]> entry :
|
|
|
+ results.entrySet()) {
|
|
|
FederationNamespaceInfo ns = entry.getKey();
|
|
|
- DatanodeInfo[] result = (DatanodeInfo[]) entry.getValue();
|
|
|
+ DatanodeInfo[] result = entry.getValue();
|
|
|
for (DatanodeInfo node : result) {
|
|
|
String nodeId = node.getXferAddr();
|
|
|
if (!datanodesMap.containsKey(nodeId)) {
|
|
@@ -1224,17 +1229,14 @@ public class RouterRpcServer extends AbstractService implements ClientProtocol {
|
|
|
new Class<?>[] {SafeModeAction.class, boolean.class},
|
|
|
action, isChecked);
|
|
|
Set<FederationNamespaceInfo> nss = namenodeResolver.getNamespaces();
|
|
|
- Map<FederationNamespaceInfo, Object> results =
|
|
|
- rpcClient.invokeConcurrent(nss, method, true, true);
|
|
|
+ Map<FederationNamespaceInfo, Boolean> results =
|
|
|
+ rpcClient.invokeConcurrent(nss, method, true, true, boolean.class);
|
|
|
|
|
|
// We only report true if all the name space are in safe mode
|
|
|
int numSafemode = 0;
|
|
|
- for (Object result : results.values()) {
|
|
|
- if (result instanceof Boolean) {
|
|
|
- boolean safemode = (boolean) result;
|
|
|
- if (safemode) {
|
|
|
- numSafemode++;
|
|
|
- }
|
|
|
+ for (boolean safemode : results.values()) {
|
|
|
+ if (safemode) {
|
|
|
+ numSafemode++;
|
|
|
}
|
|
|
}
|
|
|
return numSafemode == results.size();
|
|
@@ -1247,18 +1249,14 @@ public class RouterRpcServer extends AbstractService implements ClientProtocol {
|
|
|
RemoteMethod method = new RemoteMethod("restoreFailedStorage",
|
|
|
new Class<?>[] {String.class}, arg);
|
|
|
final Set<FederationNamespaceInfo> nss = namenodeResolver.getNamespaces();
|
|
|
- Map<FederationNamespaceInfo, Object> ret =
|
|
|
- rpcClient.invokeConcurrent(nss, method, true, false);
|
|
|
+ Map<FederationNamespaceInfo, Boolean> ret =
|
|
|
+ rpcClient.invokeConcurrent(nss, method, true, false, boolean.class);
|
|
|
|
|
|
boolean success = true;
|
|
|
- Object obj = ret;
|
|
|
- @SuppressWarnings("unchecked")
|
|
|
- Map<FederationNamespaceInfo, Boolean> results =
|
|
|
- (Map<FederationNamespaceInfo, Boolean>)obj;
|
|
|
- Collection<Boolean> sucesses = results.values();
|
|
|
- for (boolean s : sucesses) {
|
|
|
+ for (boolean s : ret.values()) {
|
|
|
if (!s) {
|
|
|
success = false;
|
|
|
+ break;
|
|
|
}
|
|
|
}
|
|
|
return success;
|
|
@@ -1279,17 +1277,12 @@ public class RouterRpcServer extends AbstractService implements ClientProtocol {
|
|
|
|
|
|
RemoteMethod method = new RemoteMethod("rollEdits", new Class<?>[] {});
|
|
|
final Set<FederationNamespaceInfo> nss = namenodeResolver.getNamespaces();
|
|
|
- Map<FederationNamespaceInfo, Object> ret =
|
|
|
- rpcClient.invokeConcurrent(nss, method, true, false);
|
|
|
+ Map<FederationNamespaceInfo, Long> ret =
|
|
|
+ rpcClient.invokeConcurrent(nss, method, true, false, long.class);
|
|
|
|
|
|
// Return the maximum txid
|
|
|
long txid = 0;
|
|
|
- Object obj = ret;
|
|
|
- @SuppressWarnings("unchecked")
|
|
|
- Map<FederationNamespaceInfo, Long> results =
|
|
|
- (Map<FederationNamespaceInfo, Long>)obj;
|
|
|
- Collection<Long> txids = results.values();
|
|
|
- for (long t : txids) {
|
|
|
+ for (long t : ret.values()) {
|
|
|
if (t > txid) {
|
|
|
txid = t;
|
|
|
}
|
|
@@ -1324,17 +1317,13 @@ public class RouterRpcServer extends AbstractService implements ClientProtocol {
|
|
|
RemoteMethod method = new RemoteMethod("rollingUpgrade",
|
|
|
new Class<?>[] {RollingUpgradeAction.class}, action);
|
|
|
final Set<FederationNamespaceInfo> nss = namenodeResolver.getNamespaces();
|
|
|
- Map<FederationNamespaceInfo, Object> ret =
|
|
|
- rpcClient.invokeConcurrent(nss, method, true, false);
|
|
|
+ Map<FederationNamespaceInfo, RollingUpgradeInfo> ret =
|
|
|
+ rpcClient.invokeConcurrent(
|
|
|
+ nss, method, true, false, RollingUpgradeInfo.class);
|
|
|
|
|
|
// Return the first rolling upgrade info
|
|
|
RollingUpgradeInfo info = null;
|
|
|
- Object obj = ret;
|
|
|
- @SuppressWarnings("unchecked")
|
|
|
- Map<FederationNamespaceInfo, RollingUpgradeInfo> results =
|
|
|
- (Map<FederationNamespaceInfo, RollingUpgradeInfo>)obj;
|
|
|
- Collection<RollingUpgradeInfo> infos = results.values();
|
|
|
- for (RollingUpgradeInfo infoNs : infos) {
|
|
|
+ for (RollingUpgradeInfo infoNs : ret.values()) {
|
|
|
if (info == null && infoNs != null) {
|
|
|
info = infoNs;
|
|
|
}
|
|
@@ -1386,10 +1375,9 @@ public class RouterRpcServer extends AbstractService implements ClientProtocol {
|
|
|
final List<RemoteLocation> locations = getLocationsForPath(path, false);
|
|
|
RemoteMethod method = new RemoteMethod("getContentSummary",
|
|
|
new Class<?>[] {String.class}, new RemoteParam());
|
|
|
- @SuppressWarnings("unchecked")
|
|
|
- Map<String, ContentSummary> results =
|
|
|
- (Map<String, ContentSummary>) ((Object)rpcClient.invokeConcurrent(
|
|
|
- locations, method, false, false));
|
|
|
+ Map<RemoteLocation, ContentSummary> results =
|
|
|
+ rpcClient.invokeConcurrent(
|
|
|
+ locations, method, false, false, ContentSummary.class);
|
|
|
summaries.addAll(results.values());
|
|
|
} catch (FileNotFoundException e) {
|
|
|
notFoundException = e;
|
|
@@ -1762,16 +1750,12 @@ public class RouterRpcServer extends AbstractService implements ClientProtocol {
|
|
|
RemoteMethod method = new RemoteMethod(
|
|
|
"getCurrentEditLogTxid", new Class<?>[] {});
|
|
|
final Set<FederationNamespaceInfo> nss = namenodeResolver.getNamespaces();
|
|
|
- Map<FederationNamespaceInfo, Object> ret =
|
|
|
- rpcClient.invokeConcurrent(nss, method, true, false);
|
|
|
+ Map<FederationNamespaceInfo, Long> ret =
|
|
|
+ rpcClient.invokeConcurrent(nss, method, true, false, long.class);
|
|
|
|
|
|
// Return the maximum txid
|
|
|
long txid = 0;
|
|
|
- Object obj = ret;
|
|
|
- @SuppressWarnings("unchecked")
|
|
|
- Map<FederationNamespaceInfo, Long> results =
|
|
|
- (Map<FederationNamespaceInfo, Long>)obj;
|
|
|
- Collection<Long> txids = results.values();
|
|
|
+ Collection<Long> txids = ret.values();
|
|
|
for (long t : txids) {
|
|
|
if (t > txid) {
|
|
|
txid = t;
|
|
@@ -2032,6 +2016,39 @@ public class RouterRpcServer extends AbstractService implements ClientProtocol {
|
|
|
return (ugi != null) ? ugi : UserGroupInformation.getCurrentUser();
|
|
|
}
|
|
|
|
|
|
+ /**
|
|
|
+ * Merge the outputs from multiple namespaces.
|
|
|
+ * @param map Namespace -> Output array.
|
|
|
+ * @param clazz Class of the values.
|
|
|
+ * @return Array with the outputs.
|
|
|
+ */
|
|
|
+ protected static <T> T[] merge(
|
|
|
+ Map<FederationNamespaceInfo, T[]> map, Class<T> clazz) {
|
|
|
+
|
|
|
+ // Put all results into a set to avoid repeats
|
|
|
+ Set<T> ret = new LinkedHashSet<>();
|
|
|
+ for (T[] values : map.values()) {
|
|
|
+ for (T val : values) {
|
|
|
+ ret.add(val);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ return toArray(ret, clazz);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * Convert a set of values into an array.
|
|
|
+ * @param set Input set.
|
|
|
+ * @param clazz Class of the values.
|
|
|
+ * @return Array with the values in set.
|
|
|
+ */
|
|
|
+ private static <T> T[] toArray(Set<T> set, Class<T> clazz) {
|
|
|
+ @SuppressWarnings("unchecked")
|
|
|
+ T[] combinedData = (T[]) Array.newInstance(clazz, set.size());
|
|
|
+ combinedData = set.toArray(combinedData);
|
|
|
+ return combinedData;
|
|
|
+ }
|
|
|
+
|
|
|
/**
|
|
|
* Get RPC metrics info.
|
|
|
* @return The instance of FederationRPCMetrics.
|