From ebe05a04a04f83a524b8d231e11f29c0d68fea46 Mon Sep 17 00:00:00 2001 From: Costin Leau Date: Mon, 25 Jun 2012 21:20:58 +0300 Subject: [PATCH] fix bug that return an empty list for #closePipeline --- .../connection/jedis/JedisConnection.java | 5 ++++- .../redis/connection/srp/SrpConnection.java | 13 +++++++------ .../AbstractConnectionIntegrationTests.java | 19 ++++++++++++++++++- 3 files changed, 29 insertions(+), 8 deletions(-) diff --git a/src/main/java/org/springframework/data/redis/connection/jedis/JedisConnection.java b/src/main/java/org/springframework/data/redis/connection/jedis/JedisConnection.java index d43ae07de..5bbb6d820 100644 --- a/src/main/java/org/springframework/data/redis/connection/jedis/JedisConnection.java +++ b/src/main/java/org/springframework/data/redis/connection/jedis/JedisConnection.java @@ -237,7 +237,7 @@ public class JedisConnection implements RedisConnection { @SuppressWarnings("unchecked") public List closePipeline() { if (pipeline != null) { - List execute = pipeline.syncAndReturnAll(); + List execute = pipeline.syncAndReturnAll(); if (execute != null && !execute.isEmpty()) { Exception cause = null; for (int i = 0; i < execute.size(); i++) { @@ -250,9 +250,12 @@ public class JedisConnection implements RedisConnection { execute.set(i, dataAccessException); } } + if (cause != null) { throw new RedisPipelineException(cause, execute); } + + return execute; } } return Collections.emptyList(); diff --git a/src/main/java/org/springframework/data/redis/connection/srp/SrpConnection.java b/src/main/java/org/springframework/data/redis/connection/srp/SrpConnection.java index 9eeaa2ee1..5fda0f75d 100644 --- a/src/main/java/org/springframework/data/redis/connection/srp/SrpConnection.java +++ b/src/main/java/org/springframework/data/redis/connection/srp/SrpConnection.java @@ -64,13 +64,13 @@ public class SrpConnection implements RedisConnection { private PipelineTracker callback; private volatile SrpSubscription subscription; - private static class PipelineTracker implements FutureCallback { + private static class PipelineTracker implements FutureCallback { private final List results = Collections.synchronizedList(new ArrayList()); - private final List> futures = new ArrayList>(); + private final List> futures = new ArrayList>(); - public void onSuccess(Object result) { - results.add(result); + public void onSuccess(Reply result) { + results.add(result.data()); } public void onFailure(Throwable t) { @@ -87,7 +87,7 @@ public class SrpConnection implements RedisConnection { return results; } - public void addCommand(ListenableFuture future) { + public void addCommand(ListenableFuture future) { futures.add(future); Futures.addCallback(future, this); } @@ -191,6 +191,7 @@ public class SrpConnection implements RedisConnection { if (cause != null) { throw new RedisPipelineException(cause, execute); } + return execute; } } @@ -1882,7 +1883,7 @@ public class SrpConnection implements RedisConnection { } // processing method that adds a listener to the future in order to track down the results and close the pipeline - private void pipeline(ListenableFuture future) { + private void pipeline(ListenableFuture future) { callback.addCommand(future); } } \ No newline at end of file diff --git a/src/test/java/org/springframework/data/redis/connection/AbstractConnectionIntegrationTests.java b/src/test/java/org/springframework/data/redis/connection/AbstractConnectionIntegrationTests.java index e26e259c7..11dfa2185 100644 --- a/src/test/java/org/springframework/data/redis/connection/AbstractConnectionIntegrationTests.java +++ b/src/test/java/org/springframework/data/redis/connection/AbstractConnectionIntegrationTests.java @@ -347,7 +347,7 @@ public abstract class AbstractConnectionIntegrationTests { } @Test(expected = RedisPipelineException.class) - public void exceptionExecuteNativeWithPipeline() throws Exception { + public void testExceptionExecuteNativeWithPipeline() throws Exception { connection.openPipeline(); connection.execute("iNFo"); connection.execute("SET ", getClass() + "testSetNative", UUID.randomUUID().toString()); @@ -355,4 +355,21 @@ public abstract class AbstractConnectionIntegrationTests { connection.closePipeline(); } + @Test + public void testExecuteNativeWithPipeline() throws Exception { + String key1 = getClass() + "#ExecuteNativeWithPipeline#1"; + String value1 = UUID.randomUUID().toString(); + String key2 = getClass() + "#ExecuteNativeWithPipeline#2"; + String value2 = UUID.randomUUID().toString(); + + connection.openPipeline(); + connection.execute("SET", key1, value1); + connection.execute("SET", key2, value2); + connection.execute("GET", key1); + connection.execute("GET", key2); + List result = connection.closePipeline(); + assertEquals(4, result.size()); + assertArrayEquals(value1.getBytes(), (byte[]) result.get(2)); + assertArrayEquals(value2.getBytes(), (byte[]) result.get(3)); + } } \ No newline at end of file