HADOOP-7998 CheckFileSystem does not correctly honor setVerifyChecksum (Daryn Sharp via bobby)
git-svn-id: https://svn.apache.org/repos/asf/hadoop/common/trunk@1236911 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
parent
fe4bff77e1
commit
cc8a2a29f1
@ -18,4 +18,4 @@
|
|||||||
|
|
||||||
OK_RELEASEAUDIT_WARNINGS=0
|
OK_RELEASEAUDIT_WARNINGS=0
|
||||||
OK_FINDBUGS_WARNINGS=0
|
OK_FINDBUGS_WARNINGS=0
|
||||||
OK_JAVADOC_WARNINGS=6
|
OK_JAVADOC_WARNINGS=13
|
||||||
|
@ -77,6 +77,8 @@ Trunk (unreleased changes)
|
|||||||
HADOOP-7965. Support for protocol version and signature in PB. (jitendra)
|
HADOOP-7965. Support for protocol version and signature in PB. (jitendra)
|
||||||
|
|
||||||
BUGS
|
BUGS
|
||||||
|
HADOOP-7998. CheckFileSystem does not correctly honor setVerifyChecksum
|
||||||
|
(Daryn Sharp via bobby)
|
||||||
|
|
||||||
HADOOP-7851. Configuration.getClasses() never returns the default value.
|
HADOOP-7851. Configuration.getClasses() never returns the default value.
|
||||||
(Uma Maheswara Rao G via amarrk)
|
(Uma Maheswara Rao G via amarrk)
|
||||||
|
@ -304,8 +304,9 @@ public synchronized void seek(long pos) throws IOException {
|
|||||||
*/
|
*/
|
||||||
@Override
|
@Override
|
||||||
public FSDataInputStream open(Path f, int bufferSize) throws IOException {
|
public FSDataInputStream open(Path f, int bufferSize) throws IOException {
|
||||||
return new FSDataInputStream(
|
return verifyChecksum
|
||||||
new ChecksumFSInputChecker(this, f, bufferSize));
|
? new FSDataInputStream(new ChecksumFSInputChecker(this, f, bufferSize))
|
||||||
|
: getRawFileSystem().open(f, bufferSize);
|
||||||
}
|
}
|
||||||
|
|
||||||
/** {@inheritDoc} */
|
/** {@inheritDoc} */
|
||||||
|
@ -22,12 +22,22 @@
|
|||||||
import org.apache.hadoop.fs.FSDataOutputStream;
|
import org.apache.hadoop.fs.FSDataOutputStream;
|
||||||
import static org.apache.hadoop.fs.FileSystemTestHelper.*;
|
import static org.apache.hadoop.fs.FileSystemTestHelper.*;
|
||||||
import org.apache.hadoop.conf.Configuration;
|
import org.apache.hadoop.conf.Configuration;
|
||||||
import junit.framework.TestCase;
|
import org.junit.*;
|
||||||
|
import static org.junit.Assert.*;
|
||||||
|
|
||||||
public class TestChecksumFileSystem extends TestCase {
|
public class TestChecksumFileSystem {
|
||||||
static final String TEST_ROOT_DIR
|
static final String TEST_ROOT_DIR
|
||||||
= System.getProperty("test.build.data","build/test/data/work-dir/localfs");
|
= System.getProperty("test.build.data","build/test/data/work-dir/localfs");
|
||||||
|
|
||||||
|
static LocalFileSystem localFs;
|
||||||
|
|
||||||
|
@Before
|
||||||
|
public void resetLocalFs() throws Exception {
|
||||||
|
localFs = FileSystem.getLocal(new Configuration());
|
||||||
|
localFs.setVerifyChecksum(true);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
public void testgetChecksumLength() throws Exception {
|
public void testgetChecksumLength() throws Exception {
|
||||||
assertEquals(8, ChecksumFileSystem.getChecksumLength(0L, 512));
|
assertEquals(8, ChecksumFileSystem.getChecksumLength(0L, 512));
|
||||||
assertEquals(12, ChecksumFileSystem.getChecksumLength(1L, 512));
|
assertEquals(12, ChecksumFileSystem.getChecksumLength(1L, 512));
|
||||||
@ -40,9 +50,8 @@ public void testgetChecksumLength() throws Exception {
|
|||||||
ChecksumFileSystem.getChecksumLength(10000000000000L, 10));
|
ChecksumFileSystem.getChecksumLength(10000000000000L, 10));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
public void testVerifyChecksum() throws Exception {
|
public void testVerifyChecksum() throws Exception {
|
||||||
Configuration conf = new Configuration();
|
|
||||||
LocalFileSystem localFs = FileSystem.getLocal(conf);
|
|
||||||
Path testPath = new Path(TEST_ROOT_DIR, "testPath");
|
Path testPath = new Path(TEST_ROOT_DIR, "testPath");
|
||||||
Path testPath11 = new Path(TEST_ROOT_DIR, "testPath11");
|
Path testPath11 = new Path(TEST_ROOT_DIR, "testPath11");
|
||||||
FSDataOutputStream fout = localFs.create(testPath);
|
FSDataOutputStream fout = localFs.create(testPath);
|
||||||
@ -68,7 +77,7 @@ public void testVerifyChecksum() throws Exception {
|
|||||||
|
|
||||||
//copying the wrong checksum file
|
//copying the wrong checksum file
|
||||||
FileUtil.copy(localFs, localFs.getChecksumFile(testPath11), localFs,
|
FileUtil.copy(localFs, localFs.getChecksumFile(testPath11), localFs,
|
||||||
localFs.getChecksumFile(testPath),false,true,conf);
|
localFs.getChecksumFile(testPath),false,true,localFs.getConf());
|
||||||
assertTrue("checksum exists", localFs.exists(localFs.getChecksumFile(testPath)));
|
assertTrue("checksum exists", localFs.exists(localFs.getChecksumFile(testPath)));
|
||||||
|
|
||||||
boolean errorRead = false;
|
boolean errorRead = false;
|
||||||
@ -80,20 +89,13 @@ public void testVerifyChecksum() throws Exception {
|
|||||||
assertTrue("error reading", errorRead);
|
assertTrue("error reading", errorRead);
|
||||||
|
|
||||||
//now setting verify false, the read should succeed
|
//now setting verify false, the read should succeed
|
||||||
try {
|
localFs.setVerifyChecksum(false);
|
||||||
localFs.setVerifyChecksum(false);
|
String str = readFile(localFs, testPath, 1024).toString();
|
||||||
String str = readFile(localFs, testPath, 1024).toString();
|
assertTrue("read", "testing".equals(str));
|
||||||
assertTrue("read", "testing".equals(str));
|
|
||||||
} finally {
|
|
||||||
// reset for other tests
|
|
||||||
localFs.setVerifyChecksum(true);
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
public void testMultiChunkFile() throws Exception {
|
public void testMultiChunkFile() throws Exception {
|
||||||
Configuration conf = new Configuration();
|
|
||||||
LocalFileSystem localFs = FileSystem.getLocal(conf);
|
|
||||||
Path testPath = new Path(TEST_ROOT_DIR, "testMultiChunk");
|
Path testPath = new Path(TEST_ROOT_DIR, "testMultiChunk");
|
||||||
FSDataOutputStream fout = localFs.create(testPath);
|
FSDataOutputStream fout = localFs.create(testPath);
|
||||||
for (int i = 0; i < 1000; i++) {
|
for (int i = 0; i < 1000; i++) {
|
||||||
@ -116,9 +118,8 @@ public void testMultiChunkFile() throws Exception {
|
|||||||
* Test to ensure that if the checksum file is truncated, a
|
* Test to ensure that if the checksum file is truncated, a
|
||||||
* ChecksumException is thrown
|
* ChecksumException is thrown
|
||||||
*/
|
*/
|
||||||
|
@Test
|
||||||
public void testTruncatedChecksum() throws Exception {
|
public void testTruncatedChecksum() throws Exception {
|
||||||
Configuration conf = new Configuration();
|
|
||||||
LocalFileSystem localFs = FileSystem.getLocal(conf);
|
|
||||||
Path testPath = new Path(TEST_ROOT_DIR, "testtruncatedcrc");
|
Path testPath = new Path(TEST_ROOT_DIR, "testtruncatedcrc");
|
||||||
FSDataOutputStream fout = localFs.create(testPath);
|
FSDataOutputStream fout = localFs.create(testPath);
|
||||||
fout.write("testing truncation".getBytes());
|
fout.write("testing truncation".getBytes());
|
||||||
@ -146,14 +147,60 @@ public void testTruncatedChecksum() throws Exception {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// telling it not to verify checksums, should avoid issue.
|
// telling it not to verify checksums, should avoid issue.
|
||||||
|
localFs.setVerifyChecksum(false);
|
||||||
|
String str = readFile(localFs, testPath, 1024).toString();
|
||||||
|
assertTrue("read", "testing truncation".equals(str));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testStreamType() throws Exception {
|
||||||
|
Path testPath = new Path(TEST_ROOT_DIR, "testStreamType");
|
||||||
|
localFs.create(testPath).close();
|
||||||
|
FSDataInputStream in = null;
|
||||||
|
|
||||||
|
localFs.setVerifyChecksum(true);
|
||||||
|
in = localFs.open(testPath);
|
||||||
|
assertTrue("stream is input checker",
|
||||||
|
in.getWrappedStream() instanceof FSInputChecker);
|
||||||
|
|
||||||
|
localFs.setVerifyChecksum(false);
|
||||||
|
in = localFs.open(testPath);
|
||||||
|
assertFalse("stream is not input checker",
|
||||||
|
in.getWrappedStream() instanceof FSInputChecker);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testCorruptedChecksum() throws Exception {
|
||||||
|
Path testPath = new Path(TEST_ROOT_DIR, "testCorruptChecksum");
|
||||||
|
Path checksumPath = localFs.getChecksumFile(testPath);
|
||||||
|
|
||||||
|
// write a file to generate checksum
|
||||||
|
FSDataOutputStream out = localFs.create(testPath, true);
|
||||||
|
out.write("testing 1 2 3".getBytes());
|
||||||
|
out.close();
|
||||||
|
assertTrue(localFs.exists(checksumPath));
|
||||||
|
FileStatus stat = localFs.getFileStatus(checksumPath);
|
||||||
|
|
||||||
|
// alter file directly so checksum is invalid
|
||||||
|
out = localFs.getRawFileSystem().create(testPath, true);
|
||||||
|
out.write("testing stale checksum".getBytes());
|
||||||
|
out.close();
|
||||||
|
assertTrue(localFs.exists(checksumPath));
|
||||||
|
// checksum didn't change on disk
|
||||||
|
assertEquals(stat, localFs.getFileStatus(checksumPath));
|
||||||
|
|
||||||
|
Exception e = null;
|
||||||
try {
|
try {
|
||||||
localFs.setVerifyChecksum(false);
|
|
||||||
String str = readFile(localFs, testPath, 1024).toString();
|
|
||||||
assertTrue("read", "testing truncation".equals(str));
|
|
||||||
} finally {
|
|
||||||
// reset for other tests
|
|
||||||
localFs.setVerifyChecksum(true);
|
localFs.setVerifyChecksum(true);
|
||||||
|
readFile(localFs, testPath, 1024);
|
||||||
|
} catch (ChecksumException ce) {
|
||||||
|
e = ce;
|
||||||
|
} finally {
|
||||||
|
assertNotNull("got checksum error", e);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
localFs.setVerifyChecksum(false);
|
||||||
|
String str = readFile(localFs, testPath, 1024);
|
||||||
|
assertEquals("testing stale checksum", str);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user