/** * Finds the routing source node for peer recovery, return null if its not found. Note, this * method expects the shard routing to *require* peer recovery, use {@link * #isPeerRecovery(org.elasticsearch.cluster.routing.ShardRouting)} to check if its needed or not. */ private DiscoveryNode findSourceNodeForPeerRecovery( RoutingTable routingTable, DiscoveryNodes nodes, ShardRouting shardRouting) { DiscoveryNode sourceNode = null; if (!shardRouting.primary()) { IndexShardRoutingTable shardRoutingTable = routingTable.index(shardRouting.index()).shard(shardRouting.id()); for (ShardRouting entry : shardRoutingTable) { if (entry.primary() && entry.active()) { // only recover from started primary, if we can't find one, we will do it next round sourceNode = nodes.get(entry.currentNodeId()); if (sourceNode == null) { logger.trace( "can't find replica source node because primary shard {} is assigned to an unknown node.", entry); return null; } break; } } if (sourceNode == null) { logger.trace( "can't find replica source node for {} because a primary shard can not be found.", shardRouting.shardId()); } } else if (shardRouting.relocatingNodeId() != null) { sourceNode = nodes.get(shardRouting.relocatingNodeId()); if (sourceNode == null) { logger.trace( "can't find relocation source node for shard {} because it is assigned to an unknown node [{}].", shardRouting.shardId(), shardRouting.relocatingNodeId()); } } else { throw new IllegalStateException( "trying to find source node for peer recovery when routing state means no peer recovery: " + shardRouting); } return sourceNode; }
private boolean isPeerRecovery(ShardRouting shardRouting) { return !shardRouting.primary() || shardRouting.relocatingNodeId() != null; }