HDFS-1776 Bug in Bug in Concat code. Contributed by Bharath Mundlapudi
git-svn-id: https://svn.apache.org/repos/asf/hadoop/common/trunk@1150247 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
parent
598b85c9e2
commit
c316d43a0a
|
@ -879,6 +879,8 @@ Trunk (unreleased changes)
|
|||
HDFS-2114. re-commission of a decommissioned node does not delete
|
||||
excess replicas. (John George via mattf)
|
||||
|
||||
HDFS-1776. Bug in Concat code. (Bharath Mundlapudi via Dmytro Molkov)
|
||||
|
||||
Release 0.22.0 - Unreleased
|
||||
|
||||
INCOMPATIBLE CHANGES
|
||||
|
|
|
@ -127,7 +127,7 @@ public class INodeFile extends INode {
|
|||
size += in.blocks.length;
|
||||
}
|
||||
|
||||
for(BlockInfo bi: this.blocks) {
|
||||
for(BlockInfo bi: newlist) {
|
||||
bi.setINode(this);
|
||||
}
|
||||
this.blocks = newlist;
|
||||
|
|
|
@ -23,6 +23,7 @@ import static org.junit.Assert.*;
|
|||
import org.apache.hadoop.fs.Path;
|
||||
import org.apache.hadoop.fs.permission.FsPermission;
|
||||
import org.apache.hadoop.fs.permission.PermissionStatus;
|
||||
import org.apache.hadoop.hdfs.server.blockmanagement.BlockInfo;
|
||||
|
||||
import org.junit.Test;
|
||||
|
||||
|
@ -150,4 +151,56 @@ public class TestINodeFile {
|
|||
assertEquals(Path.SEPARATOR, root.getLocalParentDir());
|
||||
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testAppendBlocks() {
|
||||
INodeFile origFile = createINodeFiles(1, "origfile")[0];
|
||||
assertEquals("Number of blocks didn't match", origFile.numBlocks(), 1L);
|
||||
|
||||
INodeFile[] appendFiles = createINodeFiles(4, "appendfile");
|
||||
origFile.appendBlocks(appendFiles, getTotalBlocks(appendFiles));
|
||||
assertEquals("Number of blocks didn't match", origFile.numBlocks(), 5L);
|
||||
|
||||
for(int i=0; i< origFile.numBlocks(); i++) {
|
||||
assertSame("INodeFiles didn't Match", origFile, origFile.getBlocks()[i].getINode());
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Gives the count of blocks for a given number of files
|
||||
* @param files Array of INode files
|
||||
* @return total count of blocks
|
||||
*/
|
||||
private int getTotalBlocks(INodeFile[] files) {
|
||||
int nBlocks=0;
|
||||
for(int i=0; i < files.length; i++) {
|
||||
nBlocks += files[i].numBlocks();
|
||||
}
|
||||
return nBlocks;
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates the required number of files with one block each
|
||||
* @param nCount Number of INodes to create
|
||||
* @return Array of INode files
|
||||
*/
|
||||
private INodeFile[] createINodeFiles(int nCount, String fileNamePrefix) {
|
||||
if(nCount <= 0)
|
||||
return new INodeFile[1];
|
||||
|
||||
replication = 3;
|
||||
preferredBlockSize = 128 * 1024 * 1024;
|
||||
INodeFile[] iNodes = new INodeFile[nCount];
|
||||
for (int i = 0; i < nCount; i++) {
|
||||
PermissionStatus perms = new PermissionStatus(userName, null,
|
||||
FsPermission.getDefault());
|
||||
iNodes[i] = new INodeFile(perms, null, replication, 0L, 0L,
|
||||
preferredBlockSize);
|
||||
iNodes[i].setLocalName(fileNamePrefix + Integer.toString(i));
|
||||
BlockInfo newblock = new BlockInfo(replication);
|
||||
iNodes[i].addBlock(newblock);
|
||||
}
|
||||
|
||||
return iNodes;
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue