From 8553552d2b9057ba0c6bb875e27a46b03c754375 Mon Sep 17 00:00:00 2001 From: Jennifer Hickey Date: Wed, 20 Mar 2013 15:07:42 -0700 Subject: [PATCH] Fix Lettuce and SRP blpop/brpop issues - DATAREDIS-127 Fix Lettuce NPE on timeout - DATAREDIS-128 Fix SRP arg array conversion and NPE on timeout --- .../connection/lettuce/LettuceUtils.java | 3 +++ .../data/redis/connection/srp/SrpUtils.java | 16 ++++++------- .../AbstractConnectionIntegrationTests.java | 24 +++++++++++++++++++ .../JRedisConnectionIntegrationTests.java | 20 ++++++++++++++++ 4 files changed, 54 insertions(+), 9 deletions(-) diff --git a/src/main/java/org/springframework/data/redis/connection/lettuce/LettuceUtils.java b/src/main/java/org/springframework/data/redis/connection/lettuce/LettuceUtils.java index 325a4be11..d38c65b5a 100644 --- a/src/main/java/org/springframework/data/redis/connection/lettuce/LettuceUtils.java +++ b/src/main/java/org/springframework/data/redis/connection/lettuce/LettuceUtils.java @@ -151,6 +151,9 @@ abstract class LettuceUtils { } static List toList(KeyValue blpop) { + if(blpop == null) { + return null; + } List list = new ArrayList(2); list.add(blpop.key); list.add(blpop.value); diff --git a/src/main/java/org/springframework/data/redis/connection/srp/SrpUtils.java b/src/main/java/org/springframework/data/redis/connection/srp/SrpUtils.java index 5ad4ef002..04c433591 100644 --- a/src/main/java/org/springframework/data/redis/connection/srp/SrpUtils.java +++ b/src/main/java/org/springframework/data/redis/connection/srp/SrpUtils.java @@ -17,7 +17,6 @@ package org.springframework.data.redis.connection.srp; import java.io.StringReader; -import java.nio.ByteBuffer; import java.util.ArrayList; import java.util.Arrays; import java.util.LinkedHashMap; @@ -83,6 +82,9 @@ abstract class SrpUtils { } static List toBytesList(Reply[] replies) { + if(replies == null) { + return null; + } List list = new ArrayList(replies.length); for (Reply reply : replies) { Object data = reply.data(); @@ -149,19 +151,15 @@ abstract class SrpUtils { } static Object[] convert(int timeout, byte[]... keys) { - int length = (keys != null ? keys.length : 0); - // add the int representation - length = 1; + int length = (keys != null ? keys.length + 1 : 1); + Object[] args = new Object[length]; if (keys != null) { - for (int i = 0; i < args.length - 1; i++) { + for (int i = 0; i < keys.length; i++) { args[i] = keys[i]; } } - ByteBuffer bb = ByteBuffer.allocate(4); - bb.putInt(timeout); - args[args.length - 1] = bb.array(); - + args[length-1] = String.valueOf(timeout).getBytes(); return args; } 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 1facbe906..4e7a9392e 100644 --- a/src/test/java/org/springframework/data/redis/connection/AbstractConnectionIntegrationTests.java +++ b/src/test/java/org/springframework/data/redis/connection/AbstractConnectionIntegrationTests.java @@ -377,6 +377,30 @@ public abstract class AbstractConnectionIntegrationTests { assertEquals(new String(value), new String((byte[])results.get(1))); } + @Test + public void testBlPopTimeout() { + assertNull(connection.bLPop(1, "lclist")); + } + + @Test + public void testBlPop() { + connection.lPush("poplist", "foo"); + connection.lPush("poplist", "bar"); + assertEquals(Arrays.asList(new String[] {"poplist", "bar"}), connection.bLPop(1, "poplist", "otherlist")); + } + + @Test + public void testBRPop() { + connection.rPush("rpoplist", "bar"); + connection.rPush("rpoplist", "foo"); + assertEquals(Arrays.asList(new String[] {"rpoplist", "foo"}), connection.bRPop(1, "rpoplist")); + } + + @Test + public void testBRPopTimeout() { + assertNull(connection.bRPop(1, "rclist")); + } + private boolean isAsync() { return (getConnectionFactory() instanceof LettuceConnectionFactory) || (getConnectionFactory() instanceof SrpConnectionFactory); diff --git a/src/test/java/org/springframework/data/redis/connection/jredis/JRedisConnectionIntegrationTests.java b/src/test/java/org/springframework/data/redis/connection/jredis/JRedisConnectionIntegrationTests.java index a47b5649a..7cd8d7746 100644 --- a/src/test/java/org/springframework/data/redis/connection/jredis/JRedisConnectionIntegrationTests.java +++ b/src/test/java/org/springframework/data/redis/connection/jredis/JRedisConnectionIntegrationTests.java @@ -97,4 +97,24 @@ public class JRedisConnectionIntegrationTests extends AbstractConnectionIntegrat public void testExecuteNativeWithPipeline() throws Exception { super.testExecuteNativeWithPipeline(); } + + @Test(expected = UnsupportedOperationException.class) + public void testBlPopTimeout() { + super.testBlPopTimeout(); + } + + @Test(expected = UnsupportedOperationException.class) + public void testBlPop() { + super.testBlPop(); + } + + @Test(expected = UnsupportedOperationException.class) + public void testBRPop() { + super.testBRPop(); + } + + @Test(expected = UnsupportedOperationException.class) + public void testBRPopTimeout() { + super.testBRPopTimeout(); + } } \ No newline at end of file