svn merge -c 1341141 from trunk for HDFS-3394. Do not use generic in INodeFile.getLastBlock(): the run-time ClassCastException check is useless since generic type information is only available in compile-time.

git-svn-id: https://svn.apache.org/repos/asf/hadoop/common/branches/branch-2@1341143 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
Tsz-wo Sze 2012-05-21 18:55:26 +00:00
parent 1c65990dae
commit 8ba8542cde
7 changed files with 55 additions and 79 deletions

View File

@ -48,7 +48,11 @@ Release 2.0.1-alpha - UNRELEASED
(todd)
HDFS-2885. Remove "federation" from the nameservice config options.
(Tsz Wo (Nicholas) via eli)
(Tsz Wo (Nicholas) Sze via eli)
HDFS-3394. Do not use generic in INodeFile.getLastBlock(): the run-time
ClassCastException check is useless since generic type information is only
available in compile-time. (szetszwo)
OPTIMIZATIONS

View File

@ -19,9 +19,6 @@ package org.apache.hadoop.hdfs.server.blockmanagement;
import java.io.IOException;
import org.apache.hadoop.hdfs.server.blockmanagement.BlockInfoUnderConstruction;
import org.apache.hadoop.hdfs.server.blockmanagement.BlockInfo;
import org.apache.hadoop.hdfs.server.blockmanagement.DatanodeDescriptor;
import org.apache.hadoop.fs.ContentSummary;
/**
@ -31,19 +28,24 @@ import org.apache.hadoop.fs.ContentSummary;
public interface BlockCollection {
/**
* Get the last block of the collection.
* Make sure it has the right type.
*/
public <T extends BlockInfo> T getLastBlock() throws IOException;
public BlockInfo getLastBlock() throws IOException;
/**
* Get content summary.
*/
public ContentSummary computeContentSummary();
/** @return the number of blocks */
/**
* @return the number of blocks
*/
public int numBlocks();
/**
* Get the blocks.
*/
public BlockInfo[] getBlocks();
/**
* Get preferred block size for the collection
* @return preferred block size in bytes
@ -57,7 +59,7 @@ public interface BlockCollection {
public short getReplication();
/**
* Get name of collection.
* Get the name of the collection.
*/
public String getName();
}

View File

