diff --git a/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/fs/CommonConfigurationKeys.java b/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/fs/CommonConfigurationKeys.java index 2721466..a823351 100644 --- a/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/fs/CommonConfigurationKeys.java +++ b/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/fs/CommonConfigurationKeys.java @@ -52,6 +52,10 @@ public static final String IPC_CLIENT_PING_KEY = "ipc.client.ping"; /** Default value of IPC_CLIENT_PING_KEY */ public static final boolean IPC_CLIENT_PING_DEFAULT = true; + /** The time after which a RPC will timeout. */ + public static final String IPC_CLIENT_RPC_TIMEOUT_KEY = "ipc.client.rpc.timeout"; + /** Default value of IPC_CLIENT_RPC_TIMEOUT_KEY */ + public static final int IPC_CLIENT_RPC_TIMEOUT_DEFAULT = 0; /** Responses larger than this will be logged */ public static final String IPC_SERVER_RPC_MAX_RESPONSE_SIZE_KEY = "ipc.server.max.response.size"; diff --git a/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/ipc/Client.java b/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/ipc/Client.java index 6996a51..8a6daa6 100644 --- a/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/ipc/Client.java +++ b/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/ipc/Client.java @@ -246,6 +246,25 @@ final public static int getTimeout(Configuration conf) { } return -1; } + + /** + * Get the default timeout for RPC proxy. + * If ping is not enabled (via ipc.client.ping), + * the timeout value has no effect. + * + * @param conf Configuration + * @return the timeout period in milliseconds. + */ + final static int getRpcTimeout(Configuration conf) { + if (conf.getBoolean(CommonConfigurationKeys.IPC_CLIENT_PING_KEY, + CommonConfigurationKeys.IPC_CLIENT_PING_DEFAULT)) { + return conf.getInt(CommonConfigurationKeys.IPC_CLIENT_RPC_TIMEOUT_KEY, + CommonConfigurationKeys.IPC_CLIENT_RPC_TIMEOUT_DEFAULT); + } else { + return 0; + } + } + /** * set the connection timeout value in configuration * diff --git a/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/ipc/RPC.java b/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/ipc/RPC.java index 4766175..21d36a5 100644 --- a/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/ipc/RPC.java +++ b/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/ipc/RPC.java @@ -347,7 +347,8 @@ public RpcErrorCodeProto getRpcErrorCodeProto() { long clientVersion, InetSocketAddress addr, Configuration conf, long connTimeout) throws IOException { - return waitForProtocolProxy(protocol, clientVersion, addr, conf, 0, null, connTimeout); + return waitForProtocolProxy(protocol, clientVersion, addr, conf, + Client.getRpcTimeout(conf), null, connTimeout); } /** @@ -492,7 +493,8 @@ public RpcErrorCodeProto getRpcErrorCodeProto() { Configuration conf, SocketFactory factory) throws IOException { return getProtocolProxy( - protocol, clientVersion, addr, ticket, conf, factory, 0, null); + protocol, clientVersion, addr, ticket, conf, factory, + Client.getRpcTimeout(conf), null); } /** diff --git a/hadoop-common-project/hadoop-common/src/test/java/org/apache/hadoop/ipc/TestIPC.java b/hadoop-common-project/hadoop-common/src/test/java/org/apache/hadoop/ipc/TestIPC.java index 08508ae..fb7acaa 100644 --- a/hadoop-common-project/hadoop-common/src/test/java/org/apache/hadoop/ipc/TestIPC.java +++ b/hadoop-common-project/hadoop-common/src/test/java/org/apache/hadoop/ipc/TestIPC.java @@ -1299,6 +1299,7 @@ public void run() { public void testClientGetTimeout() throws IOException { Configuration config = new Configuration(); assertEquals(Client.getTimeout(config), -1); + assertEquals(Client.getRpcTimeout(config), 0); } private void assertRetriesOnSocketTimeouts(Configuration conf,