HDFS-5782. Change BlockListAsLongs constructor to take Replica as parameter type instead of concrete classes Block and ReplicaInfo. Contributed by David Powell and Joe Pallas

This commit is contained in:
Tsz-Wo Nicholas Sze 2015-01-14 13:46:06 -08:00
parent 7fe0f25ad2
commit 6464a8929a
5 changed files with 57 additions and 15 deletions

View File

@ -129,6 +129,10 @@ Trunk (Unreleased)
HDFS-6609. Use DirectorySnapshottableFeature to represent a snapshottable
directory. (Jing Zhao via wheat9)
HDFS-5782. Change BlockListAsLongs constructor to take Replica as parameter
type instead of concrete classes Block and ReplicaInfo. (David Powell
and Joe Pallas via szetszwo)
OPTIMIZATIONS
BUG FIXES

View File

@ -25,7 +25,7 @@
import org.apache.hadoop.classification.InterfaceAudience;
import org.apache.hadoop.classification.InterfaceStability;
import org.apache.hadoop.hdfs.server.common.HdfsServerConstants.ReplicaState;
import org.apache.hadoop.hdfs.server.datanode.ReplicaInfo;
import org.apache.hadoop.hdfs.server.datanode.Replica;
/**
* This class provides an interface for accessing list of blocks that
@ -85,8 +85,8 @@ private int index2BlockId(int blockIndex) {
* @param finalized - list of finalized blocks
* @param uc - list of under construction blocks
*/
public BlockListAsLongs(final List<? extends Block> finalized,
final List<ReplicaInfo> uc) {
public BlockListAsLongs(final List<? extends Replica> finalized,
final List<? extends Replica> uc) {
int finalizedSize = finalized == null ? 0 : finalized.size();
int ucSize = uc == null ? 0 : uc.size();
int len = HEADER_SIZE
@ -113,8 +113,34 @@ public BlockListAsLongs(final List<? extends Block> finalized,
}
}
/**
* Create block report from a list of finalized blocks. Used by
* NNThroughputBenchmark.
*
* @param blocks - list of finalized blocks
*/
public BlockListAsLongs(final List<? extends Block> blocks) {
int finalizedSize = blocks == null ? 0 : blocks.size();
int len = HEADER_SIZE
+ (finalizedSize + 1) * LONGS_PER_FINALIZED_BLOCK;
blockList = new long[len];
// set the header
blockList[0] = finalizedSize;
blockList[1] = 0;
// set finalized blocks
for (int i = 0; i < finalizedSize; i++) {
setBlock(i, blocks.get(i));
}
// set invalid delimiting block
setDelimitingBlock(finalizedSize);
}
public BlockListAsLongs() {
this(null);
this((long[])null);
}
/**
@ -279,18 +305,30 @@ public long corruptBlockLengthForTesting(final int blockIndex, Random rand) {
/**
* Set the indexTh block
* @param index - the index of the block to set
* @param b - the block is set to the value of the this block
* @param r - the block is set to the value of the this Replica
*/
private <T extends Block> void setBlock(final int index, final T b) {
private void setBlock(final int index, final Replica r) {
int pos = index2BlockId(index);
blockList[pos] = r.getBlockId();
blockList[pos + 1] = r.getNumBytes();
blockList[pos + 2] = r.getGenerationStamp();
if(index < getNumberOfFinalizedReplicas())
return;
assert r.getState() != ReplicaState.FINALIZED :
"Must be under-construction replica.";
blockList[pos + 3] = r.getState().getValue();
}
/**
* Set the indexTh block
* @param index - the index of the block to set
* @param b - the block is set to the value of the this Block
*/
private void setBlock(final int index, final Block b) {
int pos = index2BlockId(index);
blockList[pos] = b.getBlockId();
blockList[pos + 1] = b.getNumBytes();
blockList[pos + 2] = b.getGenerationStamp();
if(index < getNumberOfFinalizedReplicas())
return;
assert ((ReplicaInfo)b).getState() != ReplicaState.FINALIZED :
"Must be under-construction replica.";
blockList[pos + 3] = ((ReplicaInfo)b).getState().getValue();
}
/**

View File

@ -557,12 +557,12 @@ public synchronized void unfinalizeBlock(ExtendedBlock b) throws IOException{
}
synchronized BlockListAsLongs getBlockReport(String bpid) {
final List<Block> blocks = new ArrayList<Block>();
final List<Replica> blocks = new ArrayList<Replica>();
final Map<Block, BInfo> map = blockMap.get(bpid);
if (map != null) {
for (BInfo b : map.values()) {
if (b.isFinalized()) {
blocks.add(b.theBlock);
blocks.add(b);
}
}
}

View File

@ -114,7 +114,7 @@ public void testBlockHasMultipleReplicasOnSameDN() throws IOException {
}
for (int i = 0; i < cluster.getStoragesPerDatanode(); ++i) {
BlockListAsLongs bll = new BlockListAsLongs(blocks, null);
BlockListAsLongs bll = new BlockListAsLongs(blocks);
FsVolumeSpi v = dn.getFSDataset().getVolumes().get(i);
DatanodeStorage dns = new DatanodeStorage(v.getStorageID());
reports[i] = new StorageBlockReport(dns, bll.getBlockListAsLongs());

View File

@ -977,7 +977,7 @@ void formBlockReport() {
// fill remaining slots with blocks that do not exist
for(int idx = blocks.size()-1; idx >= nrBlocks; idx--)
blocks.set(idx, new Block(blocks.size() - idx, 0, 0));
blockReportList = new BlockListAsLongs(blocks,null).getBlockListAsLongs();
blockReportList = new BlockListAsLongs(blocks).getBlockListAsLongs();
}
long[] getBlockReportList() {