HDFS-10764. Fix INodeFile#getBlocks to not return null. Contributed by Arpit Agarwal.

This commit is contained in:
Jing Zhao 2016-08-19 22:13:36 -07:00
parent 99603e9022
commit 0faee62a0c

View File

@ -200,8 +200,8 @@ static long toLong(long preferredBlockSize, short replication,
public INodeFile(INodeFile that) { public INodeFile(INodeFile that) {
super(that); super(that);
this.header = that.header; this.header = that.header;
this.blocks = that.blocks;
this.features = that.features; this.features = that.features;
setBlocks(that.blocks);
} }
public INodeFile(INodeFile that, FileDiffList diffs) { public INodeFile(INodeFile that, FileDiffList diffs) {
@ -271,9 +271,6 @@ void toCompleteFile(long mtime, int numCommittedAllowed, short minReplication) {
/** Assert all blocks are complete. */ /** Assert all blocks are complete. */
private void assertAllBlocksComplete(int numCommittedAllowed, private void assertAllBlocksComplete(int numCommittedAllowed,
short minReplication) { short minReplication) {
if (blocks == null) {
return;
}
for (int i = 0; i < blocks.length; i++) { for (int i = 0; i < blocks.length; i++) {
final String err = checkBlockComplete(blocks, i, numCommittedAllowed, final String err = checkBlockComplete(blocks, i, numCommittedAllowed,
minReplication); minReplication);
@ -342,7 +339,7 @@ void setLastBlock(BlockInfo blk) {
BlockInfo removeLastBlock(Block oldblock) { BlockInfo removeLastBlock(Block oldblock) {
Preconditions.checkState(isUnderConstruction(), Preconditions.checkState(isUnderConstruction(),
"file is no longer under construction"); "file is no longer under construction");
if (blocks == null || blocks.length == 0) { if (blocks.length == 0) {
return null; return null;
} }
int size_1 = blocks.length - 1; int size_1 = blocks.length - 1;
@ -618,7 +615,7 @@ void concatBlocks(INodeFile[] inodes, BlockManager bm) {
*/ */
void addBlock(BlockInfo newblock) { void addBlock(BlockInfo newblock) {
Preconditions.checkArgument(newblock.isStriped() == this.isStriped()); Preconditions.checkArgument(newblock.isStriped() == this.isStriped());
if (this.blocks == null) { if (this.blocks.length == 0) {
this.setBlocks(new BlockInfo[]{newblock}); this.setBlocks(new BlockInfo[]{newblock});
} else { } else {
int size = this.blocks.length; int size = this.blocks.length;
@ -631,12 +628,12 @@ void addBlock(BlockInfo newblock) {
/** Set the blocks. */ /** Set the blocks. */
private void setBlocks(BlockInfo[] blocks) { private void setBlocks(BlockInfo[] blocks) {
this.blocks = blocks; this.blocks = (blocks != null ? blocks : BlockInfo.EMPTY_ARRAY);
} }
/** Clear all blocks of the file. */ /** Clear all blocks of the file. */
public void clearBlocks() { public void clearBlocks() {
setBlocks(BlockInfo.EMPTY_ARRAY); this.blocks = BlockInfo.EMPTY_ARRAY;
} }
@Override @Override
@ -836,7 +833,7 @@ public final long computeFileSizeNotIncludingLastUcBlock() {
*/ */
public final long computeFileSize(boolean includesLastUcBlock, public final long computeFileSize(boolean includesLastUcBlock,
boolean usePreferredBlockSize4LastUcBlock) { boolean usePreferredBlockSize4LastUcBlock) {
if (blocks == null || blocks.length == 0) { if (blocks.length == 0) {
return 0; return 0;
} }
final int last = blocks.length - 1; final int last = blocks.length - 1;
@ -876,10 +873,6 @@ public final QuotaCounts storagespaceConsumed(BlockStoragePolicy bsp) {
// TODO: support EC with heterogeneous storage // TODO: support EC with heterogeneous storage
public final QuotaCounts storagespaceConsumedStriped() { public final QuotaCounts storagespaceConsumedStriped() {
QuotaCounts counts = new QuotaCounts.Builder().build(); QuotaCounts counts = new QuotaCounts.Builder().build();
if (blocks == null || blocks.length == 0) {
return counts;
}
for (BlockInfo b : blocks) { for (BlockInfo b : blocks) {
Preconditions.checkState(b.isStriped()); Preconditions.checkState(b.isStriped());
long blockSize = b.isComplete() ? long blockSize = b.isComplete() ?
@ -931,7 +924,7 @@ public final QuotaCounts storagespaceConsumedContiguous(
* Return the penultimate allocated block for this file. * Return the penultimate allocated block for this file.
*/ */
BlockInfo getPenultimateBlock() { BlockInfo getPenultimateBlock() {
if (blocks == null || blocks.length <= 1) { if (blocks.length <= 1) {
return null; return null;
} }
return blocks[blocks.length - 2]; return blocks[blocks.length - 2];
@ -939,12 +932,12 @@ BlockInfo getPenultimateBlock() {
@Override @Override
public BlockInfo getLastBlock() { public BlockInfo getLastBlock() {
return blocks == null || blocks.length == 0? null: blocks[blocks.length-1]; return blocks.length == 0 ? null: blocks[blocks.length-1];
} }
@Override @Override
public int numBlocks() { public int numBlocks() {
return blocks == null ? 0 : blocks.length; return blocks.length;
} }
@VisibleForTesting @VisibleForTesting
@ -955,7 +948,7 @@ public void dumpTreeRecursively(PrintWriter out, StringBuilder prefix,
out.print(", fileSize=" + computeFileSize(snapshotId)); out.print(", fileSize=" + computeFileSize(snapshotId));
// only compare the first block // only compare the first block
out.print(", blocks="); out.print(", blocks=");
out.print(blocks == null || blocks.length == 0? null: blocks[0]); out.print(blocks.length == 0 ? null: blocks[0]);
out.println(); out.println();
} }
@ -1004,7 +997,7 @@ void computeQuotaDeltaForTruncate(
long newLength, BlockStoragePolicy bsps, long newLength, BlockStoragePolicy bsps,
QuotaCounts delta) { QuotaCounts delta) {
final BlockInfo[] blocks = getBlocks(); final BlockInfo[] blocks = getBlocks();
if (blocks == null || blocks.length == 0) { if (blocks.length == 0) {
return; return;
} }