예제 #1
0
  /**
   * Checks whether a block is sufficiently replicated for decommissioning. Full-strength
   * replication is not always necessary, hence "sufficient".
   *
   * @return true if sufficient, else false.
   */
  private boolean isSufficientlyReplicated(
      BlockInfo block, BlockCollection bc, NumberReplicas numberReplicas) {
    final int numExpected = bc.getPreferredBlockReplication();
    final int numLive = numberReplicas.liveReplicas();
    if (!blockManager.isNeededReplication(block, numExpected, numLive)) {
      // Block doesn't need replication. Skip.
      LOG.trace("Block {} does not need replication.", block);
      return true;
    }

    // Block is under-replicated
    LOG.trace("Block {} numExpected={}, numLive={}", block, numExpected, numLive);
    if (numExpected > numLive) {
      if (bc.isUnderConstruction() && block.equals(bc.getLastBlock())) {
        // Can decom a UC block as long as there will still be minReplicas
        if (numLive >= blockManager.minReplication) {
          LOG.trace(
              "UC block {} sufficiently-replicated since numLive ({}) " + ">= minR ({})",
              block,
              numLive,
              blockManager.minReplication);
          return true;
        } else {
          LOG.trace(
              "UC block {} insufficiently-replicated since numLive " + "({}) < minR ({})",
              block,
              numLive,
              blockManager.minReplication);
        }
      } else {
        // Can decom a non-UC as long as the default replication is met
        if (numLive >= blockManager.defaultReplication) {
          return true;
        }
      }
    }
    return false;
  }