LocatedBlocks.java
上传用户:quxuerui
上传日期:2018-01-08
资源大小:41811k
文件大小:6k
源码类别:

网格计算

开发平台:

Java

  1. /**
  2.  * Licensed to the Apache Software Foundation (ASF) under one
  3.  * or more contributor license agreements.  See the NOTICE file
  4.  * distributed with this work for additional information
  5.  * regarding copyright ownership.  The ASF licenses this file
  6.  * to you under the Apache License, Version 2.0 (the
  7.  * "License"); you may not use this file except in compliance
  8.  * with the License.  You may obtain a copy of the License at
  9.  *
  10.  *     http://www.apache.org/licenses/LICENSE-2.0
  11.  *
  12.  * Unless required by applicable law or agreed to in writing, software
  13.  * distributed under the License is distributed on an "AS IS" BASIS,
  14.  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  15.  * See the License for the specific language governing permissions and
  16.  * limitations under the License.
  17.  */
  18. package org.apache.hadoop.hdfs.protocol;
  19. import java.io.DataInput;
  20. import java.io.DataOutput;
  21. import java.io.IOException;
  22. import java.util.List;
  23. import java.util.ArrayList;
  24. import java.util.Collections;
  25. import java.util.Comparator;
  26. import org.apache.hadoop.io.Writable;
  27. import org.apache.hadoop.io.WritableFactories;
  28. import org.apache.hadoop.io.WritableFactory;
  29. /**
  30.  * Collection of blocks with their locations and the file length.
  31.  */
  32. public class LocatedBlocks implements Writable {
  33.   private long fileLength;
  34.   private List<LocatedBlock> blocks; // array of blocks with prioritized locations
  35.   private boolean underConstruction;
  36.   LocatedBlocks() {
  37.     fileLength = 0;
  38.     blocks = null;
  39.     underConstruction = false;
  40.   }
  41.   
  42.   public LocatedBlocks(long flength, List<LocatedBlock> blks, boolean isUnderConstuction) {
  43.     fileLength = flength;
  44.     blocks = blks;
  45.     underConstruction = isUnderConstuction;
  46.   }
  47.   
  48.   /**
  49.    * Get located blocks.
  50.    */
  51.   public List<LocatedBlock> getLocatedBlocks() {
  52.     return blocks;
  53.   }
  54.   
  55.   /**
  56.    * Get located block.
  57.    */
  58.   public LocatedBlock get(int index) {
  59.     return blocks.get(index);
  60.   }
  61.   
  62.   /**
  63.    * Get number of located blocks.
  64.    */
  65.   public int locatedBlockCount() {
  66.     return blocks == null ? 0 : blocks.size();
  67.   }
  68.   /**
  69.    * 
  70.    */
  71.   public long getFileLength() {
  72.     return this.fileLength;
  73.   }
  74.   /**
  75.    * Return ture if file was under construction when 
  76.    * this LocatedBlocks was constructed, false otherwise.
  77.    */
  78.   public boolean isUnderConstruction() {
  79.     return underConstruction;
  80.   }
  81.   
  82.   /**
  83.    * Find block containing specified offset.
  84.    * 
  85.    * @return block if found, or null otherwise.
  86.    */
  87.   public int findBlock(long offset) {
  88.     // create fake block of size 1 as a key
  89.     LocatedBlock key = new LocatedBlock();
  90.     key.setStartOffset(offset);
  91.     key.getBlock().setNumBytes(1);
  92.     Comparator<LocatedBlock> comp = 
  93.       new Comparator<LocatedBlock>() {
  94.         // Returns 0 iff a is inside b or b is inside a
  95.         public int compare(LocatedBlock a, LocatedBlock b) {
  96.           long aBeg = a.getStartOffset();
  97.           long bBeg = b.getStartOffset();
  98.           long aEnd = aBeg + a.getBlockSize();
  99.           long bEnd = bBeg + b.getBlockSize();
  100.           if(aBeg <= bBeg && bEnd <= aEnd 
  101.               || bBeg <= aBeg && aEnd <= bEnd)
  102.             return 0; // one of the blocks is inside the other
  103.           if(aBeg < bBeg)
  104.             return -1; // a's left bound is to the left of the b's
  105.           return 1;
  106.         }
  107.       };
  108.     return Collections.binarySearch(blocks, key, comp);
  109.   }
  110.   
  111.   public void insertRange(int blockIdx, List<LocatedBlock> newBlocks) {
  112.     int oldIdx = blockIdx;
  113.     int insStart = 0, insEnd = 0;
  114.     for(int newIdx = 0; newIdx < newBlocks.size() && oldIdx < blocks.size(); 
  115.                                                         newIdx++) {
  116.       long newOff = newBlocks.get(newIdx).getStartOffset();
  117.       long oldOff = blocks.get(oldIdx).getStartOffset();
  118.       if(newOff < oldOff) {
  119.         insEnd++;
  120.       } else if(newOff == oldOff) {
  121.         // replace old cached block by the new one
  122.         blocks.set(oldIdx, newBlocks.get(newIdx));
  123.         if(insStart < insEnd) { // insert new blocks
  124.           blocks.addAll(oldIdx, newBlocks.subList(insStart, insEnd));
  125.           oldIdx += insEnd - insStart;
  126.         }
  127.         insStart = insEnd = newIdx+1;
  128.         oldIdx++;
  129.       } else {  // newOff > oldOff
  130.         assert false : "List of LocatedBlock must be sorted by startOffset";
  131.       }
  132.     }
  133.     insEnd = newBlocks.size();
  134.     if(insStart < insEnd) { // insert new blocks
  135.       blocks.addAll(oldIdx, newBlocks.subList(insStart, insEnd));
  136.     }
  137.   }
  138.   
  139.   public static int getInsertIndex(int binSearchResult) {
  140.     return binSearchResult >= 0 ? binSearchResult : -(binSearchResult+1);
  141.   }
  142.   //////////////////////////////////////////////////
  143.   // Writable
  144.   //////////////////////////////////////////////////
  145.   static {                                      // register a ctor
  146.     WritableFactories.setFactory
  147.       (LocatedBlocks.class,
  148.        new WritableFactory() {
  149.          public Writable newInstance() { return new LocatedBlocks(); }
  150.        });
  151.   }
  152.   public void write(DataOutput out) throws IOException {
  153.     out.writeLong(this.fileLength);
  154.     out.writeBoolean(underConstruction);
  155.     // write located blocks
  156.     int nrBlocks = locatedBlockCount();
  157.     out.writeInt(nrBlocks);
  158.     if (nrBlocks == 0) {
  159.       return;
  160.     }
  161.     for (LocatedBlock blk : this.blocks) {
  162.       blk.write(out);
  163.     }
  164.   }
  165.   
  166.   public void readFields(DataInput in) throws IOException {
  167.     this.fileLength = in.readLong();
  168.     underConstruction = in.readBoolean();
  169.     // read located blocks
  170.     int nrBlocks = in.readInt();
  171.     this.blocks = new ArrayList<LocatedBlock>(nrBlocks);
  172.     for (int idx = 0; idx < nrBlocks; idx++) {
  173.       LocatedBlock blk = new LocatedBlock();
  174.       blk.readFields(in);
  175.       this.blocks.add(blk);
  176.     }
  177.   }
  178. }