diff --git a/src/main/java/redis/clients/jedis/DefaultJedisClientConfig.java b/src/main/java/redis/clients/jedis/DefaultJedisClientConfig.java index f3a0d79cf6..f615ca5e34 100644 --- a/src/main/java/redis/clients/jedis/DefaultJedisClientConfig.java +++ b/src/main/java/redis/clients/jedis/DefaultJedisClientConfig.java @@ -1,5 +1,6 @@ package redis.clients.jedis; +import java.util.Objects; import javax.net.ssl.HostnameVerifier; import javax.net.ssl.SSLParameters; import javax.net.ssl.SSLSocketFactory; @@ -11,7 +12,7 @@ public final class DefaultJedisClientConfig implements JedisClientConfig { private final int infiniteSoTimeoutMillis; private final String user; - private final String password; + private volatile String password; private final int database; private final String clientName; @@ -65,6 +66,13 @@ public String getPassword() { return password; } + @Override + public synchronized void updatePassword(String password) { + if (!Objects.equals(this.password, password)) { + this.password = password; + } + } + @Override public int getDatabase() { return database; diff --git a/src/main/java/redis/clients/jedis/JedisClientConfig.java b/src/main/java/redis/clients/jedis/JedisClientConfig.java index a08cac6da2..e776aaf0d6 100644 --- a/src/main/java/redis/clients/jedis/JedisClientConfig.java +++ b/src/main/java/redis/clients/jedis/JedisClientConfig.java @@ -39,6 +39,9 @@ default String getPassword() { return null; } + default void updatePassword(String password) { + } + default int getDatabase() { return Protocol.DEFAULT_DATABASE; } diff --git a/src/main/java/redis/clients/jedis/JedisFactory.java b/src/main/java/redis/clients/jedis/JedisFactory.java index 8e28c0555a..c9ad312f95 100644 --- a/src/main/java/redis/clients/jedis/JedisFactory.java +++ b/src/main/java/redis/clients/jedis/JedisFactory.java @@ -20,7 +20,7 @@ /** * PoolableObjectFactory custom impl. */ -class JedisFactory implements PooledObjectFactory { +public class JedisFactory implements PooledObjectFactory { private static final Logger logger = LoggerFactory.getLogger(JedisFactory.class); @@ -28,45 +28,62 @@ class JedisFactory implements PooledObjectFactory { private final JedisClientConfig config; - JedisFactory(final String host, final int port, final int connectionTimeout, + protected JedisFactory(final String host, final int port, final int connectionTimeout, final int soTimeout, final String password, final int database, final String clientName) { this(host, port, connectionTimeout, soTimeout, password, database, clientName, false, null, null, null); } - JedisFactory(final String host, final int port, final int connectionTimeout, + protected JedisFactory(final String host, final int port, final int connectionTimeout, final int soTimeout, final String user, final String password, final int database, final String clientName) { this(host, port, connectionTimeout, soTimeout, 0, user, password, database, clientName); } - JedisFactory(final String host, final int port, final int connectionTimeout, final int soTimeout, + protected JedisFactory(final String host, final int port, final int connectionTimeout, final int soTimeout, final int infiniteSoTimeout, final String user, final String password, final int database, final String clientName) { this(host, port, connectionTimeout, soTimeout, infiniteSoTimeout, user, password, database, clientName, false, null, null, null); } - JedisFactory(final String host, final int port, final int connectionTimeout, + /** + * {@link #setHostAndPort(redis.clients.jedis.HostAndPort) setHostAndPort} must be called later. + */ + protected JedisFactory(final int connectionTimeout, final int soTimeout, final int infiniteSoTimeout, + final String user, final String password, final int database, final String clientName) { + this(connectionTimeout, soTimeout, infiniteSoTimeout, user, password, database, clientName, false, null, null, null); + } + + protected JedisFactory(final String host, final int port, final int connectionTimeout, final int soTimeout, final String password, final int database, final String clientName, final boolean ssl, final SSLSocketFactory sslSocketFactory, final SSLParameters sslParameters, final HostnameVerifier hostnameVerifier) { this(host, port, connectionTimeout, soTimeout, null, password, database, clientName, ssl, sslSocketFactory, sslParameters, hostnameVerifier); } - JedisFactory(final String host, final int port, final int connectionTimeout, + protected JedisFactory(final String host, final int port, final int connectionTimeout, final int soTimeout, final String user, final String password, final int database, final String clientName, final boolean ssl, final SSLSocketFactory sslSocketFactory, final SSLParameters sslParameters, final HostnameVerifier hostnameVerifier) { this(host, port, connectionTimeout, soTimeout, 0, user, password, database, clientName, ssl, sslSocketFactory, sslParameters, hostnameVerifier); } - JedisFactory(final HostAndPort hostAndPort, final JedisClientConfig clientConfig) { + protected JedisFactory(final HostAndPort hostAndPort, final JedisClientConfig clientConfig) { this.hostAndPort.set(hostAndPort); this.config = DefaultJedisClientConfig.copyConfig(clientConfig); } - JedisFactory(final String host, final int port, final int connectionTimeout, final int soTimeout, + protected JedisFactory(final String host, final int port, final int connectionTimeout, final int soTimeout, final int infiniteSoTimeout, final String user, final String password, final int database, final String clientName, final boolean ssl, final SSLSocketFactory sslSocketFactory, final SSLParameters sslParameters, final HostnameVerifier hostnameVerifier) { + this(connectionTimeout, soTimeout, infiniteSoTimeout, user, password, database, clientName, ssl, sslSocketFactory, sslParameters, hostnameVerifier); this.hostAndPort.set(new HostAndPort(host, port)); + } + + /** + * {@link #setHostAndPort(redis.clients.jedis.HostAndPort) setHostAndPort} must be called later. + */ + protected JedisFactory(final int connectionTimeout, final int soTimeout, final int infiniteSoTimeout, + final String user, final String password, final int database, final String clientName, final boolean ssl, + final SSLSocketFactory sslSocketFactory, final SSLParameters sslParameters, final HostnameVerifier hostnameVerifier) { this.config = DefaultJedisClientConfig.builder().withConnectionTimeoutMillis(connectionTimeout) .withSoTimeoutMillis(soTimeout).withInfiniteSoTimeoutMillis(infiniteSoTimeout).withUser(user) .withPassword(password).withDatabse(database).withClientName(clientName) @@ -74,18 +91,18 @@ class JedisFactory implements PooledObjectFactory { .withSslParameters(sslParameters).withHostnameVerifier(hostnameVerifier).build(); } - JedisFactory(final URI uri, final int connectionTimeout, final int soTimeout, + protected JedisFactory(final URI uri, final int connectionTimeout, final int soTimeout, final String clientName) { this(uri, connectionTimeout, soTimeout, clientName, null, null, null); } - JedisFactory(final URI uri, final int connectionTimeout, final int soTimeout, + protected JedisFactory(final URI uri, final int connectionTimeout, final int soTimeout, final String clientName, final SSLSocketFactory sslSocketFactory, final SSLParameters sslParameters, final HostnameVerifier hostnameVerifier) { this(uri, connectionTimeout, soTimeout, 0, clientName, sslSocketFactory, sslParameters, hostnameVerifier); } - JedisFactory(final URI uri, final int connectionTimeout, final int soTimeout, + protected JedisFactory(final URI uri, final int connectionTimeout, final int soTimeout, final int infiniteSoTimeout, final String clientName, final SSLSocketFactory sslSocketFactory, final SSLParameters sslParameters, final HostnameVerifier hostnameVerifier) { if (!JedisURIHelper.isValid(uri)) { @@ -105,6 +122,10 @@ public void setHostAndPort(final HostAndPort hostAndPort) { this.hostAndPort.set(hostAndPort); } + public void setPassword(final String password) { + this.config.updatePassword(password); + } + @Override public void activateObject(PooledObject pooledJedis) throws Exception { final BinaryJedis jedis = pooledJedis.getObject(); diff --git a/src/main/java/redis/clients/jedis/JedisPool.java b/src/main/java/redis/clients/jedis/JedisPool.java index ea93127689..184bace837 100644 --- a/src/main/java/redis/clients/jedis/JedisPool.java +++ b/src/main/java/redis/clients/jedis/JedisPool.java @@ -5,6 +5,7 @@ import javax.net.ssl.SSLParameters; import javax.net.ssl.SSLSocketFactory; +import org.apache.commons.pool2.PooledObjectFactory; import org.apache.commons.pool2.impl.GenericObjectPoolConfig; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -27,29 +28,43 @@ public JedisPool(String host, int port) { this(new GenericObjectPoolConfig(), host, port); } - public JedisPool(final String host) { - URI uri = URI.create(host); + /** + * @param url + * @deprecated This constructor will not accept a host string in future. It will accept only a uri + * string. You can use {@link JedisURIHelper#isValid(java.net.URI)} before this. + */ + @Deprecated + public JedisPool(final String url) { + URI uri = URI.create(url); if (JedisURIHelper.isValid(uri)) { initPool(new GenericObjectPoolConfig(), new JedisFactory(uri, Protocol.DEFAULT_TIMEOUT, Protocol.DEFAULT_TIMEOUT, null)); } else { - initPool(new GenericObjectPoolConfig(), - new JedisFactory(host, Protocol.DEFAULT_PORT, Protocol.DEFAULT_TIMEOUT, - Protocol.DEFAULT_TIMEOUT, null, Protocol.DEFAULT_DATABASE, null)); + initPool(new GenericObjectPoolConfig(), new JedisFactory(url, Protocol.DEFAULT_PORT, + Protocol.DEFAULT_TIMEOUT, Protocol.DEFAULT_TIMEOUT, null, Protocol.DEFAULT_DATABASE, null)); } } - public JedisPool(final String host, final SSLSocketFactory sslSocketFactory, + /** + * @param url + * @param sslSocketFactory + * @param sslParameters + * @param hostnameVerifier + * @deprecated This constructor will not accept a host string in future. It will accept only a uri + * string. You can use {@link JedisURIHelper#isValid(java.net.URI)} before this. + */ + @Deprecated + public JedisPool(final String url, final SSLSocketFactory sslSocketFactory, final SSLParameters sslParameters, final HostnameVerifier hostnameVerifier) { - URI uri = URI.create(host); + URI uri = URI.create(url); if (JedisURIHelper.isValid(uri)) { initPool(new GenericObjectPoolConfig(), new JedisFactory(uri, Protocol.DEFAULT_TIMEOUT, Protocol.DEFAULT_TIMEOUT, null, sslSocketFactory, sslParameters, hostnameVerifier)); } else { - initPool(new GenericObjectPoolConfig(), new JedisFactory(host, Protocol.DEFAULT_PORT, - Protocol.DEFAULT_TIMEOUT, Protocol.DEFAULT_TIMEOUT, null, Protocol.DEFAULT_DATABASE, - null, false, null, null, null)); + initPool(new GenericObjectPoolConfig(), new JedisFactory(url, Protocol.DEFAULT_PORT, + Protocol.DEFAULT_TIMEOUT, Protocol.DEFAULT_TIMEOUT, null, Protocol.DEFAULT_DATABASE, null, + false, null, null, null)); } } @@ -337,6 +352,10 @@ public JedisPool(final GenericObjectPoolConfig poolConfig, final URI uri, sslSocketFactory, sslParameters, hostnameVerifier)); } + public JedisPool(GenericObjectPoolConfig poolConfig, PooledObjectFactory factory) { + super(poolConfig, factory); + } + @Override public Jedis getResource() { Jedis jedis = super.getResource(); diff --git a/src/main/java/redis/clients/jedis/JedisPoolAbstract.java b/src/main/java/redis/clients/jedis/JedisPoolAbstract.java index 2f1b495cd1..42623d4a1e 100644 --- a/src/main/java/redis/clients/jedis/JedisPoolAbstract.java +++ b/src/main/java/redis/clients/jedis/JedisPoolAbstract.java @@ -12,6 +12,12 @@ @Deprecated public class JedisPoolAbstract extends Pool { + /** + * Using this constructor means you have to set and initialize the internalPool yourself. + * + * @deprecated This constructor will be removed in future. + */ + @Deprecated public JedisPoolAbstract() { super(); } diff --git a/src/main/java/redis/clients/jedis/JedisSentinelPool.java b/src/main/java/redis/clients/jedis/JedisSentinelPool.java index 53ec9c6fdc..142bdd478b 100644 --- a/src/main/java/redis/clients/jedis/JedisSentinelPool.java +++ b/src/main/java/redis/clients/jedis/JedisSentinelPool.java @@ -22,25 +22,25 @@ public class JedisSentinelPool extends JedisPoolAbstract { protected static Logger log = LoggerFactory.getLogger(JedisSentinelPool.class); protected final GenericObjectPoolConfig poolConfig; + private final JedisFactory factory; - protected final int connectionTimeout; - protected final int soTimeout; - protected final int infiniteSoTimeout; + @Deprecated protected int connectionTimeout; + @Deprecated protected int soTimeout; + @Deprecated protected int infiniteSoTimeout; - protected final String user; - protected final String password; - protected final int database; - protected final String clientName; + @Deprecated protected String user; + @Deprecated protected String password; + @Deprecated protected int database; + @Deprecated protected String clientName; - protected int sentinelConnectionTimeout; - protected int sentinelSoTimeout; - protected String sentinelUser; - protected String sentinelPassword; - protected String sentinelClientName; + @Deprecated protected int sentinelConnectionTimeout; + @Deprecated protected int sentinelSoTimeout; + @Deprecated protected String sentinelUser; + @Deprecated protected String sentinelPassword; + @Deprecated protected String sentinelClientName; protected final Set masterListeners = new HashSet<>(); - private volatile JedisFactory factory; private volatile HostAndPort currentHostMaster; private final Object initPoolLock = new Object(); @@ -160,8 +160,7 @@ public JedisSentinelPool(String masterName, Set sentinels, final String user, final String password, final int database, final String clientName, final int sentinelConnectionTimeout, final int sentinelSoTimeout, final String sentinelUser, final String sentinelPassword, final String sentinelClientName) { - - this.poolConfig = poolConfig; + this(masterName, sentinels, poolConfig, new JedisFactory(connectionTimeout, soTimeout, infiniteSoTimeout, user, password, database, clientName)); this.connectionTimeout = connectionTimeout; this.soTimeout = soTimeout; this.infiniteSoTimeout = infiniteSoTimeout; @@ -174,9 +173,16 @@ public JedisSentinelPool(String masterName, Set sentinels, this.sentinelUser = sentinelUser; this.sentinelPassword = sentinelPassword; this.sentinelClientName = sentinelClientName; + } + + public JedisSentinelPool(String masterName, Set sentinels, + final GenericObjectPoolConfig poolConfig, final JedisFactory factory) { + super(poolConfig, factory); + this.poolConfig = poolConfig; + this.factory = factory; HostAndPort master = initSentinels(sentinels, masterName); - initPool(master); + initMaster(master); } @Override @@ -192,22 +198,16 @@ public HostAndPort getCurrentHostMaster() { return currentHostMaster; } - private void initPool(HostAndPort master) { - synchronized(initPoolLock){ + private void initMaster(HostAndPort master) { + synchronized (initPoolLock) { if (!master.equals(currentHostMaster)) { currentHostMaster = master; - if (factory == null) { - factory = new JedisFactory(master.getHost(), master.getPort(), connectionTimeout, - soTimeout, infiniteSoTimeout, user, password, database, clientName); - initPool(poolConfig, factory); - } else { - factory.setHostAndPort(currentHostMaster); - // although we clear the pool, we still have to check the returned object in getResource, - // this call only clears idle instances, not borrowed instances - clearInternalPool(); - } + factory.setHostAndPort(currentHostMaster); + // although we clear the pool, we still have to check the returned object in getResource, + // this call only clears idle instances, not borrowed instances + clearInternalPool(); - log.info("Created JedisPool to master at {}", master); + log.info("Created JedisSentinelPool to master at {}", master); } } } @@ -224,8 +224,7 @@ private HostAndPort initSentinels(Set sentinels, final String masterName log.debug("Connecting to Sentinel {}", hap); - - try (Jedis jedis = new Jedis(hap.getHost(), hap.getPort(), sentinelConnectionTimeout, sentinelSoTimeout)){ + try (Jedis jedis = new Jedis(hap.getHost(), hap.getPort(), sentinelConnectionTimeout, sentinelSoTimeout)) { if (sentinelUser != null) { jedis.auth(sentinelUser, sentinelPassword); } else if (sentinelPassword != null) { @@ -249,10 +248,8 @@ private HostAndPort initSentinels(Set sentinels, final String masterName log.debug("Found Redis master at {}", master); break; } catch (JedisException e) { - // resolves #1036, it should handle JedisException there's another chance - // of raising JedisDataException - log.warn( - "Cannot get master address from sentinel running @ {}. Reason: {}. Trying next one.", hap, e); + // resolves #1036, it should handle JedisException there's another chance of raising JedisDataException + log.warn("Cannot get master address from sentinel running @ {}. Reason: {}. Trying next one.", hap, e); } } @@ -375,7 +372,7 @@ public void run() { if (masterAddr == null || masterAddr.size() != 2) { log.warn("Can not get master addr, master name: {}. Sentinel: {}:{}.", masterName, host, port); } else { - initPool(toHostAndPort(masterAddr)); + initMaster(toHostAndPort(masterAddr)); } j.subscribe(new JedisPubSub() { @@ -388,7 +385,7 @@ public void onMessage(String channel, String message) { if (switchMasterMsg.length > 3) { if (masterName.equals(switchMasterMsg[0])) { - initPool(toHostAndPort(Arrays.asList(switchMasterMsg[3], switchMasterMsg[4]))); + initMaster(toHostAndPort(Arrays.asList(switchMasterMsg[3], switchMasterMsg[4]))); } else { log.debug( "Ignoring message on +switch-master for master name {}, our master name is {}", diff --git a/src/main/java/redis/clients/jedis/util/Pool.java b/src/main/java/redis/clients/jedis/util/Pool.java index 9640731e3d..57e8b87e2f 100644 --- a/src/main/java/redis/clients/jedis/util/Pool.java +++ b/src/main/java/redis/clients/jedis/util/Pool.java @@ -21,7 +21,10 @@ public abstract class Pool implements Closeable { /** * Using this constructor means you have to set and initialize the internalPool yourself. + * + * @deprecated This constructor will be removed in future. */ + @Deprecated public Pool() { } @@ -38,6 +41,12 @@ public boolean isClosed() { return this.internalPool.isClosed(); } + /** + * @param poolConfig + * @param factory + * @deprecated This method will be private in future. + */ + @Deprecated public void initPool(final GenericObjectPoolConfig poolConfig, PooledObjectFactory factory) { if (this.internalPool != null) { @@ -50,9 +59,14 @@ public void initPool(final GenericObjectPoolConfig poolConfig, PooledObjectFa this.internalPool = new GenericObjectPool<>(factory, poolConfig); } + /** + * This call only clears idle instances, not borrowed instances. + */ protected void clearInternalPool() { - if (internalPool != null) { - internalPool.clear(); + try { + this.internalPool.clear(); + } catch (Exception e) { + throw new JedisException("Could not clear the pool", e); } } diff --git a/src/test/java/redis/clients/jedis/tests/JedisPoolTest.java b/src/test/java/redis/clients/jedis/tests/JedisPoolTest.java index 77d5fe9718..39777884be 100644 --- a/src/test/java/redis/clients/jedis/tests/JedisPoolTest.java +++ b/src/test/java/redis/clients/jedis/tests/JedisPoolTest.java @@ -2,6 +2,7 @@ import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNull; +import static org.junit.Assert.assertSame; import static org.junit.Assert.assertTrue; import static org.junit.Assert.fail; @@ -16,6 +17,7 @@ import redis.clients.jedis.HostAndPort; import redis.clients.jedis.Jedis; +import redis.clients.jedis.JedisFactory; import redis.clients.jedis.JedisPool; import redis.clients.jedis.JedisPoolConfig; import redis.clients.jedis.Transaction; @@ -383,4 +385,49 @@ private int getClientCount(final String clientList) { return clientList.split("\n").length; } + @Test + public void testResetInvalidPassword() { + JedisFactory factory = new JedisFactory(hnp.getHost(), hnp.getPort(), 2000, 2000, + "foobared", 0, "my_shiny_client_name") { }; + + try (JedisPool pool = new JedisPool(new JedisPoolConfig(), factory)) { + Jedis obj1_ref; + try (Jedis obj1_1 = pool.getResource()) { + obj1_ref = obj1_1; + obj1_1.set("foo", "bar"); + assertEquals("bar", obj1_1.get("foo")); + assertEquals(1, pool.getNumActive()); + } + assertEquals(0, pool.getNumActive()); + try (Jedis obj1_2 = pool.getResource()) { + assertSame(obj1_ref, obj1_2); + assertEquals(1, pool.getNumActive()); + factory.setPassword("wrong password"); + try (Jedis obj2 = pool.getResource()) { + fail("Should not get resource from pool"); + } catch (JedisConnectionException e) { } + assertEquals(1, pool.getNumActive()); + } + assertEquals(0, pool.getNumActive()); + } + } + + @Test + public void testResetValidPassword() { + JedisFactory factory = new JedisFactory(hnp.getHost(), hnp.getPort(), 2000, 2000, + "bad password", 0, "my_shiny_client_name") { }; + + try (JedisPool pool = new JedisPool(new JedisPoolConfig(), factory)) { + try (Jedis obj1 = pool.getResource()) { + fail("Should not get resource from pool"); + } catch (JedisConnectionException e) { } + assertEquals(0, pool.getNumActive()); + + factory.setPassword("foobared"); + try (Jedis obj2 = pool.getResource()) { + obj2.set("foo", "bar"); + assertEquals("bar", obj2.get("foo")); + } + } + } } diff --git a/src/test/java/redis/clients/jedis/tests/JedisPoolWithCompleteCredentialsTest.java b/src/test/java/redis/clients/jedis/tests/JedisPoolWithCompleteCredentialsTest.java index 667589a86a..173a0b3790 100644 --- a/src/test/java/redis/clients/jedis/tests/JedisPoolWithCompleteCredentialsTest.java +++ b/src/test/java/redis/clients/jedis/tests/JedisPoolWithCompleteCredentialsTest.java @@ -2,6 +2,7 @@ import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNull; +import static org.junit.Assert.assertSame; import static org.junit.Assert.assertTrue; import static org.junit.Assert.fail; @@ -14,10 +15,12 @@ import redis.clients.jedis.DefaultJedisClientConfig; import redis.clients.jedis.HostAndPort; import redis.clients.jedis.Jedis; +import redis.clients.jedis.JedisFactory; import redis.clients.jedis.JedisPool; import redis.clients.jedis.JedisPoolConfig; import redis.clients.jedis.Protocol; import redis.clients.jedis.exceptions.InvalidURIException; +import redis.clients.jedis.exceptions.JedisConnectionException; import redis.clients.jedis.exceptions.JedisExhaustedPoolException; import redis.clients.jedis.tests.utils.RedisVersionUtil; @@ -276,4 +279,49 @@ private int getClientCount(final String clientList) { return clientList.split("\n").length; } + @Test + public void testResetInvalidPassword() { + JedisFactory factory = new JedisFactory(hnp.getHost(), hnp.getPort(), 2000, 2000, + "acljedis", "fizzbuzz", 0, "my_shiny_client_name") { }; + + try (JedisPool pool = new JedisPool(new JedisPoolConfig(), factory)) { + Jedis obj1_ref; + try (Jedis obj1_1 = pool.getResource()) { + obj1_ref = obj1_1; + obj1_1.set("foo", "bar"); + assertEquals("bar", obj1_1.get("foo")); + assertEquals(1, pool.getNumActive()); + } + assertEquals(0, pool.getNumActive()); + try (Jedis obj1_2 = pool.getResource()) { + assertSame(obj1_ref, obj1_2); + assertEquals(1, pool.getNumActive()); + factory.setPassword("wrong password"); + try (Jedis obj2 = pool.getResource()) { + fail("Should not get resource from pool"); + } catch (JedisConnectionException jce) { } + assertEquals(1, pool.getNumActive()); + } + assertEquals(0, pool.getNumActive()); + } + } + + @Test + public void testResetValidPassword() { + JedisFactory factory = new JedisFactory(hnp.getHost(), hnp.getPort(), 2000, 2000, + "acljedis", "bad password", 0, "my_shiny_client_name") { }; + + try (JedisPool pool = new JedisPool(new JedisPoolConfig(), factory)) { + try (Jedis obj1 = pool.getResource()) { + fail("Should not get resource from pool"); + } catch (JedisConnectionException e) { } + assertEquals(0, pool.getNumActive()); + + factory.setPassword("fizzbuzz"); + try (Jedis obj2 = pool.getResource()) { + obj2.set("foo", "bar"); + assertEquals("bar", obj2.get("foo")); + } + } + } } diff --git a/src/test/java/redis/clients/jedis/tests/JedisSentinelPoolTest.java b/src/test/java/redis/clients/jedis/tests/JedisSentinelPoolTest.java index 01f25ee570..ba3e3aa7e1 100644 --- a/src/test/java/redis/clients/jedis/tests/JedisSentinelPoolTest.java +++ b/src/test/java/redis/clients/jedis/tests/JedisSentinelPoolTest.java @@ -3,6 +3,7 @@ import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; import static org.junit.Assert.assertSame; +import static org.junit.Assert.fail; import java.util.HashSet; import java.util.Set; @@ -18,6 +19,8 @@ import redis.clients.jedis.HostAndPort; import redis.clients.jedis.Jedis; +import redis.clients.jedis.JedisFactory; +import redis.clients.jedis.JedisPoolConfig; import redis.clients.jedis.JedisSentinelPool; import redis.clients.jedis.Transaction; import redis.clients.jedis.exceptions.JedisConnectionException; @@ -164,6 +167,44 @@ public void customClientName() { assertTrue(pool.isClosed()); } + @Test + public void testResetInvalidPassword() { + JedisFactory factory = new JedisFactory(null, 0, 2000, 2000, "foobared", 0, "my_shiny_client_name") { }; + + try (JedisSentinelPool pool = new JedisSentinelPool(MASTER_NAME, sentinels, new JedisPoolConfig(), factory)) { + Jedis obj1_ref; + try (Jedis obj1_1 = pool.getResource()) { + obj1_ref = obj1_1; + obj1_1.set("foo", "bar"); + assertEquals("bar", obj1_1.get("foo")); + } + try (Jedis obj1_2 = pool.getResource()) { + assertSame(obj1_ref, obj1_2); + factory.setPassword("wrong password"); + try (Jedis obj2 = pool.getResource()) { + fail("Should not get resource from pool"); + } catch (JedisConnectionException e) { } + } + } + } + + @Test + public void testResetValidPassword() { + JedisFactory factory = new JedisFactory(null, 0, 2000, 2000, "wrong password", 0, "my_shiny_client_name") { }; + + try (JedisSentinelPool pool = new JedisSentinelPool(MASTER_NAME, sentinels, new JedisPoolConfig(), factory)) { + try (Jedis obj1 = pool.getResource()) { + fail("Should not get resource from pool"); + } catch (JedisConnectionException e) { } + + factory.setPassword("foobared"); + try (Jedis obj2 = pool.getResource()) { + obj2.set("foo", "bar"); + assertEquals("bar", obj2.get("foo")); + } + } + } + @Test public void ensureSafeTwiceFailover() throws InterruptedException { JedisSentinelPool pool = new JedisSentinelPool(MASTER_NAME, sentinels,