|
@@ -17,6 +17,8 @@
|
|
*/
|
|
*/
|
|
package org.apache.hadoop.hdfs.server.federation.router;
|
|
package org.apache.hadoop.hdfs.server.federation.router;
|
|
|
|
|
|
|
|
+import static org.apache.hadoop.hdfs.client.HdfsClientConfigKeys.DFS_CLIENT_SERVER_DEFAULTS_VALIDITY_PERIOD_MS_DEFAULT;
|
|
|
|
+import static org.apache.hadoop.hdfs.client.HdfsClientConfigKeys.DFS_CLIENT_SERVER_DEFAULTS_VALIDITY_PERIOD_MS_KEY;
|
|
import static org.apache.hadoop.hdfs.server.federation.router.FederationUtil.updateMountPointStatus;
|
|
import static org.apache.hadoop.hdfs.server.federation.router.FederationUtil.updateMountPointStatus;
|
|
import org.apache.hadoop.conf.Configuration;
|
|
import org.apache.hadoop.conf.Configuration;
|
|
import org.apache.hadoop.crypto.CryptoProtocolVersion;
|
|
import org.apache.hadoop.crypto.CryptoProtocolVersion;
|
|
@@ -88,6 +90,7 @@ import org.apache.hadoop.io.Text;
|
|
import org.apache.hadoop.net.ConnectTimeoutException;
|
|
import org.apache.hadoop.net.ConnectTimeoutException;
|
|
import org.apache.hadoop.security.UserGroupInformation;
|
|
import org.apache.hadoop.security.UserGroupInformation;
|
|
import org.apache.hadoop.security.token.Token;
|
|
import org.apache.hadoop.security.token.Token;
|
|
|
|
+import org.apache.hadoop.util.Time;
|
|
import org.slf4j.Logger;
|
|
import org.slf4j.Logger;
|
|
import org.slf4j.LoggerFactory;
|
|
import org.slf4j.LoggerFactory;
|
|
|
|
|
|
@@ -122,6 +125,15 @@ public class RouterClientProtocol implements ClientProtocol {
|
|
private final FileSubclusterResolver subclusterResolver;
|
|
private final FileSubclusterResolver subclusterResolver;
|
|
private final ActiveNamenodeResolver namenodeResolver;
|
|
private final ActiveNamenodeResolver namenodeResolver;
|
|
|
|
|
|
|
|
+ /**
|
|
|
|
+ * Caching server defaults so as to prevent redundant calls to namenode,
|
|
|
|
+ * similar to DFSClient, caching saves efforts when router connects
|
|
|
|
+ * to multiple clients.
|
|
|
|
+ */
|
|
|
|
+ private volatile FsServerDefaults serverDefaults;
|
|
|
|
+ private volatile long serverDefaultsLastUpdate;
|
|
|
|
+ private final long serverDefaultsValidityPeriod;
|
|
|
|
+
|
|
/** If it requires response from all subclusters. */
|
|
/** If it requires response from all subclusters. */
|
|
private final boolean allowPartialList;
|
|
private final boolean allowPartialList;
|
|
/** Time out when getting the mount statistics. */
|
|
/** Time out when getting the mount statistics. */
|
|
@@ -155,7 +167,9 @@ public class RouterClientProtocol implements ClientProtocol {
|
|
RBFConfigKeys.DFS_ROUTER_CLIENT_MOUNT_TIME_OUT,
|
|
RBFConfigKeys.DFS_ROUTER_CLIENT_MOUNT_TIME_OUT,
|
|
RBFConfigKeys.DFS_ROUTER_CLIENT_MOUNT_TIME_OUT_DEFAULT,
|
|
RBFConfigKeys.DFS_ROUTER_CLIENT_MOUNT_TIME_OUT_DEFAULT,
|
|
TimeUnit.MILLISECONDS);
|
|
TimeUnit.MILLISECONDS);
|
|
-
|
|
|
|
|
|
+ this.serverDefaultsValidityPeriod = conf.getLong(
|
|
|
|
+ DFS_CLIENT_SERVER_DEFAULTS_VALIDITY_PERIOD_MS_KEY,
|
|
|
|
+ DFS_CLIENT_SERVER_DEFAULTS_VALIDITY_PERIOD_MS_DEFAULT);
|
|
// User and group for reporting
|
|
// User and group for reporting
|
|
try {
|
|
try {
|
|
this.superUser = UserGroupInformation.getCurrentUser().getShortUserName();
|
|
this.superUser = UserGroupInformation.getCurrentUser().getShortUserName();
|
|
@@ -226,9 +240,15 @@ public class RouterClientProtocol implements ClientProtocol {
|
|
@Override
|
|
@Override
|
|
public FsServerDefaults getServerDefaults() throws IOException {
|
|
public FsServerDefaults getServerDefaults() throws IOException {
|
|
rpcServer.checkOperation(NameNode.OperationCategory.READ);
|
|
rpcServer.checkOperation(NameNode.OperationCategory.READ);
|
|
-
|
|
|
|
- RemoteMethod method = new RemoteMethod("getServerDefaults");
|
|
|
|
- return rpcServer.invokeAtAvailableNs(method, FsServerDefaults.class);
|
|
|
|
|
|
+ long now = Time.monotonicNow();
|
|
|
|
+ if ((serverDefaults == null) || (now - serverDefaultsLastUpdate
|
|
|
|
+ > serverDefaultsValidityPeriod)) {
|
|
|
|
+ RemoteMethod method = new RemoteMethod("getServerDefaults");
|
|
|
|
+ serverDefaults =
|
|
|
|
+ rpcServer.invokeAtAvailableNs(method, FsServerDefaults.class);
|
|
|
|
+ serverDefaultsLastUpdate = now;
|
|
|
|
+ }
|
|
|
|
+ return serverDefaults;
|
|
}
|
|
}
|
|
|
|
|
|
@Override
|
|
@Override
|