diff --git a/src/main/java/redis/clients/jedis/JedisSentinelPool.java b/src/main/java/redis/clients/jedis/JedisSentinelPool.java index 72602ee..6b07fc4 100644 --- a/src/main/java/redis/clients/jedis/JedisSentinelPool.java +++ b/src/main/java/redis/clients/jedis/JedisSentinelPool.java @@ -130,10 +130,17 @@ public class JedisSentinelPool extends Pool { try { Jedis jedis = new Jedis(hap.getHost(), hap.getPort()); - if (master == null) { - master = toHostAndPort(jedis - .sentinelGetMasterAddrByName(masterName)); + List masterAddr = jedis + .sentinelGetMasterAddrByName(masterName); + if (masterAddr == null || masterAddr.size() != 2) { + log.warning("Can not get master addr, master name: " + + masterName + ". Sentinel: " + hap + "."); + jedis.disconnect(); + continue; + } + + master = toHostAndPort(masterAddr); log.fine("Found Redis master at " + master); jedis.disconnect(); break outer; diff --git a/src/test/java/redis/clients/jedis/tests/JedisSentinelPoolTest.java b/src/test/java/redis/clients/jedis/tests/JedisSentinelPoolTest.java index 437c80a..b1bd468 100644 --- a/src/test/java/redis/clients/jedis/tests/JedisSentinelPoolTest.java +++ b/src/test/java/redis/clients/jedis/tests/JedisSentinelPoolTest.java @@ -2,6 +2,7 @@ package redis.clients.jedis.tests; import java.util.HashSet; import java.util.Set; +import java.util.concurrent.TimeUnit; import org.apache.commons.pool2.impl.GenericObjectPoolConfig; import org.junit.Before; @@ -35,6 +36,29 @@ public class JedisSentinelPoolTest extends JedisTestBase { sentinelJedis1 = new Jedis(sentinel1.getHost(), sentinel1.getPort()); } + @Test + public void errorMasterNameNotThrowException() throws InterruptedException { + final String wrongMasterName = "wrongMasterName"; + new Thread(new Runnable() { + @Override + public void run() { + try { + TimeUnit.SECONDS.sleep(3); + sentinelJedis1.sentinelMonitor(wrongMasterName, + "127.0.0.1", master.getPort(), 2); + } catch (InterruptedException e) { + e.printStackTrace(); + } + + } + }).start(); + + JedisSentinelPool pool = new JedisSentinelPool(wrongMasterName, + sentinels); + pool.destroy(); + sentinelJedis1.sentinelRemove(wrongMasterName); + } + @Test public void ensureSafeTwiceFailover() throws InterruptedException { JedisSentinelPool pool = new JedisSentinelPool(MASTER_NAME, sentinels,