HDFS-7608: hdfs dfsclient newConnectedPeer has no write timeout (Xiaoyu Yao via Colin P. McCabe)

(cherry picked from commit 1d74ccecec)
This commit is contained in:
Colin Patrick Mccabe 2015-07-14 10:57:59 -07:00
parent 64059d8884
commit 471037883f
3 changed files with 41 additions and 6 deletions

View File

@ -702,6 +702,9 @@ Release 2.8.0 - UNRELEASED
HDFS-2956. calling fetchdt without a --renewer argument throws NPE
(vinayakumarb)
HDFS-7608. hdfs dfsclient newConnectedPeer has no write timeout (Xiaoyu Yao
via Colin P. McCabe)
Release 2.7.2 - UNRELEASED
INCOMPATIBLE CHANGES

View File

@ -3101,6 +3101,7 @@ public class DFSClient implements java.io.Closeable, RemotePeerFactory,
peer = TcpPeerServer.peerFromSocketAndKey(saslClient, sock, this,
blockToken, datanodeId);
peer.setReadTimeout(socketTimeout);
peer.setWriteTimeout(socketTimeout);
success = true;
return peer;
} finally {

View File

@ -1009,10 +1009,9 @@ public class TestDistributedFileSystem {
cluster.shutdown();
}
}
@Test(timeout=10000)
public void testDFSClientPeerTimeout() throws IOException {
public void testDFSClientPeerReadTimeout() throws IOException {
final int timeout = 1000;
final Configuration conf = new HdfsConfiguration();
conf.setInt(DFSConfigKeys.DFS_CLIENT_SOCKET_TIMEOUT_KEY, timeout);
@ -1029,11 +1028,11 @@ public class TestDistributedFileSystem {
long start = Time.now();
try {
peer.getInputStream().read();
Assert.fail("should timeout");
Assert.fail("read should timeout");
} catch (SocketTimeoutException ste) {
long delta = Time.now() - start;
Assert.assertTrue("timedout too soon", delta >= timeout*0.9);
Assert.assertTrue("timedout too late", delta <= timeout*1.1);
Assert.assertTrue("read timedout too soon", delta >= timeout*0.9);
Assert.assertTrue("read timedout too late", delta <= timeout*1.1);
} catch (Throwable t) {
Assert.fail("wrong exception:"+t);
}
@ -1055,4 +1054,36 @@ public class TestDistributedFileSystem {
cluster.shutdown();
}
}
@Test(timeout=10000)
public void testDFSClientPeerWriteTimeout() throws IOException {
final int timeout = 1000;
final Configuration conf = new HdfsConfiguration();
conf.setInt(DFSConfigKeys.DFS_CLIENT_SOCKET_TIMEOUT_KEY, timeout);
// only need cluster to create a dfs client to get a peer
final MiniDFSCluster cluster = new MiniDFSCluster.Builder(conf).build();
try {
cluster.waitActive();
DistributedFileSystem dfs = cluster.getFileSystem();
// Write 1 MB to a dummy socket to ensure the write times out
ServerSocket socket = new ServerSocket(0);
Peer peer = dfs.getClient().newConnectedPeer(
(InetSocketAddress) socket.getLocalSocketAddress(), null, null);
long start = Time.now();
try {
byte[] buf = new byte[1024 * 1024];
peer.getOutputStream().write(buf);
Assert.fail("write should timeout");
} catch (SocketTimeoutException ste) {
long delta = Time.now() - start;
Assert.assertTrue("write timedout too soon", delta >= timeout * 0.9);
Assert.assertTrue("write timedout too late", delta <= timeout * 1.1);
} catch (Throwable t) {
Assert.fail("wrong exception:" + t);
}
} finally {
cluster.shutdown();
}
}
}