Fixed - MOVED response with hostname isn't handled properly #3880

pull/3917/head
Nikita Koksharov 3 years ago
parent 1c15a5bb8f
commit fc711f87a2

@ -790,13 +790,12 @@ public class ClusterConnectionManager extends MasterSlaveConnectionManager {
RFuture<RedisURI> 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(),

@ -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<V, R> {
onException();
source = new NodeSource(ex.getSlot(), connectionManager.applyNatMap(ex.getUrl()), Redirect.MOVED);
execute();
RFuture<RedisURI> 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<V, R> {
onException();
source = new NodeSource(ex.getSlot(), connectionManager.applyNatMap(ex.getUrl()), Redirect.ASK);
execute();
RFuture<RedisURI> 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;
}

@ -46,6 +46,8 @@ import java.util.concurrent.TimeUnit;
public interface ConnectionManager {
RedisURI applyNatMap(RedisURI address);
RFuture<RedisURI> resolveIP(RedisURI address);
String getId();

@ -690,13 +690,15 @@ public class MasterSlaveConnectionManager implements ConnectionManager {
return address;
}
protected RFuture<RedisURI> resolveIP(RedisURI address) {
@Override
public RFuture<RedisURI> resolveIP(RedisURI address) {
return resolveIP(address.getScheme(), address);
}
protected RFuture<RedisURI> resolveIP(String scheme, RedisURI address) {
if (address.isIP()) {
return RedissonPromise.newSucceededFuture(address);
RedisURI addr = applyNatMap(address);
return RedissonPromise.newSucceededFuture(addr);
}
RPromise<RedisURI> result = new RedissonPromise<>();

Loading…
Cancel
Save