From dc09dbc8f4580728b295e81aa2efb92d105cebc6 Mon Sep 17 00:00:00 2001 From: wangyuxuan Date: Tue, 26 Oct 2021 14:18:30 +0800 Subject: [PATCH 1/2] Unboxing long value in old version's block report cause full GC --- .../hdfs/protocol/BlockListAsLongs.java | 23 +++++++++++-------- 1 file changed, 13 insertions(+), 10 deletions(-) diff --git a/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/protocol/BlockListAsLongs.java b/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/protocol/BlockListAsLongs.java index 3e30a6309d903..98755f86ea1eb 100644 --- a/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/protocol/BlockListAsLongs.java +++ b/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/protocol/BlockListAsLongs.java @@ -437,14 +437,17 @@ public void remove() { // decode old style block report of longs private static class LongsDecoder extends BlockListAsLongs { - private final List values; + private final long[] values; private final int finalizedBlocks; private final int numBlocks; private final int maxDataLength; // set the header LongsDecoder(List values, int maxDataLength) { - this.values = values.subList(2, values.size()); + this.values = new long[values.size() - 2]; + for (int i = 2; i < values.size(); i++) { + this.values[i - 2] = values.get(i); + } this.finalizedBlocks = values.get(0).intValue(); this.numBlocks = finalizedBlocks + values.get(1).intValue(); this.maxDataLength = maxDataLength; @@ -466,11 +469,11 @@ public ByteString getBlocksBuffer() { @Override public long[] getBlockListAsLongs() { - long[] longs = new long[2+values.size()]; + long[] longs = new long[2 + values.length]; longs[0] = finalizedBlocks; longs[1] = numBlocks - finalizedBlocks; - for(int i=0; i iterator() { return new Iterator() { private final BlockReportReplica block = new BlockReportReplica(); - final Iterator iter = values.iterator(); + int idx = 0; private int currentBlockIndex = 0; @Override @@ -502,15 +505,15 @@ public BlockReportReplica next() { if (currentBlockIndex++ < finalizedBlocks) { block.setState(ReplicaState.FINALIZED); } else { - block.setState(ReplicaState.getState(iter.next().intValue())); + block.setState(ReplicaState.getState((int) values[idx++])); } return block; } private void readBlock() { - block.setBlockId(iter.next()); - block.setNumBytes(iter.next()); - block.setGenerationStamp(iter.next()); + block.setBlockId(values[idx++]); + block.setNumBytes(values[idx++]); + block.setGenerationStamp(values[idx++]); } @Override From c1c7625896900ab976f1a885c5311daee40bad03 Mon Sep 17 00:00:00 2001 From: wangyuxuan Date: Sat, 25 Dec 2021 10:19:27 +0800 Subject: [PATCH 2/2] Fix check style issue --- .../java/org/apache/hadoop/hdfs/protocol/BlockListAsLongs.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/protocol/BlockListAsLongs.java b/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/protocol/BlockListAsLongs.java index 98755f86ea1eb..03e08cdcc21bc 100644 --- a/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/protocol/BlockListAsLongs.java +++ b/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/protocol/BlockListAsLongs.java @@ -482,7 +482,7 @@ public long[] getBlockListAsLongs() { public Iterator iterator() { return new Iterator() { private final BlockReportReplica block = new BlockReportReplica(); - int idx = 0; + private int idx = 0; private int currentBlockIndex = 0; @Override