@ -439,7 +439,7 @@ public class BlockManager {
* @throws IOException if the block does not have at least a minimal number
* of replicas reported from data-nodes.
*/
private boolean commitBlock(final BlockInfoUnderConstruction block,
private static boolean commitBlock(final BlockInfoUnderConstruction block,
final Block commitBlock) throws IOException {
if (block.getBlockUCState() == BlockUCState.COMMITTED)
return false;

View File

@ -19,26 +19,20 @@ package org.apache.hadoop.hdfs.server.blockmanagement;
import java.io.IOException;
import org.apache.hadoop.classification.InterfaceAudience;
import org.apache.hadoop.hdfs.server.blockmanagement.BlockInfoUnderConstruction;
import org.apache.hadoop.hdfs.server.blockmanagement.BlockInfo;
import org.apache.hadoop.hdfs.server.blockmanagement.DatanodeDescriptor;
import org.apache.hadoop.fs.ContentSummary;
/**
* This interface is used by the block manager to expose a
* few characteristics of a collection of Block/BlockUnderConstruction.
*/
public interface MutableBlockCollection extends BlockCollection {
/**
* Set block
* Set the block at the given index.
*/
public void setBlock(int idx, BlockInfo blk);
public void setBlock(int index, BlockInfo blk);
/**
* Convert the last block of the collection to an under-construction block.
* Set its locations.
* Convert the last block of the collection to an under-construction block
* and set the locations.
*/
public BlockInfoUnderConstruction setLastBlock(BlockInfo lastBlock,
DatanodeDescriptor[] targets) throws IOException;
DatanodeDescriptor[] locations) throws IOException;
}

View File

@ -2768,9 +2768,9 @@ public class FSNamesystem implements Namesystem, FSClusterStats,
throw new IOException(message);
}
// no we know that the last block is not COMPLETE, and
// The last block is not COMPLETE, and
// that the penultimate block if exists is either COMPLETE or COMMITTED
BlockInfoUnderConstruction lastBlock = pendingFile.getLastBlock();
final BlockInfo lastBlock = pendingFile.getLastBlock();
BlockUCState lastBlockState = lastBlock.getBlockUCState();
BlockInfo penultimateBlock = pendingFile.getPenultimateBlock();
boolean penultimateBlockMinReplication;
@ -2814,13 +2814,15 @@ public class FSNamesystem implements Namesystem, FSClusterStats,
throw new AlreadyBeingCreatedException(message);
case UNDER_CONSTRUCTION:
case UNDER_RECOVERY:
final BlockInfoUnderConstruction uc = (BlockInfoUnderConstruction)lastBlock;
// setup the last block locations from the blockManager if not known
if(lastBlock.getNumExpectedLocations() == 0)
lastBlock.setExpectedLocations(blockManager.getNodes(lastBlock));
if (uc.getNumExpectedLocations() == 0) {
uc.setExpectedLocations(blockManager.getNodes(lastBlock));
}
// start recovery of the last block for this file
long blockRecoveryId = nextGenerationStamp();
lease = reassignLease(lease, src, recoveryLeaseHolder, pendingFile);
lastBlock.initializeBlockRecovery(blockRecoveryId);
uc.initializeBlockRecovery(blockRecoveryId);
leaseManager.renewLease(lease);
// Cannot close file right now, since the last block requires recovery.
// This may potentially cause infinite loop in lease recovery
@ -4557,15 +4559,16 @@ public class FSNamesystem implements Namesystem, FSClusterStats,
LOG.info("updatePipeline(" + oldBlock + ") successfully to " + newBlock);
}
/** @see updatePipeline(String, ExtendedBlock, ExtendedBlock, DatanodeID[]) */
/** @see #updatePipeline(String, ExtendedBlock, ExtendedBlock, DatanodeID[]) */
private void updatePipelineInternal(String clientName, ExtendedBlock oldBlock,
ExtendedBlock newBlock, DatanodeID[] newNodes)
throws IOException {
assert hasWriteLock();
// check the vadility of the block and lease holder name
final INodeFileUnderConstruction pendingFile =
checkUCBlock(oldBlock, clientName);
final BlockInfoUnderConstruction blockinfo = pendingFile.getLastBlock();
final INodeFileUnderConstruction pendingFile
= checkUCBlock(oldBlock, clientName);
final BlockInfoUnderConstruction blockinfo
= (BlockInfoUnderConstruction)pendingFile.getLastBlock();
// check new GS & length: this is not expected
if (newBlock.getGenerationStamp() <= blockinfo.getGenerationStamp() ||

View File

@ -177,14 +177,14 @@ abstract class INode implements Comparable<byte[]> {
return (short)PermissionStatusFormat.MODE.retrieve(permission);
}
/** Set the {@link FsPermission} of this {@link INode} */
protected void setPermission(FsPermission permission) {
void setPermission(FsPermission permission) {
updatePermissionStatus(PermissionStatusFormat.MODE, permission.toShort());
}
/**
* Check whether it's a directory
*/
public abstract boolean isDirectory();
abstract boolean isDirectory();
/**
* Collect all the blocks in all children of this INode.

View File

@ -41,9 +41,9 @@ public class INodeFile extends INode implements BlockCollection {
//Format: [16 bits for replication][48 bits for PreferredBlockSize]
static final long HEADERMASK = 0xffffL << BLOCKBITS;
protected long header;
private long header;
protected BlockInfo blocks[] = null;
BlockInfo blocks[] = null;
INodeFile(PermissionStatus permissions,
int nrBlocks, short replication, long modificationTime,
@ -52,12 +52,7 @@ public class INodeFile extends INode implements BlockCollection {
modificationTime, atime, preferredBlockSize);
}
protected INodeFile() {
blocks = null;
header = 0;
}
protected INodeFile(PermissionStatus permissions, BlockInfo[] blklist,
INodeFile(PermissionStatus permissions, BlockInfo[] blklist,
short replication, long modificationTime,
long atime, long preferredBlockSize) {
super(permissions, modificationTime, atime);
@ -71,47 +66,40 @@ public class INodeFile extends INode implements BlockCollection {
* Since this is a file,
* the {@link FsAction#EXECUTE} action, if any, is ignored.
*/
protected void setPermission(FsPermission permission) {
void setPermission(FsPermission permission) {
super.setPermission(permission.applyUMask(UMASK));
}
public boolean isDirectory() {
boolean isDirectory() {
return false;
}
/**
* Get block replication for the file
* @return block replication value
*/
/** @return the replication factor of the file. */
@Override
public short getReplication() {
return (short) ((header & HEADERMASK) >> BLOCKBITS);
}
public void setReplication(short replication) {
void setReplication(short replication) {
if(replication <= 0)
throw new IllegalArgumentException("Unexpected value for the replication");
header = ((long)replication << BLOCKBITS) | (header & ~HEADERMASK);
}
/**
* Get preferred block size for the file
* @return preferred block size in bytes
*/
/** @return preferred block size (in bytes) of the file. */
@Override
public long getPreferredBlockSize() {
return header & ~HEADERMASK;
return header & ~HEADERMASK;
}
public void setPreferredBlockSize(long preferredBlkSize)
{
private void setPreferredBlockSize(long preferredBlkSize) {
if((preferredBlkSize < 0) || (preferredBlkSize > ~HEADERMASK ))
throw new IllegalArgumentException("Unexpected value for the block size");
header = (header & HEADERMASK) | (preferredBlkSize & ~HEADERMASK);
}
/**
* Get file blocks
* @return file blocks
*/
/** @return the blocks of the file. */
@Override
public BlockInfo[] getBlocks() {
return this.blocks;
}
@ -152,9 +140,7 @@ public class INodeFile extends INode implements BlockCollection {
}
}
/**
* Set file block
*/
/** Set the block of the file at the given index. */
public void setBlock(int idx, BlockInfo blk) {
this.blocks[idx] = blk;
}
@ -171,6 +157,7 @@ public class INodeFile extends INode implements BlockCollection {
return 1;
}
@Override
public String getName() {
// Get the full path name of this inode.
return getFullPathName();
@ -215,7 +202,7 @@ public class INodeFile extends INode implements BlockCollection {
return diskspaceConsumed(blocks);
}
long diskspaceConsumed(Block[] blkArr) {
private long diskspaceConsumed(Block[] blkArr) {
long size = 0;
if(blkArr == null)
return 0;
@ -245,26 +232,12 @@ public class INodeFile extends INode implements BlockCollection {
return blocks[blocks.length - 2];
}
/**
* Get the last block of the file.
* Make sure it has the right type.
*/
public <T extends BlockInfo> T getLastBlock() throws IOException {
if (blocks == null || blocks.length == 0)
return null;
T returnBlock = null;
try {
@SuppressWarnings("unchecked") // ClassCastException is caught below
T tBlock = (T)blocks[blocks.length - 1];
returnBlock = tBlock;
} catch(ClassCastException cce) {
throw new IOException("Unexpected last block type: "
+ blocks[blocks.length - 1].getClass().getSimpleName());
}
return returnBlock;
@Override
public BlockInfo getLastBlock() throws IOException {
return blocks == null || blocks.length == 0? null: blocks[blocks.length-1];
}
/** @return the number of blocks */
@Override
public int numBlocks() {
return blocks == null ? 0 : blocks.length;
}