diff --git a/src/main/java/org/redisson/cluster/ClusterConnectionManager.java b/src/main/java/org/redisson/cluster/ClusterConnectionManager.java index 5b6b85488..6967b1a7c 100644 --- a/src/main/java/org/redisson/cluster/ClusterConnectionManager.java +++ b/src/main/java/org/redisson/cluster/ClusterConnectionManager.java @@ -75,7 +75,8 @@ public class ClusterConnectionManager extends MasterSlaveConnectionManager { this.config = create(cfg); init(this.config); - Exception lastException = null; + Throwable lastException = null; + List failedMasters = new ArrayList(); for (URI addr : cfg.getNodeAddresses()) { Future connectionFuture = connect(cfg, addr); try { @@ -96,6 +97,7 @@ public class ClusterConnectionManager extends MasterSlaveConnectionManager { List>>> futures = new ArrayList>>>(); for (ClusterPartition partition : partitions) { if (partition.isMasterFail()) { + failedMasters.add(partition.getMasterAddr().toString()); continue; } Future>> masterFuture = addMasterEntry(partition, cfg); @@ -105,6 +107,7 @@ public class ClusterConnectionManager extends MasterSlaveConnectionManager { for (Future>> masterFuture : futures) { masterFuture.awaitUninterruptibly(); if (!masterFuture.isSuccess()) { + lastException = masterFuture.cause(); continue; } for (Future future : masterFuture.getNow()) { @@ -123,12 +126,20 @@ public class ClusterConnectionManager extends MasterSlaveConnectionManager { if (lastPartitions.isEmpty()) { stopThreads(); - throw new RedisConnectionException("Can't connect to servers!", lastException); + if (failedMasters.isEmpty()) { + throw new RedisConnectionException("Can't connect to servers!", lastException); + } else { + throw new RedisConnectionException("Can't connect to servers! Failed masters according to cluster status: " + failedMasters, lastException); + } } if (lastPartitions.size() != MAX_SLOT) { stopThreads(); - throw new RedisConnectionException("Not all slots are covered! Only " + lastPartitions.size() + " slots are avaliable", lastException); + if (failedMasters.isEmpty()) { + throw new RedisConnectionException("Not all slots are covered! Only " + lastPartitions.size() + " slots are avaliable", lastException); + } else { + throw new RedisConnectionException("Not all slots are covered! Only " + lastPartitions.size() + " slots are avaliable. Failed masters according to cluster status: " + failedMasters, lastException); + } } scheduleClusterChangeCheck(cfg, null);