From 8b3c5fdf4252bd3f10210d3650466930ab54b24f Mon Sep 17 00:00:00 2001 From: Dario Guzik Date: Wed, 2 Mar 2011 17:44:59 -0300 Subject: [PATCH 1/3] Generate keys for different shards --- .../clients/jedis/tests/ShardedJedisTest.java | 40 ++++++++++++++----- 1 file changed, 30 insertions(+), 10 deletions(-) diff --git a/src/test/java/redis/clients/jedis/tests/ShardedJedisTest.java b/src/test/java/redis/clients/jedis/tests/ShardedJedisTest.java index 4972042..ca9e535 100644 --- a/src/test/java/redis/clients/jedis/tests/ShardedJedisTest.java +++ b/src/test/java/redis/clients/jedis/tests/ShardedJedisTest.java @@ -22,14 +22,31 @@ public class ShardedJedisTest extends Assert { private static HostAndPort redis2 = HostAndPortUtil.getRedisServers() .get(1); + private List getKeysDifferentShard(ShardedJedis jedis) { + List ret = new ArrayList (); + JedisShardInfo first = jedis.getShardInfo("a0"); + ret.add("a0"); + for (int i =1; i < 100; ++i) { + JedisShardInfo actual = jedis.getShardInfo("a" + i); + if (actual != first) { + ret.add("a" + i); + break; + + } + + } + return ret; + } + @Test public void checkSharding() { List shards = new ArrayList(); shards.add(new JedisShardInfo(redis1.host, redis1.port)); shards.add(new JedisShardInfo(redis2.host, redis2.port)); ShardedJedis jedis = new ShardedJedis(shards); - JedisShardInfo s1 = jedis.getShardInfo("a1"); - JedisShardInfo s2 = jedis.getShardInfo("b2"); + List keys = getKeysDifferentShard(jedis); + JedisShardInfo s1 = jedis.getShardInfo(keys.get(0)); + JedisShardInfo s2 = jedis.getShardInfo(keys.get(1)); assertNotSame(s1, s2); } @@ -108,8 +125,9 @@ public class ShardedJedisTest extends Assert { JedisShardInfo s2 = jedis.getShardInfo("foo{bar}"); assertSame(s1, s2); - JedisShardInfo s3 = jedis.getShardInfo("a112"); - JedisShardInfo s4 = jedis.getShardInfo("b112"); + List keys = getKeysDifferentShard(jedis); + JedisShardInfo s3 = jedis.getShardInfo(keys.get(0)); + JedisShardInfo s4 = jedis.getShardInfo(keys.get(1)); assertNotSame(s3, s4); ShardedJedis jedis2 = new ShardedJedis(shards); @@ -131,15 +149,16 @@ public class ShardedJedisTest extends Assert { shards.get(1).setPassword("foobared"); ShardedJedis jedis = new ShardedJedis(shards); - jedis.set("a112", "a"); - jedis.set("b112", "b"); + final List keys = getKeysDifferentShard(jedis); + jedis.set(keys.get(0), "a"); + jedis.set(keys.get(1), "b"); - assertNotSame(jedis.getShard("a112"), jedis.getShard("b112")); + assertNotSame(jedis.getShard(keys.get(0)), jedis.getShard(keys.get(1))); List results = jedis.pipelined(new ShardedJedisPipeline() { public void execute() { - get("a112"); - get("b112"); + get(keys.get(0)); + get(keys.get(1)); } }); @@ -221,4 +240,5 @@ public class ShardedJedisTest extends Assert { assertTrue(shard_6380 > 300 && shard_6380 < 400); assertTrue(shard_6381 > 300 && shard_6381 < 400); } -} \ No newline at end of file +} + From 2785604639c7f5444af9fdd5075ee9d8bf3f46bc Mon Sep 17 00:00:00 2001 From: Dario Guzik Date: Wed, 2 Mar 2011 17:50:12 -0300 Subject: [PATCH 2/3] Fix test keys --- src/test/java/redis/clients/jedis/tests/ShardedJedisTest.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/test/java/redis/clients/jedis/tests/ShardedJedisTest.java b/src/test/java/redis/clients/jedis/tests/ShardedJedisTest.java index ca9e535..3f41c00 100644 --- a/src/test/java/redis/clients/jedis/tests/ShardedJedisTest.java +++ b/src/test/java/redis/clients/jedis/tests/ShardedJedisTest.java @@ -135,8 +135,8 @@ public class ShardedJedisTest extends Assert { assertEquals(jedis2.getKeyTag("foo"), "foo"); assertNotSame(jedis2.getKeyTag("foo{bar}"), "bar"); - JedisShardInfo s5 = jedis2.getShardInfo("foo{bar}"); - JedisShardInfo s6 = jedis2.getShardInfo("abc{bar}"); + JedisShardInfo s5 = jedis2.getShardInfo(keys.get(0)+"{bar}"); + JedisShardInfo s6 = jedis2.getShardInfo(keys.get(1)+"{bar}"); assertNotSame(s5, s6); } From 3d1603b59b1a3aeb50d8a2f166a08bb13bf18ed1 Mon Sep 17 00:00:00 2001 From: Dario Guzik Date: Wed, 2 Mar 2011 17:53:27 -0300 Subject: [PATCH 3/3] Generate shard nodes by shard position. Shards are now host/port independent --- src/main/java/redis/clients/util/Sharded.java | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/main/java/redis/clients/util/Sharded.java b/src/main/java/redis/clients/util/Sharded.java index 0f7849e..e24bc93 100644 --- a/src/main/java/redis/clients/util/Sharded.java +++ b/src/main/java/redis/clients/util/Sharded.java @@ -56,7 +56,7 @@ public class Sharded> { for (int i = 0; i != shards.size(); ++i) { final S shardInfo = shards.get(i); for (int n = 0; n < 160 * shardInfo.getWeight(); n++) { - nodes.put(this.algo.hash(shardInfo.toString() + n), shardInfo); + nodes.put(this.algo.hash("SHARD-" + i + "-NODE-" + n), shardInfo); } resources.put(shardInfo, shardInfo.createResource()); } @@ -85,7 +85,7 @@ public class Sharded> { /** * A key tag is a special pattern inside a key that, if preset, is the only * part of the key hashed in order to select the server for this key. - * + * * @see http://code.google.com/p/redis/wiki/FAQ#I * 'm_using_some_form_of_key_hashing_for_partitioning,_but_wh * @param key @@ -107,4 +107,5 @@ public class Sharded> { public Collection getAllShards() { return Collections.unmodifiableCollection(resources.values()); } -} \ No newline at end of file +} +