-
Notifications
You must be signed in to change notification settings - Fork 3.9k
Closed
Milestone
Description
Jedis.java
@Override
public void close() {
if (dataSource != null) {
if (client.isBroken()) {
this.dataSource.returnBrokenResource(this);
} else {
this.dataSource.
returnResource(this);
}
this.dataSource = null; // <-- This line
} else {
super.close();
}
}
JedisSentinelPool.java
@Override
public Jedis getResource() {
while (true) {
Jedis jedis = super.getResource();
jedis.setDataSource(this); // <-- This line
// get a reference because it can change concurrently
final HostAndPort master = currentHostMaster;
final HostAndPort connection = new HostAndPort(jedis.getClient().getHost(), jedis.getClient()
.getPort());
if (master.equals(connection)) {
// connected to the correct master
return jedis;
} else {
returnBrokenResource(jedis);
}
}
}
In the case of concurrency
-
Thread A return an object but not run to "this.dataSource = null" yet
-
Thread B borrow an object and set dataSource to this;
-
And Then Thread A run this.dataSource = null;
-
Finally Thread A will never returnResource because dataSource is null
Jedis version:
2.10.0