Skip to content

Commit 256434e

Browse files
committed
Preserve atomicity of setHostAndPort method
- Add copy() to JedisSocketFactory interface
1 parent 89d8ca6 commit 256434e

File tree

4 files changed

+31
-12
lines changed

4 files changed

+31
-12
lines changed

src/main/java/redis/clients/jedis/DefaultJedisSocketFactory.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -121,4 +121,12 @@ public int getSoTimeout() {
121121
public void setSoTimeout(int soTimeout) {
122122
this.soTimeout = soTimeout;
123123
}
124+
125+
@Override
126+
public JedisSocketFactory copy() {
127+
return new DefaultJedisSocketFactory(
128+
this.host, this.port, this.connectionTimeout, this.soTimeout,
129+
this.ssl, this.sslSocketFactory, this.sslParameters, this.hostnameVerifier
130+
);
131+
}
124132
}

src/main/java/redis/clients/jedis/JedisFactory.java

Lines changed: 16 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package redis.clients.jedis;
22

33
import java.net.URI;
4+
import java.util.concurrent.atomic.AtomicReference;
45

56
import javax.net.ssl.HostnameVerifier;
67
import javax.net.ssl.SSLParameters;
@@ -18,14 +19,14 @@
1819
* PoolableObjectFactory custom impl.
1920
*/
2021
class JedisFactory implements PooledObjectFactory<Jedis> {
21-
private final JedisSocketFactory jedisSocketFactory;
22+
private final AtomicReference<JedisSocketFactory> jedisSocketFactory;
2223
private final String user;
2324
private final String password;
2425
private final int database;
2526
private final String clientName;
2627

2728
JedisFactory(final JedisSocketFactory jedisSocketFactory, final String user, final String password, final int database, final String clientName) {
28-
this.jedisSocketFactory = jedisSocketFactory;
29+
this.jedisSocketFactory = new AtomicReference<>(jedisSocketFactory);
2930
this.user = user;
3031
this.password = password;
3132
this.database = database;
@@ -73,20 +74,22 @@ class JedisFactory implements PooledObjectFactory<Jedis> {
7374
"Cannot open Redis connection due invalid URI. %s", uri.toString()));
7475
}
7576

76-
this.jedisSocketFactory = new DefaultJedisSocketFactory(
77-
uri.getHost(), uri.getPort(), connectionTimeout, soTimeout,
78-
JedisURIHelper.isRedisSSLScheme(uri), sslSocketFactory,
79-
sslParameters, hostnameVerifier
80-
);
77+
this.jedisSocketFactory = new AtomicReference<JedisSocketFactory>(new DefaultJedisSocketFactory(
78+
uri.getHost(), uri.getPort(), connectionTimeout, soTimeout,
79+
JedisURIHelper.isRedisSSLScheme(uri), sslSocketFactory,
80+
sslParameters, hostnameVerifier
81+
));
8182
this.user = JedisURIHelper.getUser(uri);
8283
this.password = JedisURIHelper.getPassword(uri);
8384
this.database = JedisURIHelper.getDBIndex(uri);
8485
this.clientName = clientName;
8586
}
8687

8788
public void setHostAndPort(final HostAndPort hostAndPort) {
88-
jedisSocketFactory.setHost(hostAndPort.getHost());
89-
jedisSocketFactory.setPort(hostAndPort.getPort());
89+
JedisSocketFactory newFactory = jedisSocketFactory.get().copy();
90+
newFactory.setHost(hostAndPort.getHost());
91+
newFactory.setPort(hostAndPort.getPort());
92+
jedisSocketFactory.set(newFactory);
9093
}
9194

9295
@Override
@@ -114,7 +117,7 @@ public void destroyObject(PooledObject<Jedis> pooledJedis) throws Exception {
114117

115118
@Override
116119
public PooledObject<Jedis> makeObject() throws Exception {
117-
final Jedis jedis = new Jedis(jedisSocketFactory);
120+
final Jedis jedis = new Jedis(jedisSocketFactory.get());
118121
try {
119122
jedis.connect();
120123
if (user != null) {
@@ -145,8 +148,9 @@ public void passivateObject(PooledObject<Jedis> pooledJedis) throws Exception {
145148
public boolean validateObject(PooledObject<Jedis> pooledJedis) {
146149
final BinaryJedis jedis = pooledJedis.getObject();
147150
try {
148-
String host = jedisSocketFactory.getHost();
149-
int port = jedisSocketFactory.getPort();
151+
JedisSocketFactory factory = this.jedisSocketFactory.get();
152+
String host = factory.getHost();
153+
int port = factory.getPort();
150154

151155
String connectionHost = jedis.getClient().getHost();
152156
int connectionPort = jedis.getClient().getPort();

src/main/java/redis/clients/jedis/JedisSocketFactory.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,4 +34,6 @@ public interface JedisSocketFactory {
3434
int getSoTimeout();
3535

3636
void setSoTimeout(int soTimeout);
37+
38+
JedisSocketFactory copy();
3739
}

src/test/java/redis/clients/jedis/tests/UdsTest.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -82,5 +82,10 @@ public int getSoTimeout() {
8282
@Override
8383
public void setSoTimeout(int soTimeout) {
8484
}
85+
86+
@Override
87+
public JedisSocketFactory copy() {
88+
return this;
89+
}
8590
}
8691
}

0 commit comments

Comments
 (0)