From dd0bbdaf9182f5d32c43ce0902b1a99f366c238e Mon Sep 17 00:00:00 2001 From: Marcos Nils Date: Fri, 3 Jan 2014 16:42:21 -0300 Subject: [PATCH] Several changes have been added to this commit: - Add asking to cluster commands - Make jedis cluster return connection to original pool - Add tests for MOVED and ASK cluster responses - Refactor connection handler to recalculate connections based on slots This commit makes the first usable version of Jedis along with Redis Cluster --- .../redis/clients/jedis/BinaryClient.java | 3 + src/main/java/redis/clients/jedis/Jedis.java | 6 + .../redis/clients/jedis/JedisCluster.java | 464 +++++++++--------- .../clients/jedis/JedisClusterCommand.java | 22 +- .../jedis/JedisClusterConnectionHandler.java | 12 +- .../jedis/JedisRandomConnectionHandler.java | 14 +- .../JedisSlotBasedConnectionHandler.java | 38 +- .../java/redis/clients/jedis/Protocol.java | 21 +- .../exceptions/JedisAskDataException.java | 23 +- .../clients/jedis/tests/JedisClusterTest.java | 11 +- 10 files changed, 349 insertions(+), 265 deletions(-) diff --git a/src/main/java/redis/clients/jedis/BinaryClient.java b/src/main/java/redis/clients/jedis/BinaryClient.java index 1b9db49..fd10d38 100644 --- a/src/main/java/redis/clients/jedis/BinaryClient.java +++ b/src/main/java/redis/clients/jedis/BinaryClient.java @@ -1104,5 +1104,8 @@ public class BinaryClient extends Connection { public void cluster(final byte[]... args) { sendCommand(CLUSTER, args); } + public void asking() { + sendCommand(Command.ASKING); + } } diff --git a/src/main/java/redis/clients/jedis/Jedis.java b/src/main/java/redis/clients/jedis/Jedis.java index c6add77..83a4a1b 100644 --- a/src/main/java/redis/clients/jedis/Jedis.java +++ b/src/main/java/redis/clients/jedis/Jedis.java @@ -3130,4 +3130,10 @@ public class Jedis extends BinaryJedis implements JedisCommands, MultiKeyCommand client.clusterSetSlotImporting(slot, nodeId); return client.getStatusCodeReply(); } + + public String asking() { + checkIsInMulti(); + client.asking(); + return client.getStatusCodeReply(); + } } diff --git a/src/main/java/redis/clients/jedis/JedisCluster.java b/src/main/java/redis/clients/jedis/JedisCluster.java index b654be7..be33412 100644 --- a/src/main/java/redis/clients/jedis/JedisCluster.java +++ b/src/main/java/redis/clients/jedis/JedisCluster.java @@ -29,9 +29,9 @@ public class JedisCluster implements JedisCommands, BasicCommands { return new JedisClusterCommand(connectionHandler) { @Override public String execute() { - return connectionHandler.getConnection(key).set(key, value); + return connectionHandler.getConnection().set(key, value); } - }.run(); + }.run(key); } @Override @@ -39,9 +39,9 @@ public class JedisCluster implements JedisCommands, BasicCommands { return new JedisClusterCommand(connectionHandler) { @Override public String execute() { - return connectionHandler.getConnection(key).get(key); + return connectionHandler.getConnection().get(key); } - }.run(); + }.run(key); } @Override @@ -49,9 +49,9 @@ public class JedisCluster implements JedisCommands, BasicCommands { return new JedisClusterCommand(connectionHandler) { @Override public Boolean execute() { - return connectionHandler.getConnection(key).exists(key); + return connectionHandler.getConnection().exists(key); } - }.run(); + }.run(key); } @Override @@ -59,9 +59,9 @@ public class JedisCluster implements JedisCommands, BasicCommands { return new JedisClusterCommand(connectionHandler) { @Override public Long execute() { - return connectionHandler.getConnection(key).persist(key); + return connectionHandler.getConnection().persist(key); } - }.run(); + }.run(key); } @Override @@ -69,9 +69,9 @@ public class JedisCluster implements JedisCommands, BasicCommands { return new JedisClusterCommand(connectionHandler) { @Override public String execute() { - return connectionHandler.getConnection(key).type(key); + return connectionHandler.getConnection().type(key); } - }.run(); + }.run(key); } @Override @@ -79,9 +79,9 @@ public class JedisCluster implements JedisCommands, BasicCommands { return new JedisClusterCommand(connectionHandler) { @Override public Long execute() { - return connectionHandler.getConnection(key).expire(key, seconds); + return connectionHandler.getConnection().expire(key, seconds); } - }.run(); + }.run(key); } @Override @@ -89,9 +89,9 @@ public class JedisCluster implements JedisCommands, BasicCommands { return new JedisClusterCommand(connectionHandler) { @Override public Long execute() { - return connectionHandler.getConnection(key).expireAt(key, unixTime); + return connectionHandler.getConnection().expireAt(key, unixTime); } - }.run(); + }.run(key); } @Override @@ -99,9 +99,9 @@ public class JedisCluster implements JedisCommands, BasicCommands { return new JedisClusterCommand(connectionHandler) { @Override public Long execute() { - return connectionHandler.getConnection(key).ttl(key); + return connectionHandler.getConnection().ttl(key); } - }.run(); + }.run(key); } @Override @@ -109,9 +109,9 @@ public class JedisCluster implements JedisCommands, BasicCommands { return new JedisClusterCommand(connectionHandler) { @Override public Boolean execute() { - return connectionHandler.getConnection(key).setbit(key, offset, value); + return connectionHandler.getConnection().setbit(key, offset, value); } - }.run(); + }.run(key); } @Override @@ -119,9 +119,9 @@ public class JedisCluster implements JedisCommands, BasicCommands { return new JedisClusterCommand(connectionHandler) { @Override public Boolean execute() { - return connectionHandler.getConnection(key).setbit(key, offset, value); + return connectionHandler.getConnection().setbit(key, offset, value); } - }.run(); + }.run(key); } @Override @@ -129,9 +129,9 @@ public class JedisCluster implements JedisCommands, BasicCommands { return new JedisClusterCommand(connectionHandler) { @Override public Boolean execute() { - return connectionHandler.getConnection(key).getbit(key, offset); + return connectionHandler.getConnection().getbit(key, offset); } - }.run(); + }.run(key); } @Override @@ -139,9 +139,9 @@ public class JedisCluster implements JedisCommands, BasicCommands { return new JedisClusterCommand(connectionHandler) { @Override public Long execute() { - return connectionHandler.getConnection(key).setrange(key, offset, value); + return connectionHandler.getConnection().setrange(key, offset, value); } - }.run(); + }.run(key); } @Override @@ -149,9 +149,9 @@ public class JedisCluster implements JedisCommands, BasicCommands { return new JedisClusterCommand(connectionHandler) { @Override public String execute() { - return connectionHandler.getConnection(key).getrange(key, startOffset, endOffset); + return connectionHandler.getConnection().getrange(key, startOffset, endOffset); } - }.run(); + }.run(key); } @Override @@ -159,9 +159,9 @@ public class JedisCluster implements JedisCommands, BasicCommands { return new JedisClusterCommand(connectionHandler) { @Override public String execute() { - return connectionHandler.getConnection(key).getSet(key, value); + return connectionHandler.getConnection().getSet(key, value); } - }.run(); + }.run(key); } @Override @@ -169,9 +169,9 @@ public class JedisCluster implements JedisCommands, BasicCommands { return new JedisClusterCommand(connectionHandler) { @Override public Long execute() { - return connectionHandler.getConnection(key).setnx(key, value); + return connectionHandler.getConnection().setnx(key, value); } - }.run(); + }.run(key); } @Override @@ -179,9 +179,9 @@ public class JedisCluster implements JedisCommands, BasicCommands { return new JedisClusterCommand(connectionHandler) { @Override public String execute() { - return connectionHandler.getConnection(key).setex(key, seconds, value); + return connectionHandler.getConnection().setex(key, seconds, value); } - }.run(); + }.run(key); } @Override @@ -189,9 +189,9 @@ public class JedisCluster implements JedisCommands, BasicCommands { return new JedisClusterCommand(connectionHandler) { @Override public Long execute() { - return connectionHandler.getConnection(key).decrBy(key, integer); + return connectionHandler.getConnection().decrBy(key, integer); } - }.run(); + }.run(key); } @Override @@ -199,9 +199,9 @@ public class JedisCluster implements JedisCommands, BasicCommands { return new JedisClusterCommand(connectionHandler) { @Override public Long execute() { - return connectionHandler.getConnection(key).decr(key); + return connectionHandler.getConnection().decr(key); } - }.run(); + }.run(key); } @Override @@ -209,9 +209,9 @@ public class JedisCluster implements JedisCommands, BasicCommands { return new JedisClusterCommand(connectionHandler) { @Override public Long execute() { - return connectionHandler.getConnection(key).incrBy(key, integer); + return connectionHandler.getConnection().incrBy(key, integer); } - }.run(); + }.run(key); } @Override @@ -219,9 +219,9 @@ public class JedisCluster implements JedisCommands, BasicCommands { return new JedisClusterCommand(connectionHandler) { @Override public Long execute() { - return connectionHandler.getConnection(key).incr(key); + return connectionHandler.getConnection().incr(key); } - }.run(); + }.run(key); } @Override @@ -229,9 +229,9 @@ public class JedisCluster implements JedisCommands, BasicCommands { return new JedisClusterCommand(connectionHandler) { @Override public Long execute() { - return connectionHandler.getConnection(key).append(key, value); + return connectionHandler.getConnection().append(key, value); } - }.run(); + }.run(key); } @Override @@ -239,9 +239,9 @@ public class JedisCluster implements JedisCommands, BasicCommands { return new JedisClusterCommand(connectionHandler) { @Override public String execute() { - return connectionHandler.getConnection(key).substr(key, start, end); + return connectionHandler.getConnection().substr(key, start, end); } - }.run(); + }.run(key); } @Override @@ -249,9 +249,9 @@ public class JedisCluster implements JedisCommands, BasicCommands { return new JedisClusterCommand(connectionHandler) { @Override public Long execute() { - return connectionHandler.getConnection(key).hset(key, field, value); + return connectionHandler.getConnection().hset(key, field, value); } - }.run(); + }.run(key); } @Override @@ -259,9 +259,9 @@ public class JedisCluster implements JedisCommands, BasicCommands { return new JedisClusterCommand(connectionHandler) { @Override public String execute() { - return connectionHandler.getConnection(key).hget(key, field); + return connectionHandler.getConnection().hget(key, field); } - }.run(); + }.run(key); } @Override @@ -269,9 +269,9 @@ public class JedisCluster implements JedisCommands, BasicCommands { return new JedisClusterCommand(connectionHandler) { @Override public Long execute() { - return connectionHandler.getConnection(key).hsetnx(key, field, value); + return connectionHandler.getConnection().hsetnx(key, field, value); } - }.run(); + }.run(key); } @Override @@ -279,9 +279,9 @@ public class JedisCluster implements JedisCommands, BasicCommands { return new JedisClusterCommand(connectionHandler) { @Override public String execute() { - return connectionHandler.getConnection(key).hmset(key, hash); + return connectionHandler.getConnection().hmset(key, hash); } - }.run(); + }.run(key); } @Override @@ -289,9 +289,9 @@ public class JedisCluster implements JedisCommands, BasicCommands { return new JedisClusterCommand>(connectionHandler) { @Override public List execute() { - return connectionHandler.getConnection(key).hmget(key, fields); + return connectionHandler.getConnection().hmget(key, fields); } - }.run(); + }.run(key); } @Override @@ -299,9 +299,9 @@ public class JedisCluster implements JedisCommands, BasicCommands { return new JedisClusterCommand(connectionHandler) { @Override public Long execute() { - return connectionHandler.getConnection(key).hincrBy(key, field, value); + return connectionHandler.getConnection().hincrBy(key, field, value); } - }.run(); + }.run(key); } @Override @@ -309,9 +309,9 @@ public class JedisCluster implements JedisCommands, BasicCommands { return new JedisClusterCommand(connectionHandler) { @Override public Boolean execute() { - return connectionHandler.getConnection(key).hexists(key, field); + return connectionHandler.getConnection().hexists(key, field); } - }.run(); + }.run(key); } @Override @@ -319,9 +319,9 @@ public class JedisCluster implements JedisCommands, BasicCommands { return new JedisClusterCommand(connectionHandler) { @Override public Long execute() { - return connectionHandler.getConnection(key).hdel(key, field); + return connectionHandler.getConnection().hdel(key, field); } - }.run(); + }.run(key); } @Override @@ -329,9 +329,9 @@ public class JedisCluster implements JedisCommands, BasicCommands { return new JedisClusterCommand(connectionHandler) { @Override public Long execute() { - return connectionHandler.getConnection(key).hdel(key); + return connectionHandler.getConnection().hdel(key); } - }.run(); + }.run(key); } @Override @@ -339,9 +339,9 @@ public class JedisCluster implements JedisCommands, BasicCommands { return new JedisClusterCommand>(connectionHandler) { @Override public Set execute() { - return connectionHandler.getConnection(key).hkeys(key); + return connectionHandler.getConnection().hkeys(key); } - }.run(); + }.run(key); } @Override @@ -349,9 +349,9 @@ public class JedisCluster implements JedisCommands, BasicCommands { return new JedisClusterCommand>(connectionHandler) { @Override public List execute() { - return connectionHandler.getConnection(key).hvals(key); + return connectionHandler.getConnection().hvals(key); } - }.run(); + }.run(key); } @Override @@ -359,9 +359,9 @@ public class JedisCluster implements JedisCommands, BasicCommands { return new JedisClusterCommand>(connectionHandler) { @Override public Map execute() { - return connectionHandler.getConnection(key).hgetAll(key); + return connectionHandler.getConnection().hgetAll(key); } - }.run(); + }.run(key); } @Override @@ -369,9 +369,9 @@ public class JedisCluster implements JedisCommands, BasicCommands { return new JedisClusterCommand(connectionHandler) { @Override public Long execute() { - return connectionHandler.getConnection(key).rpush(key, string); + return connectionHandler.getConnection().rpush(key, string); } - }.run(); + }.run(key); } @Override @@ -379,9 +379,9 @@ public class JedisCluster implements JedisCommands, BasicCommands { return new JedisClusterCommand(connectionHandler) { @Override public Long execute() { - return connectionHandler.getConnection(key).lpush(key, string); + return connectionHandler.getConnection().lpush(key, string); } - }.run(); + }.run(key); } @Override @@ -389,9 +389,9 @@ public class JedisCluster implements JedisCommands, BasicCommands { return new JedisClusterCommand(connectionHandler) { @Override public Long execute() { - return connectionHandler.getConnection(key).llen(key); + return connectionHandler.getConnection().llen(key); } - }.run(); + }.run(key); } @Override @@ -399,9 +399,9 @@ public class JedisCluster implements JedisCommands, BasicCommands { return new JedisClusterCommand>(connectionHandler) { @Override public List execute() { - return connectionHandler.getConnection(key).lrange(key, start, end); + return connectionHandler.getConnection().lrange(key, start, end); } - }.run(); + }.run(key); } @Override @@ -409,9 +409,9 @@ public class JedisCluster implements JedisCommands, BasicCommands { return new JedisClusterCommand(connectionHandler) { @Override public String execute() { - return connectionHandler.getConnection(key).ltrim(key, start, end); + return connectionHandler.getConnection().ltrim(key, start, end); } - }.run(); + }.run(key); } @Override @@ -419,9 +419,9 @@ public class JedisCluster implements JedisCommands, BasicCommands { return new JedisClusterCommand(connectionHandler) { @Override public String execute() { - return connectionHandler.getConnection(key).lindex(key, index); + return connectionHandler.getConnection().lindex(key, index); } - }.run(); + }.run(key); } @Override @@ -429,9 +429,9 @@ public class JedisCluster implements JedisCommands, BasicCommands { return new JedisClusterCommand(connectionHandler) { @Override public String execute() { - return connectionHandler.getConnection(key).lset(key, index, value); + return connectionHandler.getConnection().lset(key, index, value); } - }.run(); + }.run(key); } @Override @@ -439,9 +439,9 @@ public class JedisCluster implements JedisCommands, BasicCommands { return new JedisClusterCommand(connectionHandler) { @Override public Long execute() { - return connectionHandler.getConnection(key).lrem(key, count, value); + return connectionHandler.getConnection().lrem(key, count, value); } - }.run(); + }.run(key); } @Override @@ -449,9 +449,9 @@ public class JedisCluster implements JedisCommands, BasicCommands { return new JedisClusterCommand(connectionHandler) { @Override public String execute() { - return connectionHandler.getConnection(key).lpop(key); + return connectionHandler.getConnection().lpop(key); } - }.run(); + }.run(key); } @Override @@ -459,9 +459,9 @@ public class JedisCluster implements JedisCommands, BasicCommands { return new JedisClusterCommand(connectionHandler) { @Override public String execute() { - return connectionHandler.getConnection(key).rpop(key); + return connectionHandler.getConnection().rpop(key); } - }.run(); + }.run(key); } @Override @@ -469,9 +469,9 @@ public class JedisCluster implements JedisCommands, BasicCommands { return new JedisClusterCommand(connectionHandler) { @Override public Long execute() { - return connectionHandler.getConnection(key).sadd(key, member); + return connectionHandler.getConnection().sadd(key, member); } - }.run(); + }.run(key); } @Override @@ -479,9 +479,9 @@ public class JedisCluster implements JedisCommands, BasicCommands { return new JedisClusterCommand>(connectionHandler) { @Override public Set execute() { - return connectionHandler.getConnection(key).smembers(key); + return connectionHandler.getConnection().smembers(key); } - }.run(); + }.run(key); } @Override @@ -489,9 +489,9 @@ public class JedisCluster implements JedisCommands, BasicCommands { return new JedisClusterCommand(connectionHandler) { @Override public Long execute() { - return connectionHandler.getConnection(key).srem(key, member); + return connectionHandler.getConnection().srem(key, member); } - }.run(); + }.run(key); } @Override @@ -499,9 +499,9 @@ public class JedisCluster implements JedisCommands, BasicCommands { return new JedisClusterCommand(connectionHandler) { @Override public String execute() { - return connectionHandler.getConnection(key).spop(key); + return connectionHandler.getConnection().spop(key); } - }.run(); + }.run(key); } @Override @@ -509,9 +509,9 @@ public class JedisCluster implements JedisCommands, BasicCommands { return new JedisClusterCommand(connectionHandler) { @Override public Long execute() { - return connectionHandler.getConnection(key).scard(key); + return connectionHandler.getConnection().scard(key); } - }.run(); + }.run(key); } @Override @@ -519,9 +519,9 @@ public class JedisCluster implements JedisCommands, BasicCommands { return new JedisClusterCommand(connectionHandler) { @Override public Boolean execute() { - return connectionHandler.getConnection(key).sismember(key, member); + return connectionHandler.getConnection().sismember(key, member); } - }.run(); + }.run(key); } @Override @@ -529,9 +529,9 @@ public class JedisCluster implements JedisCommands, BasicCommands { return new JedisClusterCommand(connectionHandler) { @Override public String execute() { - return connectionHandler.getConnection(key).srandmember(key); + return connectionHandler.getConnection().srandmember(key); } - }.run(); + }.run(key); } @Override @@ -539,9 +539,9 @@ public class JedisCluster implements JedisCommands, BasicCommands { return new JedisClusterCommand(connectionHandler) { @Override public Long execute() { - return connectionHandler.getConnection(key).strlen(key); + return connectionHandler.getConnection().strlen(key); } - }.run(); + }.run(key); } @Override @@ -549,9 +549,9 @@ public class JedisCluster implements JedisCommands, BasicCommands { return new JedisClusterCommand(connectionHandler) { @Override public Long execute() { - return connectionHandler.getConnection(key).zadd(key, score, member); + return connectionHandler.getConnection().zadd(key, score, member); } - }.run(); + }.run(key); } @Override @@ -559,9 +559,9 @@ public class JedisCluster implements JedisCommands, BasicCommands { return new JedisClusterCommand(connectionHandler) { @Override public Long execute() { - return connectionHandler.getConnection(key).zadd(key, scoreMembers); + return connectionHandler.getConnection().zadd(key, scoreMembers); } - }.run(); + }.run(key); } @Override @@ -569,9 +569,9 @@ public class JedisCluster implements JedisCommands, BasicCommands { return new JedisClusterCommand>(connectionHandler) { @Override public Set execute() { - return connectionHandler.getConnection(key).zrange(key, start, end); + return connectionHandler.getConnection().zrange(key, start, end); } - }.run(); + }.run(key); } @Override @@ -579,9 +579,9 @@ public class JedisCluster implements JedisCommands, BasicCommands { return new JedisClusterCommand(connectionHandler) { @Override public Long execute() { - return connectionHandler.getConnection(key).zrem(key, member); + return connectionHandler.getConnection().zrem(key, member); } - }.run(); + }.run(key); } @Override @@ -589,9 +589,9 @@ public class JedisCluster implements JedisCommands, BasicCommands { return new JedisClusterCommand(connectionHandler) { @Override public Double execute() { - return connectionHandler.getConnection(key).zincrby(key, score, member); + return connectionHandler.getConnection().zincrby(key, score, member); } - }.run(); + }.run(key); } @Override @@ -599,9 +599,9 @@ public class JedisCluster implements JedisCommands, BasicCommands { return new JedisClusterCommand(connectionHandler) { @Override public Long execute() { - return connectionHandler.getConnection(key).zrank(key, member); + return connectionHandler.getConnection().zrank(key, member); } - }.run(); + }.run(key); } @Override @@ -609,9 +609,9 @@ public class JedisCluster implements JedisCommands, BasicCommands { return new JedisClusterCommand(connectionHandler) { @Override public Long execute() { - return connectionHandler.getConnection(key).zrevrank(key, member); + return connectionHandler.getConnection().zrevrank(key, member); } - }.run(); + }.run(key); } @Override @@ -619,9 +619,9 @@ public class JedisCluster implements JedisCommands, BasicCommands { return new JedisClusterCommand>(connectionHandler) { @Override public Set execute() { - return connectionHandler.getConnection(key).zrevrange(key, start, end); + return connectionHandler.getConnection().zrevrange(key, start, end); } - }.run(); + }.run(key); } @Override @@ -629,9 +629,9 @@ public class JedisCluster implements JedisCommands, BasicCommands { return new JedisClusterCommand>(connectionHandler) { @Override public Set execute() { - return connectionHandler.getConnection(key).zrangeWithScores(key, start, end); + return connectionHandler.getConnection().zrangeWithScores(key, start, end); } - }.run(); + }.run(key); } @Override @@ -639,9 +639,9 @@ public class JedisCluster implements JedisCommands, BasicCommands { return new JedisClusterCommand>(connectionHandler) { @Override public Set execute() { - return connectionHandler.getConnection(key).zrevrangeWithScores(key, start, end); + return connectionHandler.getConnection().zrevrangeWithScores(key, start, end); } - }.run(); + }.run(key); } @Override @@ -649,9 +649,9 @@ public class JedisCluster implements JedisCommands, BasicCommands { return new JedisClusterCommand(connectionHandler) { @Override public Long execute() { - return connectionHandler.getConnection(key).zcard(key); + return connectionHandler.getConnection().zcard(key); } - }.run(); + }.run(key); } @Override @@ -659,9 +659,9 @@ public class JedisCluster implements JedisCommands, BasicCommands { return new JedisClusterCommand(connectionHandler) { @Override public Double execute() { - return connectionHandler.getConnection(key).zscore(key, member); + return connectionHandler.getConnection().zscore(key, member); } - }.run(); + }.run(key); } @Override @@ -669,9 +669,9 @@ public class JedisCluster implements JedisCommands, BasicCommands { return new JedisClusterCommand>(connectionHandler) { @Override public List execute() { - return connectionHandler.getConnection(key).sort(key); + return connectionHandler.getConnection().sort(key); } - }.run(); + }.run(key); } @Override @@ -679,9 +679,9 @@ public class JedisCluster implements JedisCommands, BasicCommands { return new JedisClusterCommand>(connectionHandler) { @Override public List execute() { - return connectionHandler.getConnection(key).sort(key, sortingParameters); + return connectionHandler.getConnection().sort(key, sortingParameters); } - }.run(); + }.run(key); } @Override @@ -689,9 +689,9 @@ public class JedisCluster implements JedisCommands, BasicCommands { return new JedisClusterCommand(connectionHandler) { @Override public Long execute() { - return connectionHandler.getConnection(key).zcount(key, min, max); + return connectionHandler.getConnection().zcount(key, min, max); } - }.run(); + }.run(key); } @Override @@ -699,9 +699,9 @@ public class JedisCluster implements JedisCommands, BasicCommands { return new JedisClusterCommand(connectionHandler) { @Override public Long execute() { - return connectionHandler.getConnection(key).zcount(key, min, max); + return connectionHandler.getConnection().zcount(key, min, max); } - }.run(); + }.run(key); } @Override @@ -709,9 +709,9 @@ public class JedisCluster implements JedisCommands, BasicCommands { return new JedisClusterCommand>(connectionHandler) { @Override public Set execute() { - return connectionHandler.getConnection(key).zrangeByScore(key, min, max); + return connectionHandler.getConnection().zrangeByScore(key, min, max); } - }.run(); + }.run(key); } @Override @@ -719,9 +719,9 @@ public class JedisCluster implements JedisCommands, BasicCommands { return new JedisClusterCommand>(connectionHandler) { @Override public Set execute() { - return connectionHandler.getConnection(key).zrangeByScore(key, min, max); + return connectionHandler.getConnection().zrangeByScore(key, min, max); } - }.run(); + }.run(key); } @Override @@ -729,9 +729,9 @@ public class JedisCluster implements JedisCommands, BasicCommands { return new JedisClusterCommand>(connectionHandler) { @Override public Set execute() { - return connectionHandler.getConnection(key).zrevrangeByScore(key, min, max); + return connectionHandler.getConnection().zrevrangeByScore(key, min, max); } - }.run(); + }.run(key); } @Override @@ -740,9 +740,9 @@ public class JedisCluster implements JedisCommands, BasicCommands { return new JedisClusterCommand>(connectionHandler) { @Override public Set execute() { - return connectionHandler.getConnection(key).zrangeByScore(key, min, max, offset, count); + return connectionHandler.getConnection().zrangeByScore(key, min, max, offset, count); } - }.run(); + }.run(key); } @Override @@ -750,9 +750,9 @@ public class JedisCluster implements JedisCommands, BasicCommands { return new JedisClusterCommand>(connectionHandler) { @Override public Set execute() { - return connectionHandler.getConnection(key).zrevrangeByScore(key, min, max); + return connectionHandler.getConnection().zrevrangeByScore(key, min, max); } - }.run(); + }.run(key); } @Override @@ -761,9 +761,9 @@ public class JedisCluster implements JedisCommands, BasicCommands { return new JedisClusterCommand>(connectionHandler) { @Override public Set execute() { - return connectionHandler.getConnection(key).zrangeByScore(key, min, max, offset, count); + return connectionHandler.getConnection().zrangeByScore(key, min, max, offset, count); } - }.run(); + }.run(key); } @Override @@ -772,9 +772,9 @@ public class JedisCluster implements JedisCommands, BasicCommands { return new JedisClusterCommand>(connectionHandler) { @Override public Set execute() { - return connectionHandler.getConnection(key).zrevrangeByScore(key, min, max, offset, count); + return connectionHandler.getConnection().zrevrangeByScore(key, min, max, offset, count); } - }.run(); + }.run(key); } @Override @@ -782,9 +782,9 @@ public class JedisCluster implements JedisCommands, BasicCommands { return new JedisClusterCommand>(connectionHandler) { @Override public Set execute() { - return connectionHandler.getConnection(key).zrangeByScoreWithScores(key, min, max); + return connectionHandler.getConnection().zrangeByScoreWithScores(key, min, max); } - }.run(); + }.run(key); } @Override @@ -792,9 +792,9 @@ public class JedisCluster implements JedisCommands, BasicCommands { return new JedisClusterCommand>(connectionHandler) { @Override public Set execute() { - return connectionHandler.getConnection(key).zrevrangeByScoreWithScores(key, min, max); + return connectionHandler.getConnection().zrevrangeByScoreWithScores(key, min, max); } - }.run(); + }.run(key); } @Override @@ -802,9 +802,9 @@ public class JedisCluster implements JedisCommands, BasicCommands { return new JedisClusterCommand>(connectionHandler) { @Override public Set execute() { - return connectionHandler.getConnection(key).zrangeByScoreWithScores(key, min, max, offset, count); + return connectionHandler.getConnection().zrangeByScoreWithScores(key, min, max, offset, count); } - }.run(); + }.run(key); } @Override @@ -813,9 +813,9 @@ public class JedisCluster implements JedisCommands, BasicCommands { return new JedisClusterCommand>(connectionHandler) { @Override public Set execute() { - return connectionHandler.getConnection(key).zrevrangeByScore(key, min, max, offset, count); + return connectionHandler.getConnection().zrevrangeByScore(key, min, max, offset, count); } - }.run(); + }.run(key); } @Override @@ -823,9 +823,9 @@ public class JedisCluster implements JedisCommands, BasicCommands { return new JedisClusterCommand>(connectionHandler) { @Override public Set execute() { - return connectionHandler.getConnection(key).zrangeByScoreWithScores(key, min, max); + return connectionHandler.getConnection().zrangeByScoreWithScores(key, min, max); } - }.run(); + }.run(key); } @Override @@ -834,9 +834,9 @@ public class JedisCluster implements JedisCommands, BasicCommands { return new JedisClusterCommand>(connectionHandler) { @Override public Set execute() { - return connectionHandler.getConnection(key).zrevrangeByScoreWithScores(key, min, max); + return connectionHandler.getConnection().zrevrangeByScoreWithScores(key, min, max); } - }.run(); + }.run(key); } @Override @@ -845,9 +845,9 @@ public class JedisCluster implements JedisCommands, BasicCommands { return new JedisClusterCommand>(connectionHandler) { @Override public Set execute() { - return connectionHandler.getConnection(key).zrangeByScoreWithScores(key, min, max, offset, count); + return connectionHandler.getConnection().zrangeByScoreWithScores(key, min, max, offset, count); } - }.run(); + }.run(key); } @Override @@ -856,9 +856,9 @@ public class JedisCluster implements JedisCommands, BasicCommands { return new JedisClusterCommand>(connectionHandler) { @Override public Set execute() { - return connectionHandler.getConnection(key).zrevrangeByScoreWithScores(key, max, min, offset, count); + return connectionHandler.getConnection().zrevrangeByScoreWithScores(key, max, min, offset, count); } - }.run(); + }.run(key); } @Override @@ -867,9 +867,9 @@ public class JedisCluster implements JedisCommands, BasicCommands { return new JedisClusterCommand>(connectionHandler) { @Override public Set execute() { - return connectionHandler.getConnection(key).zrevrangeByScoreWithScores(key, max, min, offset, count); + return connectionHandler.getConnection().zrevrangeByScoreWithScores(key, max, min, offset, count); } - }.run(); + }.run(key); } @Override @@ -877,9 +877,9 @@ public class JedisCluster implements JedisCommands, BasicCommands { return new JedisClusterCommand(connectionHandler) { @Override public Long execute() { - return connectionHandler.getConnection(key).zremrangeByRank(key, start, end); + return connectionHandler.getConnection().zremrangeByRank(key, start, end); } - }.run(); + }.run(key); } @Override @@ -887,9 +887,9 @@ public class JedisCluster implements JedisCommands, BasicCommands { return new JedisClusterCommand(connectionHandler) { @Override public Long execute() { - return connectionHandler.getConnection(key).zremrangeByScore(key, start, end); + return connectionHandler.getConnection().zremrangeByScore(key, start, end); } - }.run(); + }.run(key); } @Override @@ -897,9 +897,9 @@ public class JedisCluster implements JedisCommands, BasicCommands { return new JedisClusterCommand(connectionHandler) { @Override public Long execute() { - return connectionHandler.getConnection(key).zremrangeByScore(key, start, end); + return connectionHandler.getConnection().zremrangeByScore(key, start, end); } - }.run(); + }.run(key); } @Override @@ -908,9 +908,9 @@ public class JedisCluster implements JedisCommands, BasicCommands { return new JedisClusterCommand(connectionHandler) { @Override public Long execute() { - return connectionHandler.getConnection(key).linsert(key, where, pivot, value); + return connectionHandler.getConnection().linsert(key, where, pivot, value); } - }.run(); + }.run(key); } @Override @@ -918,9 +918,9 @@ public class JedisCluster implements JedisCommands, BasicCommands { return new JedisClusterCommand(connectionHandler) { @Override public Long execute() { - return connectionHandler.getConnection(key).lpushx(key, string); + return connectionHandler.getConnection().lpushx(key, string); } - }.run(); + }.run(key); } @Override @@ -928,9 +928,9 @@ public class JedisCluster implements JedisCommands, BasicCommands { return new JedisClusterCommand(connectionHandler) { @Override public Long execute() { - return connectionHandler.getConnection(key).rpushx(key, string); + return connectionHandler.getConnection().rpushx(key, string); } - }.run(); + }.run(key); } @Override @@ -938,9 +938,9 @@ public class JedisCluster implements JedisCommands, BasicCommands { return new JedisClusterCommand>(connectionHandler) { @Override public List execute() { - return connectionHandler.getConnection(null).blpop(arg); + return connectionHandler.getConnection().blpop(arg); } - }.run(); + }.run(null); } @Override @@ -948,9 +948,9 @@ public class JedisCluster implements JedisCommands, BasicCommands { return new JedisClusterCommand>(connectionHandler) { @Override public List execute() { - return connectionHandler.getConnection(null).brpop(arg); + return connectionHandler.getConnection().brpop(arg); } - }.run(); + }.run(null); } @Override @@ -958,9 +958,9 @@ public class JedisCluster implements JedisCommands, BasicCommands { return new JedisClusterCommand(connectionHandler) { @Override public Long execute() { - return connectionHandler.getConnection(key).del(key); + return connectionHandler.getConnection().del(key); } - }.run(); + }.run(null); } @Override @@ -968,9 +968,9 @@ public class JedisCluster implements JedisCommands, BasicCommands { return new JedisClusterCommand(connectionHandler) { @Override public String execute() { - return connectionHandler.getConnection(null).echo(string); + return connectionHandler.getConnection().echo(string); } - }.run(); + }.run(null); } @Override @@ -978,9 +978,9 @@ public class JedisCluster implements JedisCommands, BasicCommands { return new JedisClusterCommand(connectionHandler) { @Override public Long execute() { - return connectionHandler.getConnection(key).move(key, dbIndex); + return connectionHandler.getConnection().move(key, dbIndex); } - }.run(); + }.run(key); } @Override @@ -988,9 +988,9 @@ public class JedisCluster implements JedisCommands, BasicCommands { return new JedisClusterCommand(connectionHandler) { @Override public Long execute() { - return connectionHandler.getConnection(key).bitcount(key); + return connectionHandler.getConnection().bitcount(key); } - }.run(); + }.run(key); } @Override @@ -998,9 +998,9 @@ public class JedisCluster implements JedisCommands, BasicCommands { return new JedisClusterCommand(connectionHandler) { @Override public Long execute() { - return connectionHandler.getConnection(key).bitcount(key, start, end); + return connectionHandler.getConnection().bitcount(key, start, end); } - }.run(); + }.run(key); } @Override @@ -1008,9 +1008,9 @@ public class JedisCluster implements JedisCommands, BasicCommands { return new JedisClusterCommand(connectionHandler) { @Override public String execute() { - return connectionHandler.getConnection(null).ping(); + return connectionHandler.getConnection().ping(); } - }.run(); + }.run(null); } @Override @@ -1018,9 +1018,9 @@ public class JedisCluster implements JedisCommands, BasicCommands { return new JedisClusterCommand(connectionHandler) { @Override public String execute() { - return connectionHandler.getConnection(null).quit(); + return connectionHandler.getConnection().quit(); } - }.run(); + }.run(null); } @Override @@ -1028,9 +1028,9 @@ public class JedisCluster implements JedisCommands, BasicCommands { return new JedisClusterCommand(connectionHandler) { @Override public String execute() { - return connectionHandler.getConnection(null).flushDB(); + return connectionHandler.getConnection().flushDB(); } - }.run(); + }.run(null); } @Override @@ -1038,9 +1038,9 @@ public class JedisCluster implements JedisCommands, BasicCommands { return new JedisClusterCommand(connectionHandler) { @Override public Long execute() { - return connectionHandler.getConnection(null).dbSize(); + return connectionHandler.getConnection().dbSize(); } - }.run(); + }.run(null); } @Override @@ -1048,9 +1048,9 @@ public class JedisCluster implements JedisCommands, BasicCommands { return new JedisClusterCommand(connectionHandler) { @Override public String execute() { - return connectionHandler.getConnection(null).select(index); + return connectionHandler.getConnection().select(index); } - }.run(); + }.run(null); } @Override @@ -1058,9 +1058,9 @@ public class JedisCluster implements JedisCommands, BasicCommands { return new JedisClusterCommand(connectionHandler) { @Override public String execute() { - return connectionHandler.getConnection(null).flushAll(); + return connectionHandler.getConnection().flushAll(); } - }.run(); + }.run(null); } @Override @@ -1068,9 +1068,9 @@ public class JedisCluster implements JedisCommands, BasicCommands { return new JedisClusterCommand(connectionHandler) { @Override public String execute() { - return connectionHandler.getConnection(null).auth(password); + return connectionHandler.getConnection().auth(password); } - }.run(); + }.run(null); } @Override @@ -1078,9 +1078,9 @@ public class JedisCluster implements JedisCommands, BasicCommands { return new JedisClusterCommand(connectionHandler) { @Override public String execute() { - return connectionHandler.getConnection(null).save(); + return connectionHandler.getConnection().save(); } - }.run(); + }.run(null); } @Override @@ -1088,9 +1088,9 @@ public class JedisCluster implements JedisCommands, BasicCommands { return new JedisClusterCommand(connectionHandler) { @Override public String execute() { - return connectionHandler.getConnection(null).bgsave(); + return connectionHandler.getConnection().bgsave(); } - }.run(); + }.run(null); } @Override @@ -1098,9 +1098,9 @@ public class JedisCluster implements JedisCommands, BasicCommands { return new JedisClusterCommand(connectionHandler) { @Override public String execute() { - return connectionHandler.getConnection(null).bgrewriteaof(); + return connectionHandler.getConnection().bgrewriteaof(); } - }.run(); + }.run(null); } @Override @@ -1108,9 +1108,9 @@ public class JedisCluster implements JedisCommands, BasicCommands { return new JedisClusterCommand(connectionHandler) { @Override public Long execute() { - return connectionHandler.getConnection(null).lastsave(); + return connectionHandler.getConnection().lastsave(); } - }.run(); + }.run(null); } @Override @@ -1118,9 +1118,9 @@ public class JedisCluster implements JedisCommands, BasicCommands { return new JedisClusterCommand(connectionHandler) { @Override public String execute() { - return connectionHandler.getConnection(null).shutdown(); + return connectionHandler.getConnection().shutdown(); } - }.run(); + }.run(null); } @Override @@ -1128,9 +1128,9 @@ public class JedisCluster implements JedisCommands, BasicCommands { return new JedisClusterCommand(connectionHandler) { @Override public String execute() { - return connectionHandler.getConnection(null).info(); + return connectionHandler.getConnection().info(); } - }.run(); + }.run(null); } @Override @@ -1138,9 +1138,9 @@ public class JedisCluster implements JedisCommands, BasicCommands { return new JedisClusterCommand(connectionHandler) { @Override public String execute() { - return connectionHandler.getConnection(null).info(section); + return connectionHandler.getConnection().info(section); } - }.run(); + }.run(null); } @Override @@ -1148,9 +1148,9 @@ public class JedisCluster implements JedisCommands, BasicCommands { return new JedisClusterCommand(connectionHandler) { @Override public String execute() { - return connectionHandler.getConnection(null).slaveof(host, port); + return connectionHandler.getConnection().slaveof(host, port); } - }.run(); + }.run(null); } @Override @@ -1158,9 +1158,9 @@ public class JedisCluster implements JedisCommands, BasicCommands { return new JedisClusterCommand(connectionHandler) { @Override public String execute() { - return connectionHandler.getConnection(null).slaveofNoOne(); + return connectionHandler.getConnection().slaveofNoOne(); } - }.run(); + }.run(null); } @Override @@ -1168,9 +1168,9 @@ public class JedisCluster implements JedisCommands, BasicCommands { return new JedisClusterCommand(connectionHandler) { @Override public Long execute() { - return connectionHandler.getConnection(null).getDB(); + return connectionHandler.getConnection().getDB(); } - }.run(); + }.run(null); } @Override @@ -1178,9 +1178,9 @@ public class JedisCluster implements JedisCommands, BasicCommands { return new JedisClusterCommand(connectionHandler) { @Override public String execute() { - return connectionHandler.getConnection(null).debug(params); + return connectionHandler.getConnection().debug(params); } - }.run(); + }.run(null); } @Override @@ -1188,9 +1188,9 @@ public class JedisCluster implements JedisCommands, BasicCommands { return new JedisClusterCommand(connectionHandler) { @Override public String execute() { - return connectionHandler.getConnection(null).configResetStat(); + return connectionHandler.getConnection().configResetStat(); } - }.run(); + }.run(null); } public Map getClusterNodes() { diff --git a/src/main/java/redis/clients/jedis/JedisClusterCommand.java b/src/main/java/redis/clients/jedis/JedisClusterCommand.java index 0f2b68f..61e4d3a 100644 --- a/src/main/java/redis/clients/jedis/JedisClusterCommand.java +++ b/src/main/java/redis/clients/jedis/JedisClusterCommand.java @@ -1,27 +1,41 @@ package redis.clients.jedis; import redis.clients.jedis.exceptions.JedisAskDataException; +import redis.clients.jedis.exceptions.JedisClusterException; import redis.clients.jedis.exceptions.JedisMovedDataException; +import redis.clients.jedis.tests.utils.JedisClusterCRC16; public abstract class JedisClusterCommand { - private JedisClusterConnectionHandler connectionHandler; private boolean asking = false; + private JedisClusterConnectionHandler connectionHandler; +// private boolean asking = false; + public JedisClusterCommand(JedisClusterConnectionHandler connectionHandler) { this.connectionHandler = connectionHandler; } public abstract T execute(); - public T run() { + public T run(String key) { try { + if (key == null) { + throw new JedisClusterException("No way to dispatch this command to Redis Cluster."); + } + connectionHandler.getConnectionFromSlot(JedisClusterCRC16.getSlot(key)); + if (asking) { + //TODO: Pipeline asking with the original command to make it faster.... + connectionHandler.getConnection().asking(); + } return execute(); } catch (JedisMovedDataException jme) { this.connectionHandler.assignSlotToNode(jme.getSlot(), jme.getTargetNode()); - return execute(); + return run(key); } catch (JedisAskDataException jae) { - throw jae; + asking = true; + this.connectionHandler.assignSlotToNode(jae.getSlot(), jae.getTargetNode()); + return run(key); } } } diff --git a/src/main/java/redis/clients/jedis/JedisClusterConnectionHandler.java b/src/main/java/redis/clients/jedis/JedisClusterConnectionHandler.java index e005ded..765b9a2 100644 --- a/src/main/java/redis/clients/jedis/JedisClusterConnectionHandler.java +++ b/src/main/java/redis/clients/jedis/JedisClusterConnectionHandler.java @@ -2,6 +2,7 @@ package redis.clients.jedis; import java.util.HashMap; import java.util.Map; +import java.util.Random; import java.util.Set; @@ -10,7 +11,8 @@ public abstract class JedisClusterConnectionHandler { protected Map nodes = new HashMap(); protected Map slots = new HashMap(); - abstract Jedis getConnection(String key); + abstract Jedis getConnection(); + abstract Jedis getConnectionFromSlot(int slot); public JedisClusterConnectionHandler(Set nodes) { initializeSlotsCache(nodes); @@ -69,4 +71,12 @@ public abstract class JedisClusterConnectionHandler { JedisPool targetPool = nodes.get(targetNode.getHost() + targetNode.getPort()); slots.put(slot, targetPool); } + + + protected JedisPool getRandomConnection() { + Object[] nodeArray = nodes.values().toArray(); + return (JedisPool) (nodeArray[new Random().nextInt(nodeArray.length)]); + } + + } diff --git a/src/main/java/redis/clients/jedis/JedisRandomConnectionHandler.java b/src/main/java/redis/clients/jedis/JedisRandomConnectionHandler.java index f96854e..40d3f04 100644 --- a/src/main/java/redis/clients/jedis/JedisRandomConnectionHandler.java +++ b/src/main/java/redis/clients/jedis/JedisRandomConnectionHandler.java @@ -1,10 +1,7 @@ package redis.clients.jedis; -import java.util.Random; import java.util.Set; -import redis.clients.util.Pool; - public class JedisRandomConnectionHandler extends JedisClusterConnectionHandler { @@ -12,11 +9,12 @@ public class JedisRandomConnectionHandler extends JedisClusterConnectionHandler super(nodes); } - - @SuppressWarnings("unchecked") - public Jedis getConnection(String key) { - Object[] nodeArray = nodes.values().toArray(); - return ((Pool) nodeArray[new Random().nextInt(nodeArray.length)]).getResource(); + public Jedis getConnection() { + return getRandomConnection().getResource(); } + @Override + Jedis getConnectionFromSlot(int slot) { + return getRandomConnection().getResource(); + } } diff --git a/src/main/java/redis/clients/jedis/JedisSlotBasedConnectionHandler.java b/src/main/java/redis/clients/jedis/JedisSlotBasedConnectionHandler.java index c8961a5..4f3ea5d 100644 --- a/src/main/java/redis/clients/jedis/JedisSlotBasedConnectionHandler.java +++ b/src/main/java/redis/clients/jedis/JedisSlotBasedConnectionHandler.java @@ -1,30 +1,48 @@ package redis.clients.jedis; -import java.util.Random; import java.util.Set; -import redis.clients.jedis.tests.utils.JedisClusterCRC16; - public class JedisSlotBasedConnectionHandler extends JedisClusterConnectionHandler { + private Jedis currentConnection; public JedisSlotBasedConnectionHandler(Set nodes) { super(nodes); } - public Jedis getConnection(String key) { - int keySlot = JedisClusterCRC16.getSlot(key); - JedisPool connectionPool = slots.get(keySlot); + public Jedis getConnection() { + return currentConnection != null ? currentConnection : getRandomConnection().getResource(); + } + + + + + private void returnCurrentConnection() { + if (currentConnection != null) { + nodes.get(currentConnection.getClient().getHost()+currentConnection.getClient().getPort()).returnResource(currentConnection); + } + + } + + + @Override + public void assignSlotToNode(int slot, HostAndPort targetNode) { + super.assignSlotToNode(slot, targetNode); + getConnectionFromSlot(slot); + } + + @Override + public Jedis getConnectionFromSlot(int slot) { + returnCurrentConnection(); + JedisPool connectionPool = slots.get(slot); if (connectionPool == null) { connectionPool = getRandomConnection(); } + currentConnection = connectionPool.getResource(); return connectionPool.getResource(); } - private JedisPool getRandomConnection() { - Object[] nodeArray = nodes.values().toArray(); - return (JedisPool) (nodeArray[new Random().nextInt(nodeArray.length)]); - } + } diff --git a/src/main/java/redis/clients/jedis/Protocol.java b/src/main/java/redis/clients/jedis/Protocol.java index bff80dd..18e453f 100644 --- a/src/main/java/redis/clients/jedis/Protocol.java +++ b/src/main/java/redis/clients/jedis/Protocol.java @@ -79,15 +79,26 @@ public final class Protocol { String message = is.readLine(); //TODO: I'm not sure if this is the best way to do this. //Maybe Read only first 5 bytes instead? + // if (message.contains(MOVED_RESPONSE)) { - String[] movedInfo = message.split(" "); - String[] targetHostAndPort = movedInfo[2].split(":"); - throw new JedisMovedDataException(message, new HostAndPort(targetHostAndPort[0], Integer.valueOf(targetHostAndPort[1])), Integer.valueOf(movedInfo[1])); + String[] movedInfo = parseTargetHostAndSlot(message); + throw new JedisMovedDataException(message, new HostAndPort(movedInfo[1], Integer.valueOf(movedInfo[2])), Integer.valueOf(movedInfo[0])); } else if (message.contains(ASK_RESPONSE)) { - throw new JedisAskDataException(message); + String[] askInfo = parseTargetHostAndSlot(message); + throw new JedisAskDataException(message, new HostAndPort(askInfo[1], Integer.valueOf(askInfo[2])), Integer.valueOf(askInfo[0])); } throw new JedisDataException(message); } + + private static String[] parseTargetHostAndSlot(String clusterRedirectResponse) { + String[] response = new String[3]; + String[] messageInfo = clusterRedirectResponse.split(" "); + String[] targetHostAndPort = messageInfo[2].split(":"); + response[0] = messageInfo[1]; + response[1] = targetHostAndPort[0]; + response[2] = targetHostAndPort[1]; + return response; + } private static Object process(final RedisInputStream is) { try { @@ -179,7 +190,7 @@ public final class Protocol { public static enum Command { PING, SET, GET, QUIT, EXISTS, DEL, TYPE, FLUSHDB, KEYS, RANDOMKEY, RENAME, RENAMENX, RENAMEX, DBSIZE, EXPIRE, EXPIREAT, TTL, SELECT, MOVE, FLUSHALL, GETSET, MGET, SETNX, SETEX, MSET, MSETNX, DECRBY, DECR, INCRBY, INCR, APPEND, SUBSTR, HSET, HGET, HSETNX, HMSET, HMGET, HINCRBY, HEXISTS, HDEL, HLEN, HKEYS, HVALS, HGETALL, RPUSH, LPUSH, LLEN, LRANGE, LTRIM, LINDEX, LSET, LREM, LPOP, RPOP, RPOPLPUSH, SADD, SMEMBERS, SREM, SPOP, SMOVE, SCARD, SISMEMBER, SINTER, SINTERSTORE, SUNION, SUNIONSTORE, SDIFF, SDIFFSTORE, SRANDMEMBER, ZADD, ZRANGE, ZREM, ZINCRBY, ZRANK, ZREVRANK, ZREVRANGE, ZCARD, ZSCORE, MULTI, DISCARD, EXEC, WATCH, UNWATCH, SORT, BLPOP, BRPOP, AUTH, SUBSCRIBE, PUBLISH, UNSUBSCRIBE, PSUBSCRIBE, PUNSUBSCRIBE, ZCOUNT, ZRANGEBYSCORE, ZREVRANGEBYSCORE, ZREMRANGEBYRANK, ZREMRANGEBYSCORE, ZUNIONSTORE, ZINTERSTORE, SAVE, BGSAVE, BGREWRITEAOF, LASTSAVE, SHUTDOWN, INFO, MONITOR, SLAVEOF, CONFIG, STRLEN, SYNC, LPUSHX, PERSIST, RPUSHX, ECHO, LINSERT, DEBUG, BRPOPLPUSH, SETBIT, GETBIT, SETRANGE, GETRANGE, EVAL, EVALSHA, SCRIPT, SLOWLOG, OBJECT, BITCOUNT, BITOP, SENTINEL, - DUMP, RESTORE, PEXPIRE, PEXPIREAT, PTTL, INCRBYFLOAT, PSETEX, CLIENT, TIME, MIGRATE, HINCRBYFLOAT, CLUSTER; + DUMP, RESTORE, PEXPIRE, PEXPIREAT, PTTL, INCRBYFLOAT, PSETEX, CLIENT, TIME, MIGRATE, HINCRBYFLOAT, CLUSTER, ASKING; public final byte[] raw; diff --git a/src/main/java/redis/clients/jedis/exceptions/JedisAskDataException.java b/src/main/java/redis/clients/jedis/exceptions/JedisAskDataException.java index 158256d..645d5c2 100644 --- a/src/main/java/redis/clients/jedis/exceptions/JedisAskDataException.java +++ b/src/main/java/redis/clients/jedis/exceptions/JedisAskDataException.java @@ -1,11 +1,12 @@ package redis.clients.jedis.exceptions; +import redis.clients.jedis.HostAndPort; + public class JedisAskDataException extends JedisDataException { private static final long serialVersionUID = 3878126572474819403L; - - public JedisAskDataException(String message) { - super(message); - } + + private HostAndPort targetNode; + private int slot; public JedisAskDataException(Throwable cause) { super(cause); @@ -14,4 +15,18 @@ public class JedisAskDataException extends JedisDataException { public JedisAskDataException(String message, Throwable cause) { super(message, cause); } + + public JedisAskDataException(String message, HostAndPort targetHost, int slot) { + super(message); + this.targetNode = targetHost; + this.slot = slot; + } + + public HostAndPort getTargetNode() { + return targetNode; + } + + public int getSlot() { + return slot; + } } diff --git a/src/test/java/redis/clients/jedis/tests/JedisClusterTest.java b/src/test/java/redis/clients/jedis/tests/JedisClusterTest.java index 256a807..b13c559 100644 --- a/src/test/java/redis/clients/jedis/tests/JedisClusterTest.java +++ b/src/test/java/redis/clients/jedis/tests/JedisClusterTest.java @@ -13,6 +13,7 @@ import redis.clients.jedis.Jedis; import redis.clients.jedis.JedisCluster; import redis.clients.jedis.Pipeline; import redis.clients.jedis.exceptions.JedisAskDataException; +import redis.clients.jedis.exceptions.JedisClusterException; import redis.clients.jedis.exceptions.JedisMovedDataException; import redis.clients.jedis.tests.utils.JedisClusterCRC16; @@ -39,7 +40,7 @@ public class JedisClusterTest extends Assert { node3.connect(); node3.flushAll(); - // ---- configure cluster + // ---- configure cluster // add nodes to cluster node1.clusterMeet("127.0.0.1", nodeInfo1.getPort()); @@ -148,6 +149,14 @@ public class JedisClusterTest extends Assert { assertEquals("foo", jc.get("51")); } + @Test(expected=JedisClusterException.class) + public void testThrowExceptionWithoutKey() { + Set jedisClusterNode = new HashSet(); + jedisClusterNode.add(new HostAndPort("127.0.0.1", 7379)); + JedisCluster jc = new JedisCluster(jedisClusterNode); + jc.ping(); + } + private String getNodeId(String infoOutput) { for (String infoLine : infoOutput.split("\n")) { if (infoLine.contains("myself")) {