/** @return true if all of the blocks in this file are marked as completed. */
 private boolean allBlocksComplete() throws StorageException, TransactionContextException {
   for (BlockInfo b : getBlocks()) {
     if (!b.isComplete()) {
       return false;
     }
   }
   return true;
 }
 /**
  * Update the length for the last block
  *
  * @param lastBlockLength The length of the last block reported from client
  * @throws IOException
  */
 void updateLengthOfLastBlock(long lastBlockLength) throws IOException, StorageException {
   BlockInfo lastBlock = this.getLastBlock();
   assert (lastBlock != null)
       : "The last block for path " + this.getFullPathName() + " is null when updating its length";
   assert (lastBlock instanceof BlockInfoUnderConstruction)
       : "The last block for path "
           + this.getFullPathName()
           + " is not a BlockInfoUnderConstruction when updating its length";
   lastBlock.setNumBytes(lastBlockLength);
 }
  public void removeBlock(BlockInfo block) throws StorageException, TransactionContextException {
    BlockInfo[] blks = getBlocks();
    int index = block.getBlockIndex();

    block.setBlockCollection(null);

    if (index != blks.length) {
      for (int i = index + 1; i < blks.length; i++) {
        blks[i].setBlockIndex(i - 1);
      }
    }
  }
 /** Convert the last block of the file to an under-construction block. Set its locations. */
 @Override
 public BlockInfoUnderConstruction setLastBlock(BlockInfo lastBlock, DatanodeDescriptor[] targets)
     throws IOException, StorageException {
   if (numBlocks() == 0) {
     throw new IOException("Failed to set last block: File is empty.");
   }
   BlockInfoUnderConstruction ucBlock =
       lastBlock.convertToBlockUnderConstruction(BlockUCState.UNDER_CONSTRUCTION, targets);
   ucBlock.setBlockCollection(this);
   setBlock(numBlocks() - 1, ucBlock);
   return ucBlock;
 }