All Downloads are FREE. Search and download functionalities are using the official Maven repository.

tachyon.worker.block.BlockStoreLocation Maven / Gradle / Ivy

/*
 * Licensed to the University of California, Berkeley under one or more contributor license
 * agreements. See the NOTICE file distributed with this work for additional information regarding
 * copyright ownership. The ASF licenses this file to You under the Apache License, Version 2.0 (the
 * "License"); you may not use this file except in compliance with the License. You may obtain a
 * copy of the License at
 *
 * http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software distributed under the License
 * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
 * or implied. See the License for the specific language governing permissions and limitations under
 * the License.
 */

package tachyon.worker.block;

import java.util.Arrays;

/**
 * Where to store a block within a block store. Currently, this is a wrapper on an integer
 * representing the tier to put this block.
 */
public final class BlockStoreLocation {
  /** Special value to indicate any tier */
  private static final int ANY_TIER = -1;
  /** Special value to indicate any dir */
  private static final int ANY_DIR = -1;
  /** NOTE: only reason to have level here is to calculate StorageDirId */
  private static final int UNKNOWN_LEVEL = -1;

  /** Tier alias of the location, see {@link tachyon.StorageLevelAlias} */
  private final int mTierAlias;
  /** Tier level of the location, generally alias - 1, this is 0 indexed */
  private final int mTierLevel;
  /** Index of the directory in its tier, 0 indexed */
  private final int mDirIndex;

  /**
   * Convenience method to return the block store location representing any dir in any tier.
   *
   * @return a BlockStoreLocation of any dir in any tier
   */
  public static BlockStoreLocation anyTier() {
    return new BlockStoreLocation(ANY_TIER, UNKNOWN_LEVEL, ANY_DIR);
  }

  /**
   * Convenience method to return the block store location representing any dir in the tier.
   *
   * @param tierAlias The tier this returned block store alias will represent
   * @return a BlockStoreLocation of any dir in the specified tier
   */
  public static BlockStoreLocation anyDirInTier(int tierAlias) {
    return new BlockStoreLocation(tierAlias, UNKNOWN_LEVEL, ANY_DIR);
  }

  public BlockStoreLocation(int tierAlias, int tierLevel, int dirIndex) {
    mTierLevel = tierLevel;
    mTierAlias = tierAlias;
    mDirIndex = dirIndex;
  }

  /**
   * Gets the storage directory id of the location. The first 8 bits are tier level, next 8 are the
   * tier alias and last 16 represent the directory index.
   *
   * @return the storage directory id of the location
   */
  // TODO(gene): Remove this method when master also understands MasterBlockLocation.
  public long getStorageDirId() {
    // Calculation copied from {@link StorageDirId.getStorageDirId}
    return (mTierLevel << 24) + (mTierAlias << 16) + mDirIndex;
  }

  /**
   * Gets the tier alias of the location.
   *
   * @return the tier alias of the location, -1 for any tier
   */
  public int tierAlias() {
    return mTierAlias;
  }

  /**
   * Gets the tier level of the location.
   *
   * @return the tier level of the location, -1 for unknown level
   */
  public int tierLevel() {
    return mTierLevel;
  }

  /**
   * Gets the directory index of the location.
   *
   * @return the directory index of the location, -1 for any directory
   */
  public int dir() {
    return mDirIndex;
  }

  /**
   * Returns whether this location belongs to the specific location.
   *
   * Location A belongs to B when tier and dir of A are all in the range of B respectively.
   *
   * @param location the target BlockStoreLocation
   * @return true when this BlockStoreLocation belongs to the target, otherwise false
   */
  public boolean belongTo(BlockStoreLocation location) {
    boolean tierInRange =
        (tierAlias() == location.tierAlias()) || (location.tierAlias() == ANY_TIER);
    boolean dirInRange = (dir() == location.dir()) || (location.dir() == ANY_DIR);
    return tierInRange && dirInRange;
  }

  /**
   * Converts the location to a human readable form.
   *
   * @return a human readable string representing the information of this block store location
   */
  @Override
  public String toString() {
    StringBuilder result = new StringBuilder();
    if (mDirIndex == ANY_DIR) {
      result.append("any dir");
    } else {
      result.append("dir ").append(mDirIndex);
    }

    if (mTierAlias == ANY_TIER) {
      result.append(", any tier");
    } else {
      result.append(", tierAlias ").append(mTierAlias);
    }
    return result.toString();
  }

  /**
   * Compares to a specific object.
   *
   * @param object the object to compare
   * @return true if object is also {@link BlockStoreLocation} and represents the same tier and dir
   */
  @Override
  public boolean equals(Object object) {
    return object instanceof BlockStoreLocation
        && ((BlockStoreLocation) object).tierLevel() == tierLevel()
        && ((BlockStoreLocation) object).tierAlias() == tierAlias()
        && ((BlockStoreLocation) object).dir() == dir();
  }

  @Override
  public int hashCode() {
    return Arrays.hashCode(new Object[] {mTierLevel, mTierAlias, mDirIndex});
  }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy