DATAREDIS-513 - Fix RedisServerCommands.time() failure when in pipeline mode.

We fixed a glitch in Jedis/Lettuce RedisConneciton TIME command when used in pipeline or transaction mode.

Original pull request: #199.
This commit is contained in:
Christoph Strobl
2016-05-19 09:00:26 +02:00
committed by Mark Paluch
parent 2b51966768
commit 7af8fdf946
5 changed files with 67 additions and 17 deletions

View File

@@ -53,7 +53,6 @@ import org.springframework.data.redis.connection.RedisZSetCommands;
import org.springframework.data.redis.connection.ReturnType;
import org.springframework.data.redis.connection.SortParameters;
import org.springframework.data.redis.connection.Subscription;
import org.springframework.data.redis.connection.convert.Converters;
import org.springframework.data.redis.connection.convert.ListConverter;
import org.springframework.data.redis.connection.convert.TransactionResultConverter;
import org.springframework.data.redis.core.Cursor;
@@ -3579,13 +3578,21 @@ public class JedisConnection extends AbstractRedisConnection {
@Override
public Long time() {
List<String> serverTimeInformation = this.jedis.time();
try {
Assert.notEmpty(serverTimeInformation, "Received invalid result from server. Expected 2 items in collection.");
Assert.isTrue(serverTimeInformation.size() == 2,
"Received invalid nr of arguments from redis server. Expected 2 received " + serverTimeInformation.size());
if (isPipelined()) {
pipeline(new JedisResult(pipeline.time(), JedisConverters.toTimeConverter()));
return null;
}
return Converters.toTimeMillis(serverTimeInformation.get(0), serverTimeInformation.get(1));
if (isQueueing()) {
transaction(new JedisResult(transaction.time(), JedisConverters.toTimeConverter()));
return null;
}
return JedisConverters.toTimeConverter().convert(jedis.time());
} catch (Exception ex) {
throw convertJedisAccessException(ex);
}
}
/*

View File

@@ -94,6 +94,7 @@ abstract public class JedisConverters extends Converters {
private static final Converter<Object, RedisClusterNode> OBJECT_TO_CLUSTER_NODE_CONVERTER;
private static final Converter<Expiration, byte[]> EXPIRATION_TO_COMMAND_OPTION_CONVERTER;
private static final Converter<SetOption, byte[]> SET_OPTION_TO_COMMAND_OPTION_CONVERTER;
private static final Converter<List<String>, Long> STRING_LIST_TO_TIME_CONVERTER;
private static final Converter<redis.clients.jedis.GeoCoordinate, Point> GEO_COORDINATE_TO_POINT_CONVERTER;
private static final ListConverter<redis.clients.jedis.GeoCoordinate, Point> LIST_GEO_COORDINATE_TO_POINT_CONVERTER;
private static final Converter<byte[], String> BYTES_TO_STRING_CONVERTER;
@@ -194,6 +195,19 @@ abstract public class JedisConverters extends Converters {
};
STRING_LIST_TO_TIME_CONVERTER = new Converter<List<String>, Long>() {
@Override
public Long convert(List<String> source) {
Assert.notEmpty(source, "Received invalid result from server. Expected 2 items in collection.");
Assert.isTrue(source.size() == 2,
"Received invalid nr of arguments from redis server. Expected 2 received " + source.size());
return toTimeMillis(source.get(0), source.get(1));
}
};
GEO_COORDINATE_TO_POINT_CONVERTER = new Converter<redis.clients.jedis.GeoCoordinate, Point>() {
@Override
public Point convert(redis.clients.jedis.GeoCoordinate geoCoordinate) {
@@ -493,6 +507,10 @@ abstract public class JedisConverters extends Converters {
return sp;
}
static Converter<List<String>, Long> toTimeConverter() {
return STRING_LIST_TO_TIME_CONVERTER;
}
/**
* @param source
* @return

View File

@@ -60,7 +60,6 @@ import org.springframework.data.redis.connection.RedisSubscribedConnectionExcept
import org.springframework.data.redis.connection.ReturnType;
import org.springframework.data.redis.connection.SortParameters;
import org.springframework.data.redis.connection.Subscription;
import org.springframework.data.redis.connection.convert.Converters;
import org.springframework.data.redis.connection.convert.ListConverter;
import org.springframework.data.redis.connection.convert.TransactionResultConverter;
import org.springframework.data.redis.core.Cursor;
@@ -3464,16 +3463,19 @@ public class LettuceConnection extends AbstractRedisConnection {
*/
@Override
public Long time() {
try {
List<byte[]> result = getConnection().time();
Assert.notEmpty(result, "Received invalid result from server. Expected 2 items in collection.");
Assert.isTrue(result.size() == 2,
"Received invalid nr of arguments from redis server. Expected 2 received " + result.size());
return Converters.toTimeMillis(new String(result.get(0)), new String(result.get(1)));
if (isPipelined()) {
pipeline(new LettuceResult(getAsyncConnection().time(), LettuceConverters.toTimeConverter()));
return null;
}
if (isQueueing()) {
transaction(new LettuceTxResult(getConnection().time(), LettuceConverters.toTimeConverter()));
return null;
}
return LettuceConverters.toTimeConverter().convert(getConnection().time());
} catch (Exception ex) {
throw convertLettuceAccessException(ex);
}

View File

@@ -106,6 +106,7 @@ abstract public class LettuceConverters extends Converters {
private static final Converter<String[], List<RedisClientInfo>> STRING_TO_LIST_OF_CLIENT_INFO = new StringToRedisClientInfoConverter();
private static final Converter<Partitions, List<RedisClusterNode>> PARTITIONS_TO_CLUSTER_NODES;
private static Converter<com.lambdaworks.redis.cluster.models.partitions.RedisClusterNode, RedisClusterNode> CLUSTER_NODE_TO_CLUSTER_NODE_CONVERTER;
private static final Converter<List<byte[]>, Long> BYTES_LIST_TO_TIME_CONVERTER;
private static final Converter<GeoCoordinates, Point> GEO_COORDINATE_TO_POINT_CONVERTER;
private static final ListConverter<GeoCoordinates, Point> GEO_COORDINATE_LIST_TO_POINT_LIST_CONVERTER;
@@ -302,6 +303,19 @@ abstract public class LettuceConverters extends Converters {
POSITIVE_INFINITY_BYTES = toBytes("+inf");
NEGATIVE_INFINITY_BYTES = toBytes("-inf");
BYTES_LIST_TO_TIME_CONVERTER = new Converter<List<byte[]>, Long>() {
@Override
public Long convert(List<byte[]> source) {
Assert.notEmpty(source, "Received invalid result from server. Expected 2 items in collection.");
Assert.isTrue(source.size() == 2,
"Received invalid nr of arguments from redis server. Expected 2 received " + source.size());
return toTimeMillis(LettuceConverters.toString(source.get(0)), LettuceConverters.toString(source.get(1)));
}
};
GEO_COORDINATE_TO_POINT_CONVERTER = new Converter<com.lambdaworks.redis.GeoCoordinates, Point>() {
@Override
public Point convert(com.lambdaworks.redis.GeoCoordinates geoCoordinate) {
@@ -683,6 +697,10 @@ abstract public class LettuceConverters extends Converters {
return args;
}
static Converter<List<byte[]>, Long> toTimeConverter() {
return BYTES_LIST_TO_TIME_CONVERTER;
}
/**
* Convert {@link Metric} into {@link GeoArgs.Unit}.
*