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

alluxio.master.block.BlockMaster Maven / Gradle / Ivy

The newest version!
/*
 * The Alluxio Open Foundation licenses this work under the Apache License, version 2.0
 * (the "License"). You may not use this work except in compliance with the License, which is
 * available at www.apache.org/licenses/LICENSE-2.0
 *
 * This software is distributed on an "AS IS" basis, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND,
 * either express or implied, as more fully set forth in the License.
 *
 * See the NOTICE file distributed with this work for information regarding copyright ownership.
 */

package alluxio.master.block;

import alluxio.StorageTierAssoc;
import alluxio.client.block.options.GetWorkerReportOptions;
import alluxio.exception.BlockInfoException;
import alluxio.exception.status.InvalidArgumentException;
import alluxio.exception.status.NotFoundException;
import alluxio.exception.status.UnavailableException;
import alluxio.grpc.Command;
import alluxio.grpc.ConfigProperty;
import alluxio.grpc.DecommissionWorkerPOptions;
import alluxio.grpc.GetRegisterLeasePRequest;
import alluxio.grpc.RegisterWorkerPOptions;
import alluxio.grpc.RegisterWorkerPRequest;
import alluxio.grpc.RemoveDisabledWorkerPOptions;
import alluxio.grpc.StorageList;
import alluxio.grpc.WorkerLostStorageInfo;
import alluxio.master.Master;
import alluxio.master.block.meta.MasterWorkerInfo;
import alluxio.master.journal.JournalContext;
import alluxio.metrics.Metric;
import alluxio.proto.meta.Block;
import alluxio.wire.Address;
import alluxio.wire.BlockInfo;
import alluxio.wire.RegisterLease;
import alluxio.wire.WorkerInfo;
import alluxio.wire.WorkerNetAddress;

import com.google.common.annotations.VisibleForTesting;

import java.time.Clock;
import java.util.Collection;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Optional;
import java.util.Set;
import java.util.function.BiConsumer;
import java.util.function.Consumer;

/**
 * Interface of the block master that manages the metadata for all the blocks and block workers in
 * Alluxio.
 */
public interface BlockMaster extends Master, ContainerIdGenerable {
  /**
   * @return the number of live workers
   */
  int getWorkerCount();

  /**
   * @return the number of lost workers
   */
  int getLostWorkerCount();

  /**
   * @return the number of decommissioned workers
   */
  int getDecommissionedWorkerCount();

  /**
   * @return the total capacity (in bytes) on all tiers, on all workers of Alluxio
   */
  long getCapacityBytes();

  /**
   * @return the unique block count on all workers of Alluxio
   */
  long getUniqueBlockCount();

  /**
   * @return the replica block count on all workers of Alluxio
   */
  long getBlockReplicaCount();

  /**
   * @return the global storage tier mapping
   */
  StorageTierAssoc getGlobalStorageTierAssoc();

  /**
   * @return the total used bytes on all tiers, on all workers of Alluxio
   */
  long getUsedBytes();

  /**
   * @return a list of {@link WorkerInfo} objects representing the live workers in Alluxio
   */
  List getWorkerInfoList() throws UnavailableException;

  /**
   * @return a list of {@link WorkerInfo}s of lost workers
   */
  List getLostWorkersInfoList() throws UnavailableException;

  /**
   * @return a set of live worker addresses
   */
  Set getWorkerAddresses() throws UnavailableException;

  /**
   * Gets the worker information list for report CLI.
   *
   * @param options the GetWorkerReportOptions defines the info range
   * @return a list of {@link WorkerInfo} objects representing the workers in Alluxio
   */
  List getWorkerReport(GetWorkerReportOptions options)
      throws UnavailableException, InvalidArgumentException;

  /**
   * @return a list of worker lost storage information
   */
  List getWorkerLostStorage();

  /**
   * @param address worker address to check
   * @return true if the worker is excluded, otherwise false
   */
  boolean isRejected(WorkerNetAddress address);

  /**
   * Decommission a worker.
   *
   * @param requestOptions the request
   */
  void decommissionWorker(DecommissionWorkerPOptions requestOptions) throws NotFoundException;

  /**
   * Removes blocks from workers.
   *
   * @param blockIds a list of block ids to remove from Alluxio space
   * @param delete whether to delete blocks' metadata in Master
   */
  void removeBlocks(Collection blockIds, boolean delete) throws UnavailableException;

  /**
   * Marks a block as committed on a specific worker.
   *
   * @param workerId the worker id committing the block
   * @param usedBytesOnTier the updated used bytes on the tier of the worker
   * @param tierAlias the alias of the storage tier where the worker is committing the block to
   * @param mediumType the medium type where the worker is committing the block to
   * @param blockId the committing block id
   * @param length the length of the block
   * @throws NotFoundException if the workerId is not active
   */
  // TODO(binfan): check the logic is correct or not when commitBlock is a retry
  void commitBlock(long workerId, long usedBytesOnTier, String tierAlias,
      String mediumType, long blockId, long length)
      throws NotFoundException, UnavailableException;

  /**
   * Marks a block as committed, but without a worker location. This means the block is only in ufs.
   *
   * @param blockId the id of the block to commit
   * @param length the length of the block
   */
  default void commitBlockInUFS(long blockId, long length) throws UnavailableException {
    try (JournalContext journalContext = createJournalContext()) {
      commitBlockInUFS(blockId, length, journalContext);
    }
  }

  /**
   * Marks a block as committed, but without a worker location. This means the block is only in ufs.
   * Append any created journal entries to the included context.
   * @param blockId the id of the block to commit
   * @param length the length of the block
   * @param context the journal context
   */
  void commitBlockInUFS(long blockId, long length, JournalContext context);

  /**
   * @param blockId the block id to get information for
   * @return the {@link BlockInfo} for the given block id
   * @throws BlockInfoException if the block info is not found
   */
  BlockInfo getBlockInfo(long blockId) throws BlockInfoException, UnavailableException;

  /**
   * Retrieves information for the given list of block ids.
   *
   * @param blockIds A list of block ids to retrieve the information for
   * @return A list of {@link BlockInfo} objects corresponding to the input list of block ids. The
   *         list is in the same order as the input list
   */
  List getBlockInfoList(List blockIds) throws UnavailableException;

  /**
   * @return the total bytes on each storage tier
   */
  Map getTotalBytesOnTiers();

  /**
   * @return the used bytes on each storage tier
   */
  Map getUsedBytesOnTiers();

  /**
   * Returns a worker id for the given worker, creating one if the worker is new.
   *
   * @param workerNetAddress the worker {@link WorkerNetAddress}
   * @return the worker id for this worker
   */
  long getWorkerId(WorkerNetAddress workerNetAddress);

  /**
   * Try to acquire a {@link RegisterLease} for the worker.
   * If the lease is not granted, this will return empty immediately rather than blocking.
   *
   * @param request the request with all information for the master to make a decision with
   * @return if empty, that means the lease is not granted
   */
  Optional tryAcquireRegisterLease(GetRegisterLeasePRequest request);

  /**
   * Verifies if the worker currently holds a {@link RegisterLease}.
   *
   * @param workerId the worker ID
   * @return whether a lease is found
   */
  boolean hasRegisterLease(long workerId);

  /**
   * Releases the {@link RegisterLease} for the specified worker.
   * If the worker currently does not hold a lease, return without throwing an error.
   * The lease may have been recycled already.
   *
   * @param workerId the worker ID
   */
  void releaseRegisterLease(long workerId);

  /**
   * Updates metadata when a worker registers with the master.
   *
   * @param workerId the worker id of the worker registering
   * @param storageTiers a list of storage tier aliases in order of their position in the worker's
   *        hierarchy
   * @param totalBytesOnTiers a mapping from storage tier alias to total bytes
   * @param usedBytesOnTiers a mapping from storage tier alias to the used byes
   * @param currentBlocksOnLocation a mapping from storage tier alias to a list of blocks
   * @param lostStorage a mapping from storage tier alias to a list of lost storage paths
   * @param options the options that may contain worker configuration
   * @throws NotFoundException if workerId cannot be found
   */
  void workerRegister(long workerId, List storageTiers,
      Map totalBytesOnTiers, Map usedBytesOnTiers,
      Map> currentBlocksOnLocation,
      Map lostStorage, RegisterWorkerPOptions options)
      throws NotFoundException;

  /**
   * Updates metadata when a worker periodically heartbeats with the master.
   *
   * @param workerId the worker id
   * @param capacityBytesOnTiers a mapping from tier alias to the capacity bytes
   * @param usedBytesOnTiers a mapping from tier alias to the used bytes
   * @param removedBlockIds a list of block ids removed from this worker
   * @param addedBlocks a mapping from tier alias to the added blocks
   * @param lostStorage a mapping from tier alias to lost storage paths
   * @param metrics worker metrics
   * @return an optional command for the worker to execute
   */
  Command workerHeartbeat(long workerId, Map capacityBytesOnTiers,
      Map usedBytesOnTiers, List removedBlockIds,
      Map> addedBlocks,
      Map lostStorage,
      List metrics);

  /**
   * @param blockId the block ID
   * @return whether the block is considered lost in Alluxio
   */
  boolean isBlockLost(long blockId);

  /**
   * Returns an {@link Iterator} over the lost blocks.
   * Note that the iterator should not be shared across threads.
   *
   * @return an Iterator
   */
  Iterator getLostBlocksIterator();

  /**
   * @return the number of lost blocks in Alluxio
   */
  @VisibleForTesting
  int getLostBlocksCount();

  /**
   * Reports the ids of the blocks lost on workers.
   *
   * @param blockIds the ids of the lost blocks
   */
  void reportLostBlocks(List blockIds);

  /**
   * Registers callback functions to use when lost workers become alive.
   *
   * @param function the function to register
   */
  void registerLostWorkerFoundListener(Consumer
function); /** * Registers callback functions to use when detecting lost workers. * * @param function the function to register */ void registerWorkerLostListener(Consumer
function); /** * Registers callback functions to use when detecting lost workers. * * @param function the function to register */ void registerWorkerDeleteListener(Consumer
function); /** * Registers callback functions to use when workers register with configuration. * * @param function the function to register */ void registerNewWorkerConfListener(BiConsumer> function); /** * Returns the internal {@link MasterWorkerInfo} object to the caller. * This is specifically for the tests and the {@link WorkerRegisterContext}. * * Note that this operations on the object requires locking. * See the javadoc of {@link MasterWorkerInfo} for how the locking should be carefully done. * When in doubt, do not use this API. Find other methods in this class that exposes * necessary information. * * @param workerId the worker ID * @return the {@link MasterWorkerInfo} for the worker */ @VisibleForTesting MasterWorkerInfo getWorker(long workerId) throws NotFoundException; /** * Handles messages in a register stream. * * @param context the stream context that contains the worker information * @param chunk the message in a stream * @param isFirstMsg whether the message is the 1st in a stream */ void workerRegisterStream( WorkerRegisterContext context, RegisterWorkerPRequest chunk, boolean isFirstMsg); /** * Completes the worker registration stream. * * @param context the stream context to be closed */ void workerRegisterFinish(WorkerRegisterContext context); /** * Returns the BlockMaster's clock so other components can align with * the BlockMaster's time. * * @return the current clock */ Clock getClock(); /** * Returns the internal JournaledNextContainerId. * * @return JournaledNextContainerId */ @VisibleForTesting long getJournaledNextContainerId(); /** * Revert disabling a worker, enabling it to register to the cluster. * @param requestOptions the request */ void removeDisabledWorker(RemoveDisabledWorkerPOptions requestOptions) throws NotFoundException; /** * Notify the worker id to a master. * @param workerId the worker id * @param workerNetAddress the worker address */ void notifyWorkerId(long workerId, WorkerNetAddress workerNetAddress); }




© 2015 - 2025 Weber Informatics LLC | Privacy Policy