From a8532ee4e537b91598b3a536c7df019d1df76a9d Mon Sep 17 00:00:00 2001 From: Hai Saadon Date: Thu, 15 Feb 2018 16:54:18 +0200 Subject: [PATCH 1/2] add ability to use RoundRobinDnsAddressResolverGroup in Connection manager. --- .../main/java/org/redisson/config/Config.java | 16 +++++++++++++++- .../connection/AddressResolverGroupFactory.java | 16 ++++++++++++++++ .../connection/MasterSlaveConnectionManager.java | 6 +++--- 3 files changed, 34 insertions(+), 4 deletions(-) create mode 100644 redisson/src/main/java/org/redisson/connection/AddressResolverGroupFactory.java diff --git a/redisson/src/main/java/org/redisson/config/Config.java b/redisson/src/main/java/org/redisson/config/Config.java index b4419d655..ea04d9355 100644 --- a/redisson/src/main/java/org/redisson/config/Config.java +++ b/redisson/src/main/java/org/redisson/config/Config.java @@ -27,6 +27,7 @@ import org.redisson.codec.DefaultReferenceCodecProvider; import org.redisson.codec.JsonJacksonCodec; import org.redisson.codec.ReferenceCodecProvider; import org.redisson.connection.ConnectionManager; +import org.redisson.connection.AddressResolverGroupFactory; import org.redisson.connection.ReplicatedConnectionManager; import io.netty.channel.EventLoopGroup; @@ -86,6 +87,11 @@ public class Config { private boolean keepPubSubOrder = true; + /** + * AddressResolverGroupFactory switch between default and round robin + */ + private AddressResolverGroupFactory addressResolverGroupFactory = AddressResolverGroupFactory.DNS_ADDRESS_RESOLVER_GROUP; + public Config() { } @@ -107,7 +113,8 @@ public class Config { setReferenceEnabled(oldConf.isReferenceEnabled()); setEventLoopGroup(oldConf.getEventLoopGroup()); setTransportMode(oldConf.getTransportMode()); - + setAddressResolverGroupFactory(oldConf.getAddressResolverGroupFactory()); + if (oldConf.getSingleServerConfig() != null) { setSingleServerConfig(new SingleServerConfig(oldConf.getSingleServerConfig())); } @@ -591,6 +598,13 @@ public class Config { return keepPubSubOrder; } + public void setAddressResolverGroupFactory(AddressResolverGroupFactory addressResolverGroupFactory) { + this.addressResolverGroupFactory = addressResolverGroupFactory; + } + + public AddressResolverGroupFactory getAddressResolverGroupFactory() { + return addressResolverGroupFactory; + } /** * Read config object stored in JSON format from String diff --git a/redisson/src/main/java/org/redisson/connection/AddressResolverGroupFactory.java b/redisson/src/main/java/org/redisson/connection/AddressResolverGroupFactory.java new file mode 100644 index 000000000..ec53d96d1 --- /dev/null +++ b/redisson/src/main/java/org/redisson/connection/AddressResolverGroupFactory.java @@ -0,0 +1,16 @@ +package org.redisson.connection; + +import io.netty.channel.socket.DatagramChannel; +import io.netty.resolver.dns.DnsAddressResolverGroup; +import io.netty.resolver.dns.DnsServerAddressStreamProvider; +import io.netty.resolver.dns.RoundRobinDnsAddressResolverGroup; + +/** + * Created by hasaadon on 15/02/2018. + */ +public interface AddressResolverGroupFactory { + DnsAddressResolverGroup create(Class channelType, DnsServerAddressStreamProvider nameServerProvider); + + AddressResolverGroupFactory ROUND_ROBIN_DNS_ADDRESS_RESOLVER_GROUP = RoundRobinDnsAddressResolverGroup::new; + AddressResolverGroupFactory DNS_ADDRESS_RESOLVER_GROUP = DnsAddressResolverGroup::new; +} diff --git a/redisson/src/main/java/org/redisson/connection/MasterSlaveConnectionManager.java b/redisson/src/main/java/org/redisson/connection/MasterSlaveConnectionManager.java index 1a9e8afc6..9f376ce91 100644 --- a/redisson/src/main/java/org/redisson/connection/MasterSlaveConnectionManager.java +++ b/redisson/src/main/java/org/redisson/connection/MasterSlaveConnectionManager.java @@ -190,7 +190,7 @@ public class MasterSlaveConnectionManager implements ConnectionManager { } this.socketChannelClass = EpollSocketChannel.class; - this.resolverGroup = new DnsAddressResolverGroup(EpollDatagramChannel.class, DnsServerAddressStreamProviders.platformDefault()); + this.resolverGroup = cfg.getAddressResolverGroupFactory().create(EpollDatagramChannel.class, DnsServerAddressStreamProviders.platformDefault()); } else if (cfg.getTransportMode() == TransportMode.KQUEUE) { if (cfg.getEventLoopGroup() == null) { this.group = new KQueueEventLoopGroup(cfg.getNettyThreads(), new DefaultThreadFactory("redisson-netty")); @@ -199,7 +199,7 @@ public class MasterSlaveConnectionManager implements ConnectionManager { } this.socketChannelClass = KQueueSocketChannel.class; - this.resolverGroup = new DnsAddressResolverGroup(KQueueDatagramChannel.class, DnsServerAddressStreamProviders.platformDefault()); + this.resolverGroup = cfg.getAddressResolverGroupFactory().create(KQueueDatagramChannel.class, DnsServerAddressStreamProviders.platformDefault()); } else { if (cfg.getEventLoopGroup() == null) { this.group = new NioEventLoopGroup(cfg.getNettyThreads(), new DefaultThreadFactory("redisson-netty")); @@ -208,7 +208,7 @@ public class MasterSlaveConnectionManager implements ConnectionManager { } this.socketChannelClass = NioSocketChannel.class; - this.resolverGroup = new DnsAddressResolverGroup(NioDatagramChannel.class, DnsServerAddressStreamProviders.platformDefault()); + this.resolverGroup = cfg.getAddressResolverGroupFactory().create(NioDatagramChannel.class, DnsServerAddressStreamProviders.platformDefault()); } if (cfg.getExecutor() == null) { From 603924cc97614bdf7268411c30656f8399b529b5 Mon Sep 17 00:00:00 2001 From: Hai Saadon Date: Sun, 18 Feb 2018 11:51:57 +0200 Subject: [PATCH 2/2] add ability to use RoundRobinDnsAddressResolverGroup in Connection manager. --- .../src/main/java/org/redisson/config/Config.java | 6 +++++- .../connection/AddressResolverGroupFactory.java | 15 +++++++++++++-- 2 files changed, 18 insertions(+), 3 deletions(-) diff --git a/redisson/src/main/java/org/redisson/config/Config.java b/redisson/src/main/java/org/redisson/config/Config.java index ea04d9355..c48bc30f4 100644 --- a/redisson/src/main/java/org/redisson/config/Config.java +++ b/redisson/src/main/java/org/redisson/config/Config.java @@ -598,10 +598,14 @@ public class Config { return keepPubSubOrder; } + /** + * Used to switch between {@link io.netty.resolver.dns.DnsAddressResolverGroup} implementations. + * Switch to round robin {@link io.netty.resolver.dns.RoundRobinDnsAddressResolverGroup} when you need to optimize the url resolving. + * @param addressResolverGroupFactory + */ public void setAddressResolverGroupFactory(AddressResolverGroupFactory addressResolverGroupFactory) { this.addressResolverGroupFactory = addressResolverGroupFactory; } - public AddressResolverGroupFactory getAddressResolverGroupFactory() { return addressResolverGroupFactory; } diff --git a/redisson/src/main/java/org/redisson/connection/AddressResolverGroupFactory.java b/redisson/src/main/java/org/redisson/connection/AddressResolverGroupFactory.java index ec53d96d1..8499cd1d1 100644 --- a/redisson/src/main/java/org/redisson/connection/AddressResolverGroupFactory.java +++ b/redisson/src/main/java/org/redisson/connection/AddressResolverGroupFactory.java @@ -11,6 +11,17 @@ import io.netty.resolver.dns.RoundRobinDnsAddressResolverGroup; public interface AddressResolverGroupFactory { DnsAddressResolverGroup create(Class channelType, DnsServerAddressStreamProvider nameServerProvider); - AddressResolverGroupFactory ROUND_ROBIN_DNS_ADDRESS_RESOLVER_GROUP = RoundRobinDnsAddressResolverGroup::new; - AddressResolverGroupFactory DNS_ADDRESS_RESOLVER_GROUP = DnsAddressResolverGroup::new; + AddressResolverGroupFactory ROUND_ROBIN_DNS_ADDRESS_RESOLVER_GROUP = new AddressResolverGroupFactory() { + @Override + public DnsAddressResolverGroup create(Class channelType, DnsServerAddressStreamProvider nameServerProvider) { + return new RoundRobinDnsAddressResolverGroup(channelType, nameServerProvider); + } + }; + + AddressResolverGroupFactory DNS_ADDRESS_RESOLVER_GROUP = new AddressResolverGroupFactory() { + @Override + public DnsAddressResolverGroup create(Class channelType, DnsServerAddressStreamProvider nameServerProvider) { + return new DnsAddressResolverGroup(channelType, nameServerProvider); + } + }; }