in ratis-client/src/main/java/org/apache/ratis/client/impl/RaftClientImpl.java [416:448]
void handleIOException(RaftClientRequest request, IOException ioe,
RaftPeerId newLeader, Consumer<RaftClientRequest> handler) {
LOG.debug("{}: suggested new leader: {}. Failed {}", clientId, newLeader, request, ioe);
if (LOG.isTraceEnabled()) {
LOG.trace("Stack trace", new Throwable("TRACE"));
}
Optional.ofNullable(handler).ifPresent(h -> h.accept(request));
if (ioe instanceof LeaderNotReadyException || ioe instanceof ResourceUnavailableException) {
return;
}
final RaftPeerId oldLeader = request.getServerId();
final RaftPeerId curLeader = getLeaderId();
final boolean stillLeader = oldLeader.equals(curLeader);
if (newLeader == null && stillLeader) {
newLeader = CollectionUtils.random(oldLeader,
CollectionUtils.as(peers, RaftPeer::getId));
}
LOG.debug("{}: oldLeader={}, curLeader={}, newLeader={}", clientId, oldLeader, curLeader, newLeader);
final boolean changeLeader = newLeader != null && stillLeader;
final boolean reconnect = changeLeader || clientRpc.shouldReconnect(ioe);
if (reconnect) {
if (changeLeader && oldLeader.equals(getLeaderId())) {
LOG.debug("{} changes Leader from {} to {} for {}",
clientId, oldLeader, newLeader, groupId, ioe);
this.leaderId = newLeader;
}
clientRpc.handleException(oldLeader, ioe, true);
}
}