From e6d2dccbef664e60e682eee31caf0b48e50a2251 Mon Sep 17 00:00:00 2001
From: jianghuazhu <740087514@qq.com>
Date: Wed, 11 Nov 2020 08:34:17 +0800
Subject: [PATCH] HDFS-15469. Dynamically configure the size of
PacketReceiver#MAX_PACKET_SIZE. (#2138)
---
.../hadoop/hdfs/client/HdfsClientConfigKeys.java | 6 ++++++
.../hdfs/protocol/datatransfer/PacketReceiver.java | 12 +++++++++++-
.../hadoop-hdfs/src/main/resources/hdfs-default.xml | 8 ++++++++
.../protocol/datatransfer/TestPacketReceiver.java | 9 ++++++++-
4 files changed, 33 insertions(+), 2 deletions(-)
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 0e4cebf1adb..f858080929e 100755
--- 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
@@ -221,6 +221,12 @@ public interface HdfsClientConfigKeys {
"dfs.encrypt.data.transfer.cipher.key.bitlength";
int DFS_ENCRYPT_DATA_TRANSFER_CIPHER_KEY_BITLENGTH_DEFAULT = 128;
+ public static final String
+ DFS_DATA_TRANSFER_MAX_PACKET_SIZE =
+ "dfs.data.transfer.max.packet.size";
+ public static final int DFS_DATA_TRANSFER_MAX_PACKET_SIZE_DEFAULT =
+ 16 * 1024 * 1024;
+
String DFS_TRUSTEDCHANNEL_RESOLVER_CLASS =
"dfs.trustedchannel.resolver.class";
diff --git a/hadoop-hdfs-project/hadoop-hdfs-client/src/main/java/org/apache/hadoop/hdfs/protocol/datatransfer/PacketReceiver.java b/hadoop-hdfs-project/hadoop-hdfs-client/src/main/java/org/apache/hadoop/hdfs/protocol/datatransfer/PacketReceiver.java
index dc6d590ce63..6949a9d40a6 100644
--- a/hadoop-hdfs-project/hadoop-hdfs-client/src/main/java/org/apache/hadoop/hdfs/protocol/datatransfer/PacketReceiver.java
+++ b/hadoop-hdfs-project/hadoop-hdfs-client/src/main/java/org/apache/hadoop/hdfs/protocol/datatransfer/PacketReceiver.java
@@ -25,6 +25,9 @@ import java.nio.ByteBuffer;
import java.nio.channels.ReadableByteChannel;
import org.apache.hadoop.classification.InterfaceAudience;
+import org.apache.hadoop.conf.Configuration;
+import org.apache.hadoop.hdfs.HdfsConfiguration;
+import org.apache.hadoop.hdfs.client.HdfsClientConfigKeys;
import org.apache.hadoop.util.DirectBufferPool;
import org.apache.hadoop.io.IOUtils;
@@ -45,7 +48,7 @@ public class PacketReceiver implements Closeable {
* The max size of any single packet. This prevents OOMEs when
* invalid data is sent.
*/
- public static final int MAX_PACKET_SIZE = 16 * 1024 * 1024;
+ public static final int MAX_PACKET_SIZE;
static final Logger LOG = LoggerFactory.getLogger(PacketReceiver.class);
@@ -74,6 +77,13 @@ public class PacketReceiver implements Closeable {
*/
private PacketHeader curHeader;
+ static {
+ Configuration conf = new HdfsConfiguration();
+ MAX_PACKET_SIZE = conf.getInt(HdfsClientConfigKeys.
+ DFS_DATA_TRANSFER_MAX_PACKET_SIZE,
+ HdfsClientConfigKeys.DFS_DATA_TRANSFER_MAX_PACKET_SIZE_DEFAULT);
+ }
+
public PacketReceiver(boolean useDirectBuffers) {
this.useDirectBuffers = useDirectBuffers;
reallocPacketBuf(PacketHeader.PKT_LENGTHS_LEN);
diff --git a/hadoop-hdfs-project/hadoop-hdfs/src/main/resources/hdfs-default.xml b/hadoop-hdfs-project/hadoop-hdfs/src/main/resources/hdfs-default.xml
index 4a37d26967b..8d70c5737fa 100755
--- a/hadoop-hdfs-project/hadoop-hdfs/src/main/resources/hdfs-default.xml
+++ b/hadoop-hdfs-project/hadoop-hdfs/src/main/resources/hdfs-default.xml
@@ -4458,6 +4458,14 @@
+
+ dfs.data.transfer.max.packet.size
+ 16777216
+
+ The max size of any single packet.
+
+
+
dfs.datanode.balance.max.concurrent.moves
100
diff --git a/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/protocol/datatransfer/TestPacketReceiver.java b/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/protocol/datatransfer/TestPacketReceiver.java
index bec696ca6bb..f627f003e76 100644
--- a/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/protocol/datatransfer/TestPacketReceiver.java
+++ b/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/protocol/datatransfer/TestPacketReceiver.java
@@ -24,6 +24,7 @@ import java.io.IOException;
import java.nio.ByteBuffer;
import org.apache.hadoop.hdfs.AppendTestUtil;
+import org.apache.hadoop.hdfs.client.HdfsClientConfigKeys;
import org.junit.Test;
import org.mockito.Mockito;
@@ -56,7 +57,13 @@ public class TestPacketReceiver {
buf.get(b);
return b;
}
-
+
+ @Test
+ public void testPacketSize() {
+ assertEquals(PacketReceiver.MAX_PACKET_SIZE,
+ HdfsClientConfigKeys.DFS_DATA_TRANSFER_MAX_PACKET_SIZE_DEFAULT);
+ }
+
@Test
public void testReceiveAndMirror() throws IOException {
PacketReceiver pr = new PacketReceiver(false);