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

网格计算

开发平台:

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. /**
  20.  * This class provides an interface for accessing list of blocks that
  21.  * has been implemented as long[].
  22.  * This class is usefull for block report. Rather than send block reports
  23.  * as a Block[] we can send it as a long[].
  24.  *
  25.  */
  26. public class BlockListAsLongs {
  27.   /**
  28.    * A block as 3 longs
  29.    *   block-id and block length and generation stamp
  30.    */
  31.   private static final int LONGS_PER_BLOCK = 3;
  32.   
  33.   private static int index2BlockId(int index) {
  34.     return index*LONGS_PER_BLOCK;
  35.   }
  36.   private static int index2BlockLen(int index) {
  37.     return (index*LONGS_PER_BLOCK) + 1;
  38.   }
  39.   private static int index2BlockGenStamp(int index) {
  40.     return (index*LONGS_PER_BLOCK) + 2;
  41.   }
  42.   
  43.   private long[] blockList;
  44.   
  45.   /**
  46.    * Converting a block[] to a long[]
  47.    * @param blockArray - the input array block[]
  48.    * @return the output array of long[]
  49.    */
  50.   
  51.   public static long[] convertToArrayLongs(final Block[] blockArray) {
  52.     long[] blocksAsLongs = new long[blockArray.length * LONGS_PER_BLOCK];
  53.     BlockListAsLongs bl = new BlockListAsLongs(blocksAsLongs);
  54.     assert bl.getNumberOfBlocks() == blockArray.length;
  55.     for (int i = 0; i < blockArray.length; i++) {
  56.       bl.setBlock(i, blockArray[i]);
  57.     }
  58.     return blocksAsLongs;
  59.   }
  60.   /**
  61.    * Constructor
  62.    * @param iBlockList - BlockListALongs create from this long[] parameter
  63.    */
  64.   public BlockListAsLongs(final long[] iBlockList) {
  65.     if (iBlockList == null) {
  66.       blockList = new long[0];
  67.     } else {
  68.       if (iBlockList.length%LONGS_PER_BLOCK != 0) {
  69.         // must be multiple of LONGS_PER_BLOCK
  70.         throw new IllegalArgumentException();
  71.       }
  72.       blockList = iBlockList;
  73.     }
  74.   }
  75.   
  76.   /**
  77.    * The number of blocks
  78.    * @return - the number of blocks
  79.    */
  80.   public int getNumberOfBlocks() {
  81.     return blockList.length/LONGS_PER_BLOCK;
  82.   }
  83.   
  84.   
  85.   /**
  86.    * The block-id of the indexTh block
  87.    * @param index - the block whose block-id is desired
  88.    * @return the block-id
  89.    */
  90.   public long getBlockId(final int index)  {
  91.     return blockList[index2BlockId(index)];
  92.   }
  93.   
  94.   /**
  95.    * The block-len of the indexTh block
  96.    * @param index - the block whose block-len is desired
  97.    * @return - the block-len
  98.    */
  99.   public long getBlockLen(final int index)  {
  100.     return blockList[index2BlockLen(index)];
  101.   }
  102.   /**
  103.    * The generation stamp of the indexTh block
  104.    * @param index - the block whose block-len is desired
  105.    * @return - the generation stamp
  106.    */
  107.   public long getBlockGenStamp(final int index)  {
  108.     return blockList[index2BlockGenStamp(index)];
  109.   }
  110.   
  111.   /**
  112.    * Set the indexTh block
  113.    * @param index - the index of the block to set
  114.    * @param b - the block is set to the value of the this block
  115.    */
  116.   void setBlock(final int index, final Block b) {
  117.     blockList[index2BlockId(index)] = b.getBlockId();
  118.     blockList[index2BlockLen(index)] = b.getNumBytes();
  119.     blockList[index2BlockGenStamp(index)] = b.getGenerationStamp();
  120.   }
  121. }