diff --git a/src/main/java/redis/clients/jedis/BinaryShardedJedis.java b/src/main/java/redis/clients/jedis/BinaryShardedJedis.java index 56630d5..6ecbe27 100644 --- a/src/main/java/redis/clients/jedis/BinaryShardedJedis.java +++ b/src/main/java/redis/clients/jedis/BinaryShardedJedis.java @@ -31,8 +31,8 @@ public class BinaryShardedJedis extends Sharded } public void disconnect() throws IOException { - for (JedisShardInfo jedis : getAllShards()) { - jedis.getResource().disconnect(); + for (Jedis jedis : getAllShards()) { + jedis.disconnect(); } } diff --git a/src/main/java/redis/clients/jedis/ShardedJedis.java b/src/main/java/redis/clients/jedis/ShardedJedis.java index 719e7de..7f66529 100644 --- a/src/main/java/redis/clients/jedis/ShardedJedis.java +++ b/src/main/java/redis/clients/jedis/ShardedJedis.java @@ -29,9 +29,9 @@ public class ShardedJedis extends BinaryShardedJedis implements JedisCommands { } public void disconnect() throws IOException { - for (JedisShardInfo jedis : getAllShards()) { - jedis.getResource().quit(); - jedis.getResource().disconnect(); + for (Jedis jedis : getAllShards()) { + jedis.quit(); + jedis.disconnect(); } } diff --git a/src/main/java/redis/clients/jedis/ShardedJedisPool.java b/src/main/java/redis/clients/jedis/ShardedJedisPool.java index f80fd54..5c8d207 100644 --- a/src/main/java/redis/clients/jedis/ShardedJedisPool.java +++ b/src/main/java/redis/clients/jedis/ShardedJedisPool.java @@ -51,9 +51,9 @@ public class ShardedJedisPool extends Pool { boolean done = false; while (!done) { try { - for (JedisShardInfo shard : jedis.getAllShards()) { - if (!shard.getResource().isConnected()) { - shard.getResource().connect(); + for (Jedis shard : jedis.getAllShards()) { + if (!shard.isConnected()) { + shard.connect(); } } done = true; @@ -82,9 +82,8 @@ public class ShardedJedisPool extends Pool { public boolean validateObject(final Object obj) { try { ShardedJedis jedis = (ShardedJedis) obj; - for (JedisShardInfo shard : jedis.getAllShards()) { - if (!shard.getResource().isConnected() - || !shard.getResource().ping().equals("PONG")) { + for (Jedis shard : jedis.getAllShards()) { + if (!shard.isConnected() || !shard.ping().equals("PONG")) { return false; } } diff --git a/src/main/java/redis/clients/util/ShardInfo.java b/src/main/java/redis/clients/util/ShardInfo.java index 25c050c..fbb1158 100644 --- a/src/main/java/redis/clients/util/ShardInfo.java +++ b/src/main/java/redis/clients/util/ShardInfo.java @@ -1,8 +1,6 @@ package redis.clients.util; public abstract class ShardInfo { - private T resource; - private int weight; public ShardInfo() { @@ -16,13 +14,5 @@ public abstract class ShardInfo { return this.weight; } - public T getResource() { - return resource; - } - - public void initResource () { - resource = createResource(); - } - protected abstract T createResource(); } diff --git a/src/main/java/redis/clients/util/Sharded.java b/src/main/java/redis/clients/util/Sharded.java index 41a15ef..5c04dad 100644 --- a/src/main/java/redis/clients/util/Sharded.java +++ b/src/main/java/redis/clients/util/Sharded.java @@ -2,8 +2,10 @@ package redis.clients.util; import java.util.Collection; import java.util.Collections; +import java.util.HashMap; import java.util.Iterator; import java.util.List; +import java.util.Map; import java.util.TreeMap; import java.util.Map.Entry; import java.util.regex.Matcher; @@ -14,6 +16,7 @@ public class Sharded> { public static final int DEFAULT_WEIGHT = 1; private TreeMap nodes; private final Hashing algo; + private final Map, R> resources = new HashMap, R>(); /** * The default pattern used for extracting a key tag. The pattern must have @@ -63,7 +66,7 @@ public class Sharded> { long floor = Long.MIN_VALUE; for (int i = 0; i != shards.size(); ++i) { final S shardInfo = shards.get(i); - shardInfo.initResource(); + resources.put(shardInfo, shardInfo.createResource()); nodes.put(floor, shardInfo); floor += 4 * oneForthOfStep * shardInfo.getWeight(); // *4 to // compensate @@ -72,11 +75,11 @@ public class Sharded> { } public R getShard(byte[] key) { - return getShardInfo(key).getResource(); + return resources.get(getShardInfo(key)); } public R getShard(String key) { - return getShardInfo(key).getResource(); + return resources.get(getShardInfo(key)); } private S getShardInfo(byte[] key) { @@ -111,7 +114,11 @@ public class Sharded> { return key; } - public Collection getAllShards() { + public Collection getAllShardInfo() { return Collections.unmodifiableCollection(nodes.values()); } + + public Collection getAllShards() { + return Collections.unmodifiableCollection(resources.values()); + } } \ No newline at end of file diff --git a/src/test/java/redis/clients/jedis/tests/ShardedJedisPoolTest.java b/src/test/java/redis/clients/jedis/tests/ShardedJedisPoolTest.java index 6523591..da04abe 100644 --- a/src/test/java/redis/clients/jedis/tests/ShardedJedisPoolTest.java +++ b/src/test/java/redis/clients/jedis/tests/ShardedJedisPoolTest.java @@ -103,4 +103,18 @@ public class ShardedJedisPoolTest extends Assert { ShardedJedis newJedis = pool.getResource(); newJedis.incr("foo"); } + + @Test + public void shouldNotShareInstances() throws Exception { + Config config = new Config(); + config.maxActive = 2; + config.whenExhaustedAction = GenericObjectPool.WHEN_EXHAUSTED_FAIL; + + ShardedJedisPool pool = new ShardedJedisPool(config, shards); + + ShardedJedis j1 = pool.getResource(); + ShardedJedis j2 = pool.getResource(); + + assertNotSame(j1.getShard("foo"), j2.getShard("foo")); + } } \ No newline at end of file diff --git a/src/test/java/redis/clients/jedis/tests/benchmark/ShardedBenchmark.java b/src/test/java/redis/clients/jedis/tests/benchmark/ShardedBenchmark.java index f0e6b09..206bde5 100644 --- a/src/test/java/redis/clients/jedis/tests/benchmark/ShardedBenchmark.java +++ b/src/test/java/redis/clients/jedis/tests/benchmark/ShardedBenchmark.java @@ -7,6 +7,7 @@ import java.util.Calendar; import java.util.Collection; import java.util.List; +import redis.clients.jedis.Jedis; import redis.clients.jedis.JedisShardInfo; import redis.clients.jedis.ShardedJedis; import redis.clients.jedis.tests.HostAndPortUtil; @@ -18,32 +19,32 @@ public class ShardedBenchmark { private static final int TOTAL_OPERATIONS = 100000; public static void main(String[] args) throws UnknownHostException, - IOException { - List shards = new ArrayList(); - JedisShardInfo shard = new JedisShardInfo(hnp1.host, hnp1.port); - shard.setPassword("foobared"); - shards.add(shard); - shard = new JedisShardInfo(hnp2.host, hnp2.port); - shard.setPassword("foobared"); - shards.add(shard); - ShardedJedis jedis = new ShardedJedis(shards); - Collection allShards = jedis.getAllShards(); - for (JedisShardInfo jedisShardInfo : allShards) { - jedisShardInfo.getResource().flushAll(); - } + IOException { + List shards = new ArrayList(); + JedisShardInfo shard = new JedisShardInfo(hnp1.host, hnp1.port); + shard.setPassword("foobared"); + shards.add(shard); + shard = new JedisShardInfo(hnp2.host, hnp2.port); + shard.setPassword("foobared"); + shards.add(shard); + ShardedJedis jedis = new ShardedJedis(shards); + Collection allShards = jedis.getAllShards(); + for (Jedis j : allShards) { + j.flushAll(); + } - long begin = Calendar.getInstance().getTimeInMillis(); + long begin = Calendar.getInstance().getTimeInMillis(); - for (int n = 0; n <= TOTAL_OPERATIONS; n++) { - String key = "foo" + n; - jedis.set(key, "bar" + n); - jedis.get(key); - } + for (int n = 0; n <= TOTAL_OPERATIONS; n++) { + String key = "foo" + n; + jedis.set(key, "bar" + n); + jedis.get(key); + } - long elapsed = Calendar.getInstance().getTimeInMillis() - begin; + long elapsed = Calendar.getInstance().getTimeInMillis() - begin; - jedis.disconnect(); + jedis.disconnect(); - System.out.println(((1000 * 2 * TOTAL_OPERATIONS) / elapsed) + " ops"); + System.out.println(((1000 * 2 * TOTAL_OPERATIONS) / elapsed) + " ops"); } } \ No newline at end of file