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 HDFS-6609. Use DirectorySnapshottableFeature to represent a snapshottable
directory. (Jing Zhao via wheat9) 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 OPTIMIZATIONS
BUG FIXES BUG FIXES

View File

@ -25,7 +25,7 @@ import com.google.common.annotations.VisibleForTesting;
import org.apache.hadoop.classification.InterfaceAudience; import org.apache.hadoop.classification.InterfaceAudience;
import org.apache.hadoop.classification.InterfaceStability; import org.apache.hadoop.classification.InterfaceStability;
import org.apache.hadoop.hdfs.server.common.HdfsServerConstants.ReplicaState; 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 * This class provides an interface for accessing list of blocks that
@ -85,8 +85,8 @@ public class BlockListAsLongs implements Iterable<Block> {
* @param finalized - list of finalized blocks * @param finalized - list of finalized blocks
* @param uc - list of under construction blocks * @param uc - list of under construction blocks
*/ */
public BlockListAsLongs(final List<? extends Block> finalized, public BlockListAsLongs(final List<? extends Replica> finalized,
final List<ReplicaInfo> uc) { final List<? extends Replica> uc) {
int finalizedSize = finalized == null ? 0 : finalized.size(); int finalizedSize = finalized == null ? 0 : finalized.size();
int ucSize = uc == null ? 0 : uc.size(); int ucSize = uc == null ? 0 : uc.size();
int len = HEADER_SIZE int len = HEADER_SIZE
@ -113,8 +113,34 @@ public class BlockListAsLongs implements Iterable<Block> {
} }
} }
/**
* 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() { public BlockListAsLongs() {
this(null); this((long[])null);
} }
/** /**
@ -279,18 +305,30 @@ public class BlockListAsLongs implements Iterable<Block> {
/** /**
* Set the indexTh block * Set the indexTh block
* @param index - the index of the block to set * @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); int pos = index2BlockId(index);
blockList[pos] = b.getBlockId(); blockList[pos] = b.getBlockId();
blockList[pos + 1] = b.getNumBytes(); blockList[pos + 1] = b.getNumBytes();
blockList[pos + 2] = b.getGenerationStamp(); 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 class SimulatedFSDataset implements FsDatasetSpi<FsVolumeSpi> {
} }
synchronized BlockListAsLongs getBlockReport(String bpid) { 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); final Map<Block, BInfo> map = blockMap.get(bpid);
if (map != null) { if (map != null) {
for (BInfo b : map.values()) { for (BInfo b : map.values()) {
if (b.isFinalized()) { if (b.isFinalized()) {
blocks.add(b.theBlock); blocks.add(b);
} }
} }
} }

View File

@ -114,7 +114,7 @@ public class TestBlockHasMultipleReplicasOnSameDN {
} }
for (int i = 0; i < cluster.getStoragesPerDatanode(); ++i) { 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); FsVolumeSpi v = dn.getFSDataset().getVolumes().get(i);
DatanodeStorage dns = new DatanodeStorage(v.getStorageID()); DatanodeStorage dns = new DatanodeStorage(v.getStorageID());
reports[i] = new StorageBlockReport(dns, bll.getBlockListAsLongs()); reports[i] = new StorageBlockReport(dns, bll.getBlockListAsLongs());

View File

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