HDFS-7744. Fix potential NPE in DFSInputStream after setDropBehind or setReadahead is called (cmccabe)
This commit is contained in:
parent
260b5e32c4
commit
a9dc5cd706
@ -890,6 +890,9 @@ Release 2.7.0 - UNRELEASED
|
|||||||
HDFS-7756. Restore method signature for LocatedBlock#getLocations(). (Ted
|
HDFS-7756. Restore method signature for LocatedBlock#getLocations(). (Ted
|
||||||
Yu via yliu)
|
Yu via yliu)
|
||||||
|
|
||||||
|
HDFS-7744. Fix potential NPE in DFSInputStream after setDropBehind or
|
||||||
|
setReadahead is called (cmccabe)
|
||||||
|
|
||||||
Release 2.6.1 - UNRELEASED
|
Release 2.6.1 - UNRELEASED
|
||||||
|
|
||||||
INCOMPATIBLE CHANGES
|
INCOMPATIBLE CHANGES
|
||||||
|
@ -580,10 +580,7 @@ implements ByteBufferReadable, CanSetDropBehind, CanSetReadahead,
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Will be getting a new BlockReader.
|
// Will be getting a new BlockReader.
|
||||||
if (blockReader != null) {
|
closeCurrentBlockReader();
|
||||||
blockReader.close();
|
|
||||||
blockReader = null;
|
|
||||||
}
|
|
||||||
|
|
||||||
//
|
//
|
||||||
// Connect to best DataNode for desired Block, with potential offset
|
// Connect to best DataNode for desired Block, with potential offset
|
||||||
@ -686,10 +683,7 @@ implements ByteBufferReadable, CanSetDropBehind, CanSetReadahead,
|
|||||||
"unreleased ByteBuffers allocated by read(). " +
|
"unreleased ByteBuffers allocated by read(). " +
|
||||||
"Please release " + builder.toString() + ".");
|
"Please release " + builder.toString() + ".");
|
||||||
}
|
}
|
||||||
if (blockReader != null) {
|
closeCurrentBlockReader();
|
||||||
blockReader.close();
|
|
||||||
blockReader = null;
|
|
||||||
}
|
|
||||||
super.close();
|
super.close();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1649,6 +1643,7 @@ implements ByteBufferReadable, CanSetDropBehind, CanSetReadahead,
|
|||||||
DFSClient.LOG.error("error closing blockReader", e);
|
DFSClient.LOG.error("error closing blockReader", e);
|
||||||
}
|
}
|
||||||
blockReader = null;
|
blockReader = null;
|
||||||
|
blockEnd = -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -369,4 +369,34 @@ public class TestCachingStrategy {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test(timeout=120000)
|
||||||
|
public void testSeekAfterSetDropBehind() throws Exception {
|
||||||
|
// start a cluster
|
||||||
|
LOG.info("testSeekAfterSetDropBehind");
|
||||||
|
Configuration conf = new HdfsConfiguration();
|
||||||
|
MiniDFSCluster cluster = null;
|
||||||
|
String TEST_PATH = "/test";
|
||||||
|
int TEST_PATH_LEN = MAX_TEST_FILE_LEN;
|
||||||
|
try {
|
||||||
|
cluster = new MiniDFSCluster.Builder(conf).numDataNodes(1)
|
||||||
|
.build();
|
||||||
|
cluster.waitActive();
|
||||||
|
FileSystem fs = cluster.getFileSystem();
|
||||||
|
createHdfsFile(fs, new Path(TEST_PATH), TEST_PATH_LEN, false);
|
||||||
|
// verify that we can seek after setDropBehind
|
||||||
|
FSDataInputStream fis = fs.open(new Path(TEST_PATH));
|
||||||
|
try {
|
||||||
|
Assert.assertTrue(fis.read() != -1); // create BlockReader
|
||||||
|
fis.setDropBehind(false); // clear BlockReader
|
||||||
|
fis.seek(2); // seek
|
||||||
|
} finally {
|
||||||
|
fis.close();
|
||||||
|
}
|
||||||
|
} finally {
|
||||||
|
if (cluster != null) {
|
||||||
|
cluster.shutdown();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user