+ private boolean isLeaderAvailabilityKnown() {
+ if(leaderId == null) {
+ return false;
+ }
+
+ Optional<Cluster> cluster = context.getCluster();
+ if(!cluster.isPresent()) {
+ return false;
+ }
+
+ ActorSelection leaderActor = context.getPeerActorSelection(leaderId);
+ if(leaderActor == null) {
+ return false;
+ }
+
+ Address leaderAddress = leaderActor.anchorPath().address();
+
+ CurrentClusterState state = cluster.get().state();
+ Set<Member> unreachable = state.getUnreachable();
+
+ LOG.debug("{}: Checking for leader {} in the cluster unreachable set {}", logName(), leaderAddress,
+ unreachable);
+
+ for(Member m: unreachable) {
+ if(leaderAddress.equals(m.address())) {
+ LOG.info("{}: Leader {} is unreachable", logName(), leaderAddress);
+ return false;
+ }
+ }
+
+ for(Member m: state.getMembers()) {
+ if(leaderAddress.equals(m.address())) {
+ if(m.status() == MemberStatus.up() || m.status() == MemberStatus.weaklyUp()) {
+ LOG.debug("{}: Leader {} cluster status is {} - leader is available", logName(),
+ leaderAddress, m.status());
+ return true;
+ } else {
+ LOG.debug("{}: Leader {} cluster status is {} - leader is unavailable", logName(),
+ leaderAddress, m.status());
+ return false;
+ }
+ }
+ }
+
+ LOG.debug("{}: Leader {} not found in the cluster member set", logName(), leaderAddress);
+
+ return false;
+ }
+