From 372d1302c63c6f49f99be5766c5da9647ebd9ca6 Mon Sep 17 00:00:00 2001 From: Masatake Iwasaki Date: Sat, 13 Feb 2016 03:31:15 +0900 Subject: [PATCH] HDFS-9700. DFSClient and DFSOutputStream should set TCP_NODELAY on sockets for DataTransferProtocol (Gary Helmling via iwasakims) --- .../main/java/org/apache/hadoop/hdfs/DFSClient.java | 1 + .../java/org/apache/hadoop/hdfs/DataStreamer.java | 1 + .../hadoop/hdfs/client/HdfsClientConfigKeys.java | 4 ++++ .../hadoop/hdfs/client/impl/DfsClientConf.java | 13 +++++++++++++ hadoop-hdfs-project/hadoop-hdfs/CHANGES.txt | 3 +++ 5 files changed, 22 insertions(+) diff --git a/hadoop-hdfs-project/hadoop-hdfs-client/src/main/java/org/apache/hadoop/hdfs/DFSClient.java b/hadoop-hdfs-project/hadoop-hdfs-client/src/main/java/org/apache/hadoop/hdfs/DFSClient.java index 9c00ea7037b..15a49f166f0 100644 --- a/hadoop-hdfs-project/hadoop-hdfs-client/src/main/java/org/apache/hadoop/hdfs/DFSClient.java +++ b/hadoop-hdfs-project/hadoop-hdfs-client/src/main/java/org/apache/hadoop/hdfs/DFSClient.java @@ -1890,6 +1890,7 @@ private IOStreamPair connectToDN(DatanodeInfo dn, int timeout, String dnAddr = dn.getXferAddr(getConf().isConnectToDnViaHostname()); LOG.debug("Connecting to datanode {}", dnAddr); NetUtils.connect(sock, NetUtils.createSocketAddr(dnAddr), timeout); + sock.setTcpNoDelay(dfsClientConf.getDataTransferTcpNoDelay()); sock.setSoTimeout(timeout); OutputStream unbufOut = NetUtils.getOutputStream(sock); diff --git a/hadoop-hdfs-project/hadoop-hdfs-client/src/main/java/org/apache/hadoop/hdfs/DataStreamer.java b/hadoop-hdfs-project/hadoop-hdfs-client/src/main/java/org/apache/hadoop/hdfs/DataStreamer.java index e3843ded539..9d3cb5565fd 100644 --- a/hadoop-hdfs-project/hadoop-hdfs-client/src/main/java/org/apache/hadoop/hdfs/DataStreamer.java +++ b/hadoop-hdfs-project/hadoop-hdfs-client/src/main/java/org/apache/hadoop/hdfs/DataStreamer.java @@ -131,6 +131,7 @@ static Socket createSocketForPipeline(final DatanodeInfo first, final int timeout = client.getDatanodeReadTimeout(length); NetUtils.connect(sock, isa, client.getRandomLocalInterfaceAddr(), conf.getSocketTimeout()); + sock.setTcpNoDelay(conf.getDataTransferTcpNoDelay()); sock.setSoTimeout(timeout); sock.setKeepAlive(true); if (conf.getSocketSendBufferSize() > 0) { diff --git a/hadoop-hdfs-project/hadoop-hdfs-client/src/main/java/org/apache/hadoop/hdfs/client/HdfsClientConfigKeys.java b/hadoop-hdfs-project/hadoop-hdfs-client/src/main/java/org/apache/hadoop/hdfs/client/HdfsClientConfigKeys.java index fcfd49ca1ad..775907e692f 100644 --- a/hadoop-hdfs-project/hadoop-hdfs-client/src/main/java/org/apache/hadoop/hdfs/client/HdfsClientConfigKeys.java +++ b/hadoop-hdfs-project/hadoop-hdfs-client/src/main/java/org/apache/hadoop/hdfs/client/HdfsClientConfigKeys.java @@ -160,6 +160,10 @@ public interface HdfsClientConfigKeys { String DFS_USER_HOME_DIR_PREFIX_KEY = "dfs.user.home.dir.prefix"; String DFS_USER_HOME_DIR_PREFIX_DEFAULT = "/user"; + String DFS_DATA_TRANSFER_CLIENT_TCPNODELAY_KEY = + "dfs.data.transfer.client.tcpnodelay"; + boolean DFS_DATA_TRANSFER_CLIENT_TCPNODELAY_DEFAULT = true; + /** * These are deprecated config keys to client code. */ diff --git a/hadoop-hdfs-project/hadoop-hdfs-client/src/main/java/org/apache/hadoop/hdfs/client/impl/DfsClientConf.java b/hadoop-hdfs-project/hadoop-hdfs-client/src/main/java/org/apache/hadoop/hdfs/client/impl/DfsClientConf.java index 194f3ba4e81..eae3c8ee48d 100644 --- a/hadoop-hdfs-project/hadoop-hdfs-client/src/main/java/org/apache/hadoop/hdfs/client/impl/DfsClientConf.java +++ b/hadoop-hdfs-project/hadoop-hdfs-client/src/main/java/org/apache/hadoop/hdfs/client/impl/DfsClientConf.java @@ -58,6 +58,8 @@ import static org.apache.hadoop.hdfs.client.HdfsClientConfigKeys.DFS_CLIENT_SOCKET_CACHE_EXPIRY_MSEC_KEY; import static org.apache.hadoop.hdfs.client.HdfsClientConfigKeys.DFS_CLIENT_SOCKET_SEND_BUFFER_SIZE_DEFAULT; import static org.apache.hadoop.hdfs.client.HdfsClientConfigKeys.DFS_CLIENT_SOCKET_SEND_BUFFER_SIZE_KEY; +import static org.apache.hadoop.hdfs.client.HdfsClientConfigKeys.DFS_DATA_TRANSFER_CLIENT_TCPNODELAY_DEFAULT; +import static org.apache.hadoop.hdfs.client.HdfsClientConfigKeys.DFS_DATA_TRANSFER_CLIENT_TCPNODELAY_KEY; import static org.apache.hadoop.hdfs.client.HdfsClientConfigKeys.DFS_CLIENT_SOCKET_TIMEOUT_KEY; import static org.apache.hadoop.hdfs.client.HdfsClientConfigKeys.DFS_CLIENT_USE_DN_HOSTNAME; import static org.apache.hadoop.hdfs.client.HdfsClientConfigKeys.DFS_CLIENT_USE_DN_HOSTNAME_DEFAULT; @@ -135,6 +137,7 @@ public class DfsClientConf { private final int stripedReadThreadpoolSize; + private final boolean dataTransferTcpNoDelay; public DfsClientConf(Configuration conf) { // The hdfsTimeout is currently the same as the ipc timeout @@ -173,6 +176,9 @@ public DfsClientConf(Configuration conf) { CommonConfigurationKeysPublic.IO_FILE_BUFFER_SIZE_KEY, CommonConfigurationKeysPublic.IO_FILE_BUFFER_SIZE_DEFAULT); defaultChecksumOpt = getChecksumOptFromConf(conf); + dataTransferTcpNoDelay = conf.getBoolean( + DFS_DATA_TRANSFER_CLIENT_TCPNODELAY_KEY, + DFS_DATA_TRANSFER_CLIENT_TCPNODELAY_DEFAULT); socketTimeout = conf.getInt(DFS_CLIENT_SOCKET_TIMEOUT_KEY, HdfsConstants.READ_TIMEOUT); socketSendBufferSize = conf.getInt(DFS_CLIENT_SOCKET_SEND_BUFFER_SIZE_KEY, @@ -405,6 +411,13 @@ public ByteArrayManager.Conf getWriteByteArrayManagerConf() { return writeByteArrayManagerConf; } + /** + * @return whether TCP_NODELAY should be set on client sockets + */ + public boolean getDataTransferTcpNoDelay() { + return dataTransferTcpNoDelay; + } + /** * @return the socketTimeout */ diff --git a/hadoop-hdfs-project/hadoop-hdfs/CHANGES.txt b/hadoop-hdfs-project/hadoop-hdfs/CHANGES.txt index 27c4c0f2191..8d60d5e6a37 100644 --- a/hadoop-hdfs-project/hadoop-hdfs/CHANGES.txt +++ b/hadoop-hdfs-project/hadoop-hdfs/CHANGES.txt @@ -1908,6 +1908,9 @@ Release 2.8.0 - UNRELEASED HDFS-9777. Fix typos in DFSAdmin command line and documentation. (Wei-Chiu Chuang via umamahesh) + HDFS-9700. DFSClient and DFSOutputStream should set TCP_NODELAY on sockets + for DataTransferProtocol (Gary Helmling via iwasakims) + OPTIMIZATIONS HDFS-8026. Trace FSOutputSummer#writeChecksumChunks rather than