From 169b1bd1749369a29987640894ba5ed01de89691 Mon Sep 17 00:00:00 2001 From: Mark Paluch Date: Wed, 19 Sep 2018 12:25:31 +0200 Subject: [PATCH] DATAREDIS-869 - Adapt to nomenclature change about Master/Replica. We now renamed RedisStaticMasterSlaveConfiguration and StaticMasterSlaveConnectionProvider to RedisStaticMasterReplicaConfiguration respective StaticMasterReplicaConnectionProvider to reflect changes in Redis nomenclature regarding replication. Original Pull Request: #355 --- .../redis/connection/RedisConfiguration.java | 12 +++++---- ...edisStaticMasterReplicaConfiguration.java} | 27 ++++++++++--------- .../lettuce/LettuceClientConfiguration.java | 7 +++-- .../lettuce/LettuceConnectionFactory.java | 18 ++++++------- .../lettuce/StandaloneConnectionProvider.java | 7 ++--- ...taticMasterReplicaConnectionProvider.java} | 9 ++++--- ...edisElastiCacheConfigurationUnitTests.java | 10 +++---- .../LettuceConnectionFactoryTests.java | 20 +++++++------- 8 files changed, 59 insertions(+), 51 deletions(-) rename src/main/java/org/springframework/data/redis/connection/{RedisStaticMasterSlaveConfiguration.java => RedisStaticMasterReplicaConfiguration.java} (80%) rename src/main/java/org/springframework/data/redis/connection/lettuce/{StaticMasterSlaveConnectionProvider.java => StaticMasterReplicaConnectionProvider.java} (85%) diff --git a/src/main/java/org/springframework/data/redis/connection/RedisConfiguration.java b/src/main/java/org/springframework/data/redis/connection/RedisConfiguration.java index 7d0b58fb8..bb5c191b4 100644 --- a/src/main/java/org/springframework/data/redis/connection/RedisConfiguration.java +++ b/src/main/java/org/springframework/data/redis/connection/RedisConfiguration.java @@ -95,10 +95,10 @@ public interface RedisConfiguration { /** * @param configuration can be {@literal null}. - * @return {@code true} if given {@link RedisConfiguration} is instance of {@link StaticMasterSlaveConfiguration}. + * @return {@code true} if given {@link RedisConfiguration} is instance of {@link StaticMasterReplicaConfiguration}. */ - static boolean isStaticMasterSlaveConfiguration(@Nullable RedisConfiguration configuration) { - return configuration instanceof StaticMasterSlaveConfiguration; + static boolean isStaticMasterReplicaConfiguration(@Nullable RedisConfiguration configuration) { + return configuration instanceof StaticMasterReplicaConfiguration; } /** @@ -323,12 +323,14 @@ public interface RedisConfiguration { } /** - * Configuration interface suitable for Redis master/slave environments with fixed hosts. + * Configuration interface suitable for Redis master/slave environments with fixed hosts.
+ * Redis is undergoing a nomenclature change where the term replica is used synonymously to slave. * * @author Christoph Strobl + * @author Mark Paluch * @since 2.1 */ - interface StaticMasterSlaveConfiguration extends WithDatabaseIndex, WithPassword { + interface StaticMasterReplicaConfiguration extends WithDatabaseIndex, WithPassword { /** * @return unmodifiable {@link List} of {@link RedisStandaloneConfiguration nodes}. diff --git a/src/main/java/org/springframework/data/redis/connection/RedisStaticMasterSlaveConfiguration.java b/src/main/java/org/springframework/data/redis/connection/RedisStaticMasterReplicaConfiguration.java similarity index 80% rename from src/main/java/org/springframework/data/redis/connection/RedisStaticMasterSlaveConfiguration.java rename to src/main/java/org/springframework/data/redis/connection/RedisStaticMasterReplicaConfiguration.java index 4bf2e9ec4..9655b663f 100644 --- a/src/main/java/org/springframework/data/redis/connection/RedisStaticMasterSlaveConfiguration.java +++ b/src/main/java/org/springframework/data/redis/connection/RedisStaticMasterReplicaConfiguration.java @@ -19,19 +19,20 @@ import java.util.ArrayList; import java.util.Collections; import java.util.List; -import org.springframework.data.redis.connection.RedisConfiguration.StaticMasterSlaveConfiguration; +import org.springframework.data.redis.connection.RedisConfiguration.StaticMasterReplicaConfiguration; import org.springframework.util.Assert; /** * Configuration class used for setting up {@link RedisConnection} via {@link RedisConnectionFactory} using the provided - * Master / Slave configuration to nodes know to not change address. Eg. when connecting to - * AWS ElastiCache with Read Replicas . + * Master / Replica configuration to nodes know to not change address. Eg. when connecting to + * AWS ElastiCache with Read Replicas.
+ * Note: Redis is undergoing a nomenclature change where the term replica is used synonymously to slave. * * @author Mark Paluch * @author Christoph Strobl * @since 2.1 */ -public class RedisStaticMasterSlaveConfiguration implements RedisConfiguration, StaticMasterSlaveConfiguration { +public class RedisStaticMasterReplicaConfiguration implements RedisConfiguration, StaticMasterReplicaConfiguration { private static final int DEFAULT_PORT = 6379; @@ -40,21 +41,21 @@ public class RedisStaticMasterSlaveConfiguration implements RedisConfiguration, private RedisPassword password = RedisPassword.none(); /** - * Create a new {@link StaticMasterSlaveConfiguration} given {@code hostName}. + * Create a new {@link StaticMasterReplicaConfiguration} given {@code hostName}. * * @param hostName must not be {@literal null} or empty. */ - public RedisStaticMasterSlaveConfiguration(String hostName) { + public RedisStaticMasterReplicaConfiguration(String hostName) { this(hostName, DEFAULT_PORT); } /** - * Create a new {@link StaticMasterSlaveConfiguration} given {@code hostName} and {@code port}. + * Create a new {@link StaticMasterReplicaConfiguration} given {@code hostName} and {@code port}. * * @param hostName must not be {@literal null} or empty. * @param port a valid TCP port (1-65535). */ - public RedisStaticMasterSlaveConfiguration(String hostName, int port) { + public RedisStaticMasterReplicaConfiguration(String hostName, int port) { addNode(hostName, port); } @@ -86,9 +87,9 @@ public class RedisStaticMasterSlaveConfiguration implements RedisConfiguration, * Add a {@link RedisStandaloneConfiguration node} to the list of nodes given {@code hostName}. * * @param hostName must not be {@literal null} or empty. - * @return {@code this} {@link StaticMasterSlaveConfiguration}. + * @return {@code this} {@link StaticMasterReplicaConfiguration}. */ - public StaticMasterSlaveConfiguration node(String hostName) { + public StaticMasterReplicaConfiguration node(String hostName) { return node(hostName, DEFAULT_PORT); } @@ -97,9 +98,9 @@ public class RedisStaticMasterSlaveConfiguration implements RedisConfiguration, * * @param hostName must not be {@literal null} or empty. * @param port a valid TCP port (1-65535). - * @return {@code this} {@link StaticMasterSlaveConfiguration}. + * @return {@code this} {@link StaticMasterReplicaConfiguration}. */ - public RedisStaticMasterSlaveConfiguration node(String hostName, int port) { + public RedisStaticMasterReplicaConfiguration node(String hostName, int port) { addNode(hostName, port); return this; @@ -151,7 +152,7 @@ public class RedisStaticMasterSlaveConfiguration implements RedisConfiguration, /* * (non-Javadoc) - * @see org.springframework.data.redis.connection.RedisConfiguration.StaticMasterSlaveConfiguration#getNodes() + * @see org.springframework.data.redis.connection.RedisConfiguration.StaticMasterReplicaConfiguration#getNodes() */ @Override public List getNodes() { diff --git a/src/main/java/org/springframework/data/redis/connection/lettuce/LettuceClientConfiguration.java b/src/main/java/org/springframework/data/redis/connection/lettuce/LettuceClientConfiguration.java index f83e45492..f8a515e5e 100644 --- a/src/main/java/org/springframework/data/redis/connection/lettuce/LettuceClientConfiguration.java +++ b/src/main/java/org/springframework/data/redis/connection/lettuce/LettuceClientConfiguration.java @@ -39,7 +39,7 @@ import org.springframework.util.Assert; *
  • Optional {@link ClientResources}
  • *
  • Optional {@link ClientOptions}
  • *
  • Optional client name
  • - *
  • Optional {@link ReadFrom}. Enables Master/Slave operations if configured.
  • + *
  • Optional {@link ReadFrom}. Enables Master/Replica operations if configured.
  • *
  • Client {@link Duration timeout}
  • *
  • Shutdown {@link Duration timeout}
  • * @@ -85,6 +85,8 @@ public interface LettuceClientConfiguration { Optional getClientName(); /** + * Note: Redis is undergoing a nomenclature change where the term replica is used synonymously to slave. + * * @return the optional {@link io.lettuce.core.ReadFrom} setting. * @since 2.1 */ @@ -200,7 +202,8 @@ public interface LettuceClientConfiguration { } /** - * Configure {@link ReadFrom}. Enables Master/Slave operations if configured. + * Configure {@link ReadFrom}. Enables Master/Replica operations if configured.
    + * Note: Redis is undergoing a nomenclature change where the term replica is used synonymously to slave. * * @param readFrom must not be {@literal null}. * @return {@literal this} builder. diff --git a/src/main/java/org/springframework/data/redis/connection/lettuce/LettuceConnectionFactory.java b/src/main/java/org/springframework/data/redis/connection/lettuce/LettuceConnectionFactory.java index e48a6f59c..b42934339 100644 --- a/src/main/java/org/springframework/data/redis/connection/lettuce/LettuceConnectionFactory.java +++ b/src/main/java/org/springframework/data/redis/connection/lettuce/LettuceConnectionFactory.java @@ -73,7 +73,7 @@ import org.springframework.util.ClassUtils; * {@link LettuceConnectionFactory client configuration}. Lettuce supports the following environmental configurations: *
      *
    • {@link RedisStandaloneConfiguration}
    • - *
    • {@link RedisStaticMasterSlaveConfiguration}
    • + *
    • {@link RedisStaticMasterReplicaConfiguration}
    • *
    • {@link RedisSocketConfiguration}
    • *
    • {@link RedisSentinelConfiguration}
    • *
    • {@link RedisClusterConfiguration}
    • @@ -212,7 +212,7 @@ public class LettuceConnectionFactory /** * Constructs a new {@link LettuceConnectionFactory} instance using the given - * {@link RedisStaticMasterSlaveConfiguration} and {@link LettuceClientConfiguration}. + * {@link RedisStaticMasterReplicaConfiguration} and {@link LettuceClientConfiguration}. * * @param redisConfiguration must not be {@literal null}. * @param clientConfig must not be {@literal null}. @@ -825,11 +825,11 @@ public class LettuceConnectionFactory } /** - * @return true when {@link RedisStaticMasterSlaveConfiguration} is present. + * @return true when {@link RedisStaticMasterReplicaConfiguration} is present. * @since 2.1 */ - private boolean isStaticMasterSlaveAware() { - return RedisConfiguration.isStaticMasterSlaveConfiguration(configuration); + private boolean isStaticMasterReplicaAware() { + return RedisConfiguration.isStaticMasterReplicaConfiguration(configuration); } /** @@ -903,14 +903,14 @@ public class LettuceConnectionFactory ReadFrom readFrom = getClientConfiguration().getReadFrom().orElse(null); - if (isStaticMasterSlaveAware()) { + if (isStaticMasterReplicaAware()) { - List nodes = ((RedisStaticMasterSlaveConfiguration) configuration).getNodes().stream() // + List nodes = ((RedisStaticMasterReplicaConfiguration) configuration).getNodes().stream() // .map(it -> createRedisURIAndApplySettings(it.getHostName(), it.getPort())) // .peek(it -> it.setDatabase(getDatabase())) // .collect(Collectors.toList()); - return new StaticMasterSlaveConnectionProvider((RedisClient) client, codec, nodes, readFrom); + return new StaticMasterReplicaConnectionProvider((RedisClient) client, codec, nodes, readFrom); } if (isClusterAware()) { @@ -922,7 +922,7 @@ public class LettuceConnectionFactory protected AbstractRedisClient createClient() { - if (isStaticMasterSlaveAware()) { + if (isStaticMasterReplicaAware()) { RedisClient redisClient = clientConfiguration.getClientResources() // .map(RedisClient::create) // diff --git a/src/main/java/org/springframework/data/redis/connection/lettuce/StandaloneConnectionProvider.java b/src/main/java/org/springframework/data/redis/connection/lettuce/StandaloneConnectionProvider.java index 090c4abd8..72422669d 100644 --- a/src/main/java/org/springframework/data/redis/connection/lettuce/StandaloneConnectionProvider.java +++ b/src/main/java/org/springframework/data/redis/connection/lettuce/StandaloneConnectionProvider.java @@ -109,7 +109,7 @@ class StandaloneConnectionProvider implements LettuceConnectionProvider, TargetA if (StatefulConnection.class.isAssignableFrom(connectionType)) { - return connectionType.cast(readFrom.map(it -> this.masterSlaveConnection(redisURISupplier.get(), it)) + return connectionType.cast(readFrom.map(it -> this.masterReplicaConnection(redisURISupplier.get(), it)) .orElseGet(() -> client.connect(codec))); } @@ -135,14 +135,15 @@ class StandaloneConnectionProvider implements LettuceConnectionProvider, TargetA if (StatefulConnection.class.isAssignableFrom(connectionType)) { return connectionType - .cast(readFrom.map(it -> this.masterSlaveConnection(redisURI, it)).orElseGet(() -> client.connect(codec))); + .cast(readFrom.map(it -> this.masterReplicaConnection(redisURI, it)).orElseGet(() -> client.connect(codec))); } throw new UnsupportedOperationException("Connection type " + connectionType + " not supported!"); } - private StatefulRedisConnection masterSlaveConnection(RedisURI redisUri, ReadFrom readFrom) { + private StatefulRedisConnection masterReplicaConnection(RedisURI redisUri, ReadFrom readFrom) { + // See https://github.com/lettuce-io/lettuce-core/issues/845 for MasterSlave -> MasterReplica change. StatefulRedisMasterSlaveConnection connection = MasterSlave.connect(client, codec, redisUri); connection.setReadFrom(readFrom); diff --git a/src/main/java/org/springframework/data/redis/connection/lettuce/StaticMasterSlaveConnectionProvider.java b/src/main/java/org/springframework/data/redis/connection/lettuce/StaticMasterReplicaConnectionProvider.java similarity index 85% rename from src/main/java/org/springframework/data/redis/connection/lettuce/StaticMasterSlaveConnectionProvider.java rename to src/main/java/org/springframework/data/redis/connection/lettuce/StaticMasterReplicaConnectionProvider.java index 74cd3c8d5..0269dee4c 100644 --- a/src/main/java/org/springframework/data/redis/connection/lettuce/StaticMasterSlaveConnectionProvider.java +++ b/src/main/java/org/springframework/data/redis/connection/lettuce/StaticMasterReplicaConnectionProvider.java @@ -29,7 +29,7 @@ import java.util.Optional; import org.springframework.lang.Nullable; /** - * {@link LettuceConnectionProvider} implementation for a static Master/Slave connection suitable for eg. AWS + * {@link LettuceConnectionProvider} implementation for a static Master/Replica connection suitable for eg. AWS * ElastiCache with replicas setup.
      * Lettuce auto-discovers node roles from the static {@link RedisURI} collection. * @@ -37,7 +37,7 @@ import org.springframework.lang.Nullable; * @author Christoph Strobl * @since 2.1 */ -class StaticMasterSlaveConnectionProvider implements LettuceConnectionProvider { +class StaticMasterReplicaConnectionProvider implements LettuceConnectionProvider { private final RedisClient client; private final RedisCodec codec; @@ -45,14 +45,14 @@ class StaticMasterSlaveConnectionProvider implements LettuceConnectionProvider { private final Collection nodes; /** - * Create new {@link StaticMasterSlaveConnectionProvider}. + * Create new {@link StaticMasterReplicaConnectionProvider}. * * @param client must not be {@literal null}. * @param codec must not be {@literal null}. * @param nodes must not be {@literal null}. * @param readFrom can be {@literal null}. */ - StaticMasterSlaveConnectionProvider(RedisClient client, RedisCodec codec, Collection nodes, + StaticMasterReplicaConnectionProvider(RedisClient client, RedisCodec codec, Collection nodes, @Nullable ReadFrom readFrom) { this.client = client; @@ -70,6 +70,7 @@ class StaticMasterSlaveConnectionProvider implements LettuceConnectionProvider { if (StatefulConnection.class.isAssignableFrom(connectionType)) { + // See https://github.com/lettuce-io/lettuce-core/issues/845 for MasterSlave -> MasterReplica change. StatefulRedisMasterSlaveConnection connection = MasterSlave.connect(client, codec, nodes); readFrom.ifPresent(connection::setReadFrom); diff --git a/src/test/java/org/springframework/data/redis/connection/RedisElastiCacheConfigurationUnitTests.java b/src/test/java/org/springframework/data/redis/connection/RedisElastiCacheConfigurationUnitTests.java index 968cfbc4d..5b4a5d7e4 100644 --- a/src/test/java/org/springframework/data/redis/connection/RedisElastiCacheConfigurationUnitTests.java +++ b/src/test/java/org/springframework/data/redis/connection/RedisElastiCacheConfigurationUnitTests.java @@ -20,7 +20,7 @@ import static org.assertj.core.api.Assertions.*; import org.junit.Test; /** - * Unit tests for {@link RedisStaticMasterSlaveConfiguration}. + * Unit tests for {@link RedisStaticMasterReplicaConfiguration}. * * @author Mark Paluch */ @@ -29,7 +29,7 @@ public class RedisElastiCacheConfigurationUnitTests { @Test // DATAREDIS-762 public void shouldCreateSingleHostConfiguration() { - RedisStaticMasterSlaveConfiguration singleHost = new RedisStaticMasterSlaveConfiguration("localhost"); + RedisStaticMasterReplicaConfiguration singleHost = new RedisStaticMasterReplicaConfiguration("localhost"); assertThat(singleHost.getNodes()).hasSize(1); @@ -42,7 +42,7 @@ public class RedisElastiCacheConfigurationUnitTests { @Test // DATAREDIS-762 public void shouldCreateMultiHostConfiguration() { - RedisStaticMasterSlaveConfiguration multiHost = new RedisStaticMasterSlaveConfiguration("localhost"); + RedisStaticMasterReplicaConfiguration multiHost = new RedisStaticMasterReplicaConfiguration("localhost"); multiHost.node("other-host", 6479); assertThat(multiHost.getNodes()).hasSize(2); @@ -61,7 +61,7 @@ public class RedisElastiCacheConfigurationUnitTests { @Test // DATAREDIS-762 public void shouldApplyPasswordToNodes() { - RedisStaticMasterSlaveConfiguration multiHost = new RedisStaticMasterSlaveConfiguration("localhost").node("other-host", 6479); + RedisStaticMasterReplicaConfiguration multiHost = new RedisStaticMasterReplicaConfiguration("localhost").node("other-host", 6479); multiHost.setPassword(RedisPassword.of("foobar")); multiHost.node("third", 1234); @@ -73,7 +73,7 @@ public class RedisElastiCacheConfigurationUnitTests { @Test // DATAREDIS-762 public void shouldApplyDatabaseToNodes() { - RedisStaticMasterSlaveConfiguration multiHost = new RedisStaticMasterSlaveConfiguration("localhost").node("other-host", 6479); + RedisStaticMasterReplicaConfiguration multiHost = new RedisStaticMasterReplicaConfiguration("localhost").node("other-host", 6479); multiHost.setDatabase(4); multiHost.node("third", 1234); diff --git a/src/test/java/org/springframework/data/redis/connection/lettuce/LettuceConnectionFactoryTests.java b/src/test/java/org/springframework/data/redis/connection/lettuce/LettuceConnectionFactoryTests.java index c54b303c2..e9f46501f 100644 --- a/src/test/java/org/springframework/data/redis/connection/lettuce/LettuceConnectionFactoryTests.java +++ b/src/test/java/org/springframework/data/redis/connection/lettuce/LettuceConnectionFactoryTests.java @@ -41,7 +41,7 @@ import org.springframework.data.redis.RedisSystemException; import org.springframework.data.redis.SettingsUtils; import org.springframework.data.redis.connection.DefaultStringRedisConnection; import org.springframework.data.redis.connection.RedisConnection; -import org.springframework.data.redis.connection.RedisStaticMasterSlaveConfiguration; +import org.springframework.data.redis.connection.RedisStaticMasterReplicaConfiguration; import org.springframework.data.redis.connection.RedisStandaloneConfiguration; import org.springframework.data.redis.connection.StringRedisConnection; @@ -385,8 +385,8 @@ public class LettuceConnectionFactoryTests { factory.destroy(); } - @Test // DATAREDIS-762 - public void factoryUsesElastiCacheMasterSlaveConnections() { + @Test // DATAREDIS-762, DATAREDIS-869 + public void factoryUsesElastiCacheMasterReplicaConnections() { assumeThat(String.format("No slaves connected to %s:%s.", SettingsUtils.getHost(), SettingsUtils.getPort()), connection.info("replication").getProperty("connected_slaves", "0").compareTo("0") > 0, is(true)); @@ -394,7 +394,7 @@ public class LettuceConnectionFactoryTests { LettuceClientConfiguration configuration = LettuceTestClientConfiguration.builder().readFrom(ReadFrom.SLAVE) .build(); - RedisStaticMasterSlaveConfiguration elastiCache = new RedisStaticMasterSlaveConfiguration(SettingsUtils.getHost()) + RedisStaticMasterReplicaConfiguration elastiCache = new RedisStaticMasterReplicaConfiguration(SettingsUtils.getHost()) .node(SettingsUtils.getHost(), SettingsUtils.getPort() + 1); LettuceConnectionFactory factory = new LettuceConnectionFactory(elastiCache, @@ -413,16 +413,16 @@ public class LettuceConnectionFactoryTests { factory.destroy(); } - @Test // DATAREDIS-762 + @Test // DATAREDIS-762, DATAREDIS-869 public void factoryUsesElastiCacheMasterWithoutMaster() { - assumeThat(String.format("No slaves connected to %s:%s.", SettingsUtils.getHost(), SettingsUtils.getPort()), + assumeThat(String.format("No replicas connected to %s:%s.", SettingsUtils.getHost(), SettingsUtils.getPort()), connection.info("replication").getProperty("connected_slaves", "0").compareTo("0") > 0, is(true)); LettuceClientConfiguration configuration = LettuceTestClientConfiguration.builder().readFrom(ReadFrom.MASTER) .build(); - RedisStaticMasterSlaveConfiguration elastiCache = new RedisStaticMasterSlaveConfiguration(SettingsUtils.getHost(), + RedisStaticMasterReplicaConfiguration elastiCache = new RedisStaticMasterReplicaConfiguration(SettingsUtils.getHost(), SettingsUtils.getPort() + 1); LettuceConnectionFactory factory = new LettuceConnectionFactory(elastiCache, configuration); @@ -444,10 +444,10 @@ public class LettuceConnectionFactoryTests { factory.destroy(); } - @Test // DATAREDIS-580 - public void factoryUsesMasterSlaveConnections() { + @Test // DATAREDIS-580, DATAREDIS-869 + public void factoryUsesMasterReplicaConnections() { - assumeThat(String.format("No slaves connected to %s:%s.", SettingsUtils.getHost(), SettingsUtils.getPort()), + assumeThat(String.format("No replicas connected to %s:%s.", SettingsUtils.getHost(), SettingsUtils.getPort()), connection.info("replication").getProperty("connected_slaves", "0").compareTo("0") > 0, is(true)); LettuceClientConfiguration configuration = LettuceTestClientConfiguration.builder().readFrom(ReadFrom.SLAVE)