INodeMap

INodeMap利用LightWeightGSet来存储INode对象,为什么可以存储INode ID和INode的映射呢?因为INode的equals和hashCode方法都已经重载,并且只根据id判断,那么知道id之后,其它字段为空的Inode对象,就可以得到映射的对象。equals和hashCode 方法如下:

  @Override
  public final boolean equals(Object that) {
    if (this == that) {
      return true;
    }
    if (that == null || !(that instanceof INode)) {
      return false;
    }
    return getId() == ((INode) that).getId();
  }

  @Override
  public final int hashCode() {
    long id = getId();
    return (int)(id^(id>>>32));  
  }

INodeMap的源代码:

/**
 * Storing all the {@link INode}s and maintaining the mapping between INode ID
 * and INode.  
 */
public class INodeMap {
  
  static INodeMap newInstance(INodeDirectory rootDir) {
    // Compute the map capacity by allocating 1% of total memory
    int capacity = LightWeightGSet.computeCapacity(1, "INodeMap");
    GSet<INode, INodeWithAdditionalFields> map
        = new LightWeightGSet<INode, INodeWithAdditionalFields>(capacity);
    map.put(rootDir);
    return new INodeMap(map);
  }
  
  /** Synchronized by external lock. */
  private final GSet<INode, INodeWithAdditionalFields> map;
  
  public Iterator<INodeWithAdditionalFields> getMapIterator() {
    return map.iterator();
  }

  private INodeMap(GSet<INode, INodeWithAdditionalFields> map) {
    Preconditions.checkArgument(map != null);
    this.map = map;
  }
  
  /**
   * Add an {@link INode} into the {@link INode} map. Replace the old value if 
   * necessary. 
   * @param inode The {@link INode} to be added to the map.
   */
  public final void put(INode inode) {
    if (inode instanceof INodeWithAdditionalFields) {
      map.put((INodeWithAdditionalFields)inode);
    }
  }
  
  /**
   * Remove a {@link INode} from the map.
   * @param inode The {@link INode} to be removed.
   */
  public final void remove(INode inode) {
    map.remove(inode);
  }
  
  /**
   * @return The size of the map.
   */
  public int size() {
    return map.size();
  }
  
  /**
   * Get the {@link INode} with the given id from the map.
   * @param id ID of the {@link INode}.
   * @return The {@link INode} in the map with the given id. Return null if no 
   *         such {@link INode} in the map.
   */
  public INode get(long id) {
    INode inode = new INodeWithAdditionalFields(id, null, new PermissionStatus(
        "", "", new FsPermission((short) 0)), 0, 0) {
      
      @Override
      void recordModification(int latestSnapshotId)
          throws QuotaExceededException {
      }
      
      @Override
      public void destroyAndCollectBlocks(BlocksMapUpdateInfo collectedBlocks,
          List<INode> removedINodes) {
        // Nothing to do
      }
      
      @Override
      public Counts computeQuotaUsage(Counts counts, boolean useCache,
          int lastSnapshotId) {
        return null;
      }
      
      @Override
      public ContentSummaryComputationContext computeContentSummary(
          ContentSummaryComputationContext summary) {
        return null;
      }
      
      @Override
      public Counts cleanSubtree(int snapshotId, int priorSnapshotId,
          BlocksMapUpdateInfo collectedBlocks, List<INode> removedINodes,
          boolean countDiffChange) throws QuotaExceededException {
        return null;
      }

      @Override
      public byte getStoragePolicyID(){
        return BlockStoragePolicySuite.ID_UNSPECIFIED;
      }

      @Override
      public byte getLocalStoragePolicyID() {
        return BlockStoragePolicySuite.ID_UNSPECIFIED;
      }
    };
      
    return map.get(inode);
  }
  
  /**
   * Clear the {@link #map}
   */
  public void clear() {
    map.clear();
  }
}




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值