code: public void unprotectedConcat(String target, String [] srcs, long now) 
      throws IOException {
      if (NameNode.stateChangeLog.isDebugEnabled()) {
        NameNode.stateChangeLog.debug("DIR* FSNamesystem.concat to "+target);
      }
      // do the move
  
      INode [] trgINodes =  getExistingPathINodes(target);
      INodeFile trgInode = (INodeFile) trgINodes[trgINodes.length-1];
      INodeDirectory trgParent = (INodeDirectory)trgINodes[trgINodes.length-2];
  
      INodeFile [] allSrcInodes = new INodeFile[srcs.length];
      int i = 0;
      int totalBlocks = 0;
  
      writeLock();
      try {
        for(String src : srcs) {
          INodeFile srcInode = getFileINode(src);
          allSrcInodes[i++] = srcInode;
          totalBlocks += srcInode.getBlocks().length;
        }
        trgInode.getStorage().appendBlocks(allSrcInodes, totalBlocks, trgInode); 
        // copy the blocks
  
        // since we are in the same dir - we can use same parent to remove files
        int count = 0;
        for(INodeFile nodeToRemove: allSrcInodes) {
          if(nodeToRemove == null) continue;
  
          nodeToRemove.storage = null;
          trgParent.removeChild(nodeToRemove);
          inodeMap.remove(nodeToRemove);
          count++;
        }
        trgInode.setModificationTime(now);
        trgParent.setModificationTime(now);
        // update quota on the parent directory ('count' files removed, 0 space)
        unprotectedUpdateCount(trgINodes, trgINodes.length-1, - count, 0);
      } finally {
        writeUnlock();
      }
    }
docs: Concat all the blocks from srcs to trg and delete the srcs files
  @param target target file to move the blocks to
  @param srcs list of file to move the blocks from
  Must be public because also called from EditLogs
  NOTE: - it does not update quota (not needed for concat)