DataNode节点的数据块管理(2)

    为了让存储目录的子目录存储的数据块达到负载均衡,FSDir使用了lastChildIdx来循环的选择子目录存储数据块。

[java]

    public File addBlock(Block b, File src) throws IOException {         //First try without creating subdirectories          File file = addBlock(b, src, falsefalse);                   return (file != null) ? file : addBlock(b, src, truetrue);       }          private File addBlock(Block b, File src, boolean createOk,  boolean resetIdx) throws IOException {         //直接将数据块保存到当前主目录下          if (numBlocks < maxBlocksPerDir) {           File dest = new File(dir, b.getBlockName());           File metaData = getMetaFile( src, b );           File newmeta = getMetaFile(dest, b);                      if ( ! metaData.renameTo( newmeta ) || ! src.renameTo( dest ) ) {             throw new IOException( "could not move files for " + b + " from tmp to " + dest.getAbsolutePath() );           }                      if (DataNode.LOG.isDebugEnabled()) {             DataNode.LOG.debug("addBlock: Moved " + metaData + " to " + newmeta);             DataNode.LOG.debug("addBlock: Moved " + src + " to " + dest);           }           //当前主目录存储的数据块加1                    numBlocks += 1;            return dest;         }                        if (lastChildIdx < 0 && resetIdx) {           //reset so that all children will be checked            lastChildIdx = random.nextInt(children.length);                       }                        if (lastChildIdx >= 0 && children != null) {           //Check if any child-tree has room for a block.            for (int i=0; i < children.length; i++) {             int idx = (lastChildIdx + i)%children.length;             File file = children[idx].addBlock(b, src, false, resetIdx);             if (file != null) {               lastChildIdx = idx;               return file;             }           }           lastChildIdx = -1;         }                        if (!createOk) {           return null;         }         //在当前主目录下创建若干个子目录来存储数据块    <pre name="code" class="java">      if (children == null || children.length == 0) {           children = new FSDir[maxBlocksPerDir];           for (int idx = 0; idx < maxBlocksPerDir; idx++) {             children[idx] = new FSDir(new File(dir, DataStorage.BLOCK_SUBDIR_PREFIX+idx));           }         }                        //now pick a child randomly for creating a new set of subdirs.          lastChildIdx = random.nextInt(children.length);         return children[ lastChildIdx ].addBlock(b, src, truefalse);       }  

2.从数据块对应的元数据文件名中解析文件的时间戳

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:http://www.heiqu.com/37c5b2eab7a6bb578b9a621809ec70bf.html