From 726c3151b67c194d84c22e2e80fd3099249eecb7 Mon Sep 17 00:00:00 2001 From: Marcos Nils Date: Sun, 8 Dec 2013 01:08:14 -0300 Subject: [PATCH] Add RedisSlot helper to calculate key slot --- .../clients/jedis/tests/JedisClusterTest.java | 21 +++++++++++++--- .../clients/jedis/tests/utils/RedisSlot.java | 25 +++++++++++++++++++ 2 files changed, 43 insertions(+), 3 deletions(-) create mode 100644 src/test/java/redis/clients/jedis/tests/utils/RedisSlot.java diff --git a/src/test/java/redis/clients/jedis/tests/JedisClusterTest.java b/src/test/java/redis/clients/jedis/tests/JedisClusterTest.java index 68ad4eb..6e4a7cf 100644 --- a/src/test/java/redis/clients/jedis/tests/JedisClusterTest.java +++ b/src/test/java/redis/clients/jedis/tests/JedisClusterTest.java @@ -12,6 +12,7 @@ import redis.clients.jedis.Jedis; import redis.clients.jedis.JedisCluster; import redis.clients.jedis.Pipeline; import redis.clients.jedis.exceptions.JedisMovedDataException; +import redis.clients.jedis.tests.utils.RedisSlot; public class JedisClusterTest extends Assert { private Jedis node1; @@ -68,8 +69,22 @@ public class JedisClusterTest extends Assert { jc.get("foo"); } - @Test - public void ask() { - //TODO: needs to implement +// @Test +// public void ask() { +// JedisCluster jc = new JedisCluster(new HashSet(HostAndPortUtil.getClusterServers())); +// jc.set("foo", "bar"); +// int keySlot = RedisSlot.getSlot("foo"); +// String node2Id = getNodeId(node2.clusterNodes()); +// node1.clusterSetSlotMigrating(keySlot, node2Id); +// node1.get("foo"); +// } + + private String getNodeId(String infoOutput) { + for (String infoLine : infoOutput.split("\n")) { + if (infoLine.contains("myself")) { + return infoLine.split(" ")[0]; + } + } + return ""; } } \ No newline at end of file diff --git a/src/test/java/redis/clients/jedis/tests/utils/RedisSlot.java b/src/test/java/redis/clients/jedis/tests/utils/RedisSlot.java new file mode 100644 index 0000000..1dd76c3 --- /dev/null +++ b/src/test/java/redis/clients/jedis/tests/utils/RedisSlot.java @@ -0,0 +1,25 @@ +package redis.clients.jedis.tests.utils; + +public class RedisSlot { + public final static int polynomial = 0x1021; // Represents x^16+x^12+x^5+1 + static int crc; + + public RedisSlot(){ + crc = 0x0000; + } + + public static int getSlot(String key) { + for (byte b : key.getBytes()) { + for (int i = 0; i < 8; i++) { + boolean bit = ((b >> (7-i) & 1) == 1); + boolean c15 = ((crc >> 15 & 1) == 1); + crc <<= 1; + // If coefficient of bit and remainder polynomial = 1 xor crc with polynomial + if (c15 ^ bit) crc ^= polynomial; + } + } + + return crc &= 0xffff % 16384; + } + +} \ No newline at end of file