-
Notifications
You must be signed in to change notification settings - Fork 3.9k
Closed
Milestone
Description
JedisSentinelPool.initPool() is called concurrently by multiple threads during statup: The thread creating JedisSentinelPool and MasterListener. The consequence is that calls to getResource() fail with an exception.
Reproduction of the issue requires just the right timing so calling the offending code in a while(true) loop allows reproduction instead of single-shot execution.
Jedis version: 3.0.0
redis.clients.jedis.exceptions.JedisConnectionException: Could not get a resource from the pool
at redis.clients.jedis.util.Pool.getResource(Pool.java:59)
at redis.clients.jedis.JedisSentinelPool.getResource(JedisSentinelPool.java:209)
at org.springframework.data.redis.connection.jedis.Reproducer.reproduceSentinelPoolRaceCondition(Reproducer.java:43)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50)
at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47)
at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:78)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57)
at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)
at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)
at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)
at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
at org.junit.runner.JUnitCore.run(JUnitCore.java:137)
at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:68)
at com.intellij.rt.execution.junit.IdeaTestRunner$Repeater.startRunnerWithArgs(IdeaTestRunner.java:47)
at com.intellij.rt.execution.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:242)
at com.intellij.rt.execution.junit.JUnitStarter.main(JUnitStarter.java:70)
Caused by: java.lang.NullPointerException
at redis.clients.jedis.util.Pool.getResource(Pool.java:50)
... 24 more
Reproducer
public class Reproducer {
@Test
public void reproduceSentinelPoolRaceCondition() {
while (true) {
GenericObjectPoolConfig poolConfig = new JedisPoolConfig();
JedisSentinelPool jedisSentinelPool = new JedisSentinelPool("mymaster",
new HashSet<>(Arrays.asList("127.0.0.1:26379", "127.0.0.1:26380")),
poolConfig, 1000, 1000, null, 0,
"jedis-client");
jedisSentinelPool.getResource().close();
jedisSentinelPool.destroy();
}
}
}Metadata
Metadata
Assignees
Labels
No labels