HDFS-15246. ArrayIndexOfboundsException in BlockManager CreateLocatedBlock. Contributed by Hemanth Boyina.

(cherry picked from commit 8b7695bb26)
This commit is contained in:
Inigo Goiri 2020-07-21 09:00:07 -07:00 committed by Wei-Chiu Chuang
parent 1148d3895f
commit 57d2fff84b
2 changed files with 41 additions and 1 deletions

View File

@ -655,8 +655,13 @@ private static class RenameOperation {
// snapshot is taken on the dst tree, changes will be recorded in the // snapshot is taken on the dst tree, changes will be recorded in the
// latest snapshot of the src tree. // latest snapshot of the src tree.
if (isSrcInSnapshot) { if (isSrcInSnapshot) {
if (srcChild.isFile()) {
INodeFile file = srcChild.asFile();
file.recordModification(srcLatestSnapshotId, true);
} else {
srcChild.recordModification(srcLatestSnapshotId); srcChild.recordModification(srcLatestSnapshotId);
} }
}
// check srcChild for reference // check srcChild for reference
srcRefDstSnapshot = srcChildIsReference ? srcRefDstSnapshot = srcChildIsReference ?

View File

@ -40,6 +40,7 @@
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import org.apache.hadoop.HadoopIllegalArgumentException; import org.apache.hadoop.HadoopIllegalArgumentException;
import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.BlockLocation;
import org.apache.hadoop.fs.ContentSummary; import org.apache.hadoop.fs.ContentSummary;
import org.apache.hadoop.fs.FSDataOutputStream; import org.apache.hadoop.fs.FSDataOutputStream;
import org.apache.hadoop.fs.FileStatus; import org.apache.hadoop.fs.FileStatus;
@ -70,6 +71,7 @@
import org.apache.hadoop.util.ToolRunner; import org.apache.hadoop.util.ToolRunner;
import org.slf4j.event.Level; import org.slf4j.event.Level;
import org.junit.After; import org.junit.After;
import org.junit.Assert;
import org.junit.Before; import org.junit.Before;
import org.junit.Test; import org.junit.Test;
@ -1460,4 +1462,37 @@ public void testQuotaSpaceConsumedWithSnapshots() throws IOException {
fs.getQuotaUsage(root).getSpaceConsumed()); fs.getQuotaUsage(root).getSpaceConsumed());
} }
/**
* Test truncate on a snapshotted file.
*/
@Test
public void testTruncatewithRenameandSnapshot() throws Exception {
final Path dir = new Path("/dir");
fs.mkdirs(dir, new FsPermission((short) 0777));
final Path file = new Path(dir, "file");
final Path movedFile = new Path("/file");
// 1. create a file and snapshot for dir which is having a file
DFSTestUtil.createFile(fs, file, 10, (short) 3, 0);
fs.allowSnapshot(dir);
Path snapshotPath = fs.createSnapshot(dir, "s0");
assertTrue(fs.exists(snapshotPath));
// 2. move the file
fs.rename(file, new Path("/"));
// 3.truncate the moved file
final boolean isReady = fs.truncate(movedFile, 5);
if (!isReady) {
checkBlockRecovery(movedFile);
}
FileStatus fileStatus = fs.getFileStatus(movedFile);
assertEquals(5, fileStatus.getLen());
// 4. get block locations of file which is in snapshot
LocatedBlocks locations = fs.getClient().getNamenode()
.getBlockLocations("/dir/.snapshot/s0/file", 0, 10);
assertEquals(10, locations.get(0).getBlockSize());
}
} }