From d1618f4b697d7689983f54b3ae15376bb3a4e966 Mon Sep 17 00:00:00 2001 From: Nikita Koksharov Date: Tue, 15 Jan 2019 17:48:14 +0300 Subject: [PATCH] Fixed - RBlockingQueue.drainTo doesn't work when queue contains only one element. #1809 --- .../java/org/redisson/RedissonBlockingQueue.java | 2 +- .../java/org/redisson/RedissonBlockingQueueTest.java | 12 ++++++++++++ 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/redisson/src/main/java/org/redisson/RedissonBlockingQueue.java b/redisson/src/main/java/org/redisson/RedissonBlockingQueue.java index 991398c17..35f8dc99b 100644 --- a/redisson/src/main/java/org/redisson/RedissonBlockingQueue.java +++ b/redisson/src/main/java/org/redisson/RedissonBlockingQueue.java @@ -150,7 +150,7 @@ public class RedissonBlockingQueue extends RedissonQueue implements RBlock return commandExecutor.evalWriteAsync(getName(), codec, new RedisCommand("EVAL", new ListDrainToDecoder(c)), "local vals = redis.call('lrange', KEYS[1], 0, -1); " + - "redis.call('ltrim', KEYS[1], -1, 0); " + + "redis.call('del', KEYS[1]); " + "return vals", Collections.singletonList(getName())); } diff --git a/redisson/src/test/java/org/redisson/RedissonBlockingQueueTest.java b/redisson/src/test/java/org/redisson/RedissonBlockingQueueTest.java index 7178c6750..b3dd4c34f 100644 --- a/redisson/src/test/java/org/redisson/RedissonBlockingQueueTest.java +++ b/redisson/src/test/java/org/redisson/RedissonBlockingQueueTest.java @@ -467,6 +467,18 @@ public class RedissonBlockingQueueTest extends RedissonQueueTest { assertThat(queue2).containsExactly(3, 4, 5, 6); } + @Test + public void testDrainToSingle() { + RBlockingQueue queue = getQueue(); + Assert.assertTrue(queue.add(1)); + Assert.assertEquals(1, queue.size()); + Set batch = new HashSet(); + int count = queue.drainTo(batch); + Assert.assertEquals(1, count); + Assert.assertEquals(1, batch.size()); + Assert.assertTrue(queue.isEmpty()); + } + @Test public void testDrainTo() { RBlockingQueue queue = getQueue();