From 46644319e1b3295ddbc7597c060956bf46487d11 Mon Sep 17 00:00:00 2001 From: Lei Xu Date: Mon, 9 Oct 2017 10:08:30 -0700 Subject: [PATCH] HDFS-12606. When using native decoder, DFSStripedStream.close crashes JVM after being called multiple times. (Lei (Eddy) Xu) --- .../apache/hadoop/hdfs/DFSStripedInputStream.java | 7 +++++-- .../hadoop/hdfs/TestDFSStripedInputStream.java | 13 +++++++++++++ 2 files changed, 18 insertions(+), 2 deletions(-) diff --git a/hadoop-hdfs-project/hadoop-hdfs-client/src/main/java/org/apache/hadoop/hdfs/DFSStripedInputStream.java b/hadoop-hdfs-project/hadoop-hdfs-client/src/main/java/org/apache/hadoop/hdfs/DFSStripedInputStream.java index d4d06465c7b..e7d90edf37c 100644 --- a/hadoop-hdfs-project/hadoop-hdfs-client/src/main/java/org/apache/hadoop/hdfs/DFSStripedInputStream.java +++ b/hadoop-hdfs-project/hadoop-hdfs-client/src/main/java/org/apache/hadoop/hdfs/DFSStripedInputStream.java @@ -68,7 +68,7 @@ public class DFSStripedInputStream extends DFSInputStream { private ByteBuffer curStripeBuf; private ByteBuffer parityBuf; private final ErasureCodingPolicy ecPolicy; - private final RawErasureDecoder decoder; + private RawErasureDecoder decoder; /** * Indicate the start/end offset of the current buffered stripe in the @@ -188,7 +188,10 @@ public synchronized void close() throws IOException { BUFFER_POOL.putBuffer(parityBuf); parityBuf = null; } - decoder.release(); + if (decoder != null) { + decoder.release(); + decoder = null; + } } } diff --git a/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/TestDFSStripedInputStream.java b/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/TestDFSStripedInputStream.java index f94b7abeee2..de276a9e698 100644 --- a/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/TestDFSStripedInputStream.java +++ b/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/TestDFSStripedInputStream.java @@ -491,4 +491,17 @@ public void testStatefulReadWithDNFailure() throws Exception { assertEquals(readSize, done); assertArrayEquals(expected, readBuffer); } + + @Test + public void testIdempotentClose() throws Exception { + final int numBlocks = 2; + DFSTestUtil.createStripedFile(cluster, filePath, null, numBlocks, + stripesPerBlock, false, ecPolicy); + + try (DFSInputStream in = fs.getClient().open(filePath.toString())) { + assertTrue(in instanceof DFSStripedInputStream); + // Close twice + in.close(); + } + } }