diff --git a/redisson/src/main/java/org/redisson/cluster/ClusterConnectionManager.java b/redisson/src/main/java/org/redisson/cluster/ClusterConnectionManager.java index 027828639..2ef353899 100644 --- a/redisson/src/main/java/org/redisson/cluster/ClusterConnectionManager.java +++ b/redisson/src/main/java/org/redisson/cluster/ClusterConnectionManager.java @@ -790,13 +790,12 @@ public class ClusterConnectionManager extends MasterSlaveConnectionManager { RFuture ipFuture = resolveIP(clusterNodeInfo.getAddress()); counter++; - ipFuture.onComplete((addr, e) -> { + ipFuture.onComplete((address, e) -> { if (e != null) { latch.countDown(); return; } - RedisURI address = applyNatMap(addr); if (clusterNodeInfo.containsFlag(Flag.SLAVE)) { ClusterPartition masterPartition = partitions.computeIfAbsent(masterId, k -> new ClusterPartition(masterId)); ClusterPartition slavePartition = partitions.computeIfAbsent(clusterNodeInfo.getNodeId(), diff --git a/redisson/src/main/java/org/redisson/command/RedisExecutor.java b/redisson/src/main/java/org/redisson/command/RedisExecutor.java index c42c8b86e..4c15624d5 100644 --- a/redisson/src/main/java/org/redisson/command/RedisExecutor.java +++ b/redisson/src/main/java/org/redisson/command/RedisExecutor.java @@ -39,6 +39,7 @@ import org.redisson.connection.NodeSource.Redirect; import org.redisson.liveobject.core.RedissonObjectBuilder; import org.redisson.misc.LogHelper; import org.redisson.misc.RPromise; +import org.redisson.misc.RedisURI; import org.redisson.misc.RedissonPromise; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -415,8 +416,15 @@ public class RedisExecutor { onException(); - source = new NodeSource(ex.getSlot(), connectionManager.applyNatMap(ex.getUrl()), Redirect.MOVED); - execute(); + RFuture ipAddrFuture = connectionManager.resolveIP(ex.getUrl()); + ipAddrFuture.onComplete((ip, e) -> { + if (e != null) { + handleError(connectionFuture, e); + return; + } + source = new NodeSource(ex.getSlot(), ip, Redirect.MOVED); + execute(); + }); return; } @@ -425,8 +433,15 @@ public class RedisExecutor { onException(); - source = new NodeSource(ex.getSlot(), connectionManager.applyNatMap(ex.getUrl()), Redirect.ASK); - execute(); + RFuture ipAddrFuture = connectionManager.resolveIP(ex.getUrl()); + ipAddrFuture.onComplete((ip, e) -> { + if (e != null) { + handleError(connectionFuture, e); + return; + } + source = new NodeSource(ex.getSlot(), ip, Redirect.ASK); + execute(); + }); return; } diff --git a/redisson/src/main/java/org/redisson/connection/ConnectionManager.java b/redisson/src/main/java/org/redisson/connection/ConnectionManager.java index 57558d03a..c230a9c76 100644 --- a/redisson/src/main/java/org/redisson/connection/ConnectionManager.java +++ b/redisson/src/main/java/org/redisson/connection/ConnectionManager.java @@ -46,6 +46,8 @@ import java.util.concurrent.TimeUnit; public interface ConnectionManager { RedisURI applyNatMap(RedisURI address); + + RFuture resolveIP(RedisURI address); String getId(); diff --git a/redisson/src/main/java/org/redisson/connection/MasterSlaveConnectionManager.java b/redisson/src/main/java/org/redisson/connection/MasterSlaveConnectionManager.java index a672e0516..f17be601b 100644 --- a/redisson/src/main/java/org/redisson/connection/MasterSlaveConnectionManager.java +++ b/redisson/src/main/java/org/redisson/connection/MasterSlaveConnectionManager.java @@ -690,13 +690,15 @@ public class MasterSlaveConnectionManager implements ConnectionManager { return address; } - protected RFuture resolveIP(RedisURI address) { + @Override + public RFuture resolveIP(RedisURI address) { return resolveIP(address.getScheme(), address); } protected RFuture resolveIP(String scheme, RedisURI address) { if (address.isIP()) { - return RedissonPromise.newSucceededFuture(address); + RedisURI addr = applyNatMap(address); + return RedissonPromise.newSucceededFuture(addr); } RPromise result = new RedissonPromise<>();