Class AsyncShardFetch<T extends BaseNodeResponse>

All Implemented Interfaces:
Closeable, AutoCloseable, Releasable

public abstract class AsyncShardFetch<T extends BaseNodeResponse> extends Object implements Releasable
Allows to asynchronously fetch shard related data from other nodes for allocation, without blocking the cluster update thread.

The async fetch logic maintains a map of which nodes are being fetched from in an async manner, and once the results are back, it makes sure to schedule a reroute to make sure those results will be taken into account.

  • Field Details

    • logger

      protected final org.apache.logging.log4j.Logger logger
    • type

      protected final String type
    • shardId

      protected final ShardId shardId
    • customDataPath

      protected final String customDataPath
  • Constructor Details

  • Method Details

    • close

      public void close()
      Specified by:
      close in interface AutoCloseable
      Specified by:
      close in interface Closeable
      Specified by:
      close in interface Releasable
    • getNumberOfInFlightFetches

      public int getNumberOfInFlightFetches()
      Returns the number of async fetches that are currently ongoing.
    • fetchData

      public AsyncShardFetch.FetchResult<T> fetchData(DiscoveryNodes nodes, Set<String> ignoreNodes)
      Fetches the data for the relevant shard. If there any ongoing async fetches going on, or new ones have been initiated by this call, the result will have no data.

      The ignoreNodes are nodes that are supposed to be ignored for this round, since fetching is async, we need to keep them around and make sure we add them back when all the responses are fetched and returned.

    • processAsyncFetch

      protected void processAsyncFetch(List<T> responses, List<FailedNodeException> failures, long fetchingRound)
      Called by the response handler of the async action to fetch data. Verifies that its still working on the same cache generation, otherwise the results are discarded. It then goes and fills the relevant data for the shard (response + failures), issuing a reroute at the end of it to make sure there will be another round of allocations taking this new data into account.
    • reroute

      protected abstract void reroute(ShardId shardId, String reason)
      Implement this in order to scheduled another round that causes a call to fetch data.