java.lang.Object
org.elasticsearch.cluster.routing.allocation.decider.AllocationDecider
Direct Known Subclasses:
AwarenessAllocationDecider, ClusterRebalanceAllocationDecider, ConcurrentRebalanceAllocationDecider, DiskThresholdDecider, EnableAllocationDecider, FilterAllocationDecider, MaxRetryAllocationDecider, NodeReplacementAllocationDecider, NodeShutdownAllocationDecider, NodeVersionAllocationDecider, RebalanceOnlyWhenActiveAllocationDecider, ReplicaAfterPrimaryActiveAllocationDecider, ResizeAllocationDecider, RestoreInProgressAllocationDecider, SameShardAllocationDecider, ShardsLimitAllocationDecider, SnapshotInProgressAllocationDecider, ThrottlingAllocationDecider

public abstract class AllocationDecider extends Object
AllocationDecider is an abstract base class that allows to make dynamic cluster- or index-wide shard allocation decisions on a per-node basis.
  • Constructor Details

    • AllocationDecider

      public AllocationDecider()
  • Method Details

    • canRebalance

      public Decision canRebalance(ShardRouting shardRouting, RoutingAllocation allocation)
      Returns a Decision whether the given shard routing can be re-balanced to the given allocation. The default is Decision.ALWAYS.
    • canAllocate

      public Decision canAllocate(ShardRouting shardRouting, RoutingNode node, RoutingAllocation allocation)
      Returns a Decision whether the given shard routing can be allocated on the given node. The default is Decision.ALWAYS.
    • canRemain

      public Decision canRemain(IndexMetadata indexMetadata, ShardRouting shardRouting, RoutingNode node, RoutingAllocation allocation)
      Returns a Decision whether the given shard routing can be remain on the given node. The default is Decision.ALWAYS.
    • canAllocate

      public Decision canAllocate(ShardRouting shardRouting, RoutingAllocation allocation)
      Returns a Decision whether the given shard routing can be allocated at all at this state of the RoutingAllocation. The default is Decision.ALWAYS.
    • canAllocate

      public Decision canAllocate(IndexMetadata indexMetadata, RoutingNode node, RoutingAllocation allocation)
      Returns a Decision whether the given shard routing can be allocated at all at this state of the RoutingAllocation. The default is Decision.ALWAYS.
    • shouldAutoExpandToNode

      public Decision shouldAutoExpandToNode(IndexMetadata indexMetadata, DiscoveryNode node, RoutingAllocation allocation)
      Returns a Decision whether shards of the given index should be auto-expanded to this node at this state of the RoutingAllocation. The default is Decision.ALWAYS.
    • canRebalance

      public Decision canRebalance(RoutingAllocation allocation)
      Returns a Decision whether the cluster can execute re-balanced operations at all. Decision.ALWAYS.
    • canForceAllocatePrimary

      public Decision canForceAllocatePrimary(ShardRouting shardRouting, RoutingNode node, RoutingAllocation allocation)
      Returns a Decision whether the given primary shard can be forcibly allocated on the given node. This method should only be called for unassigned primary shards where the node has a shard copy on disk. Note: all implementations that override this behavior should take into account the results of canAllocate(ShardRouting, RoutingNode, RoutingAllocation) before making a decision on force allocation, because force allocation should only be considered if all deciders return Decision.NO.
    • canForceAllocateDuringReplace

      public Decision canForceAllocateDuringReplace(ShardRouting shardRouting, RoutingNode node, RoutingAllocation allocation)
      Returns a Decision whether the given shard can be forced to the given node in the event that the shard's source node is being replaced. This allows nodes using a replace-type node shutdown to override certain deciders in the interest of moving the shard away from a node that *must* be removed. It defaults to returning "YES" and must be overridden by deciders that opt-out to having their other NO decisions *not* overridden while vacating. The caller is responsible for first checking: - that a replacement is ongoing - the shard routing's current node is the source of the replacement
    • canAllocateReplicaWhenThereIsRetentionLease

      public Decision canAllocateReplicaWhenThereIsRetentionLease(ShardRouting shardRouting, RoutingNode node, RoutingAllocation allocation)
      Returns a Decision whether the given replica shard can be allocated to the given node when there is an existing retention lease already existing on the node (meaning it has been allocated there previously) This method does not actually check whether there is a retention lease, that is the responsibility of the caller. It defaults to the same value as canAllocate.
    • getForcedInitialShardAllocationToNodes

      public Optional<Set<String>> getForcedInitialShardAllocationToNodes(ShardRouting shardRouting, RoutingAllocation allocation)
      Returns a empty() if shard could be initially allocated anywhere or Optional.of(Set.of(nodeIds)) if shard could be initially allocated only on subset of a nodes. This might be required for splitting or shrinking index as resulting shards have to be on the same node as a source shard.