Skip to content

Commit a9ef94e

Browse files
gkorlandsazzad16
andauthored
fix cast exception on blpop (#2506)
* fix cast exception * fix data reading * more blpop/brpop tests Co-authored-by: M Sazzadul Hoque <[email protected]>
1 parent cffc896 commit a9ef94e

File tree

2 files changed

+227
-15
lines changed

2 files changed

+227
-15
lines changed

src/main/java/redis/clients/jedis/Jedis.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2215,7 +2215,7 @@ public KeyedListElement blpop(final double timeout, final String... keys) {
22152215
client.blpop(timeout, keys);
22162216
client.setTimeoutInfinite();
22172217
try {
2218-
return BuilderFactory.KEYED_LIST_ELEMENT.build(client.getMultiBulkReply());
2218+
return BuilderFactory.KEYED_LIST_ELEMENT.build(client.getBinaryMultiBulkReply());
22192219
} finally {
22202220
client.rollbackTimeout();
22212221
}
@@ -2294,7 +2294,7 @@ public KeyedListElement brpop(final double timeout, final String... keys) {
22942294
client.brpop(timeout, keys);
22952295
client.setTimeoutInfinite();
22962296
try {
2297-
return BuilderFactory.KEYED_LIST_ELEMENT.build(client.getMultiBulkReply());
2297+
return BuilderFactory.KEYED_LIST_ELEMENT.build(client.getBinaryMultiBulkReply());
22982298
} finally {
22992299
client.rollbackTimeout();
23002300
}
@@ -2340,7 +2340,7 @@ public KeyedZSetElement bzpopmax(double timeout, String... keys) {
23402340
client.bzpopmax(timeout, keys);
23412341
client.setTimeoutInfinite();
23422342
try {
2343-
return BuilderFactory.KEYED_ZSET_ELEMENT.build(client.getObjectMultiBulkReply());
2343+
return BuilderFactory.KEYED_ZSET_ELEMENT.build(client.getBinaryMultiBulkReply());
23442344
} finally {
23452345
client.rollbackTimeout();
23462346
}
@@ -2352,7 +2352,7 @@ public KeyedZSetElement bzpopmin(double timeout, String... keys) {
23522352
client.bzpopmin(timeout, keys);
23532353
client.setTimeoutInfinite();
23542354
try {
2355-
return BuilderFactory.KEYED_ZSET_ELEMENT.build(client.getObjectMultiBulkReply());
2355+
return BuilderFactory.KEYED_ZSET_ELEMENT.build(client.getBinaryMultiBulkReply());
23562356
} finally {
23572357
client.rollbackTimeout();
23582358
}

src/test/java/redis/clients/jedis/tests/commands/ListCommandsTest.java

Lines changed: 223 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
import static org.junit.Assert.assertEquals;
55
import static org.junit.Assert.assertNotNull;
66
import static org.junit.Assert.assertNull;
7+
import static org.junit.Assert.assertTrue;
78
import static org.junit.Assert.fail;
89
import static redis.clients.jedis.tests.utils.AssertUtil.assertByteArrayListEquals;
910

@@ -12,16 +13,24 @@
1213
import java.util.Collections;
1314
import java.util.List;
1415

16+
import org.apache.logging.log4j.LogManager;
17+
import org.apache.logging.log4j.Logger;
18+
1519
import org.junit.Test;
1620

1721
import redis.clients.jedis.Jedis;
1822
import redis.clients.jedis.ListPosition;
1923
import redis.clients.jedis.args.ListDirection;
2024
import redis.clients.jedis.exceptions.JedisDataException;
2125
import redis.clients.jedis.params.LPosParams;
26+
import redis.clients.jedis.resps.KeyedListElement;
2227

2328
public class ListCommandsTest extends JedisCommandTestBase {
29+
30+
private static final Logger logger = LogManager.getLogger();
31+
2432
final byte[] bfoo = { 0x01, 0x02, 0x03, 0x04 };
33+
final byte[] bfoo1 = { 0x01, 0x02, 0x03, 0x04, 0x05 };
2534
final byte[] bbar = { 0x05, 0x06, 0x07, 0x08 };
2635
final byte[] bcar = { 0x09, 0x0A, 0x0B, 0x0C };
2736
final byte[] bA = { 0x0A };
@@ -420,6 +429,19 @@ public void blpop() throws InterruptedException {
420429
assertEquals("foo", result.get(0));
421430
assertEquals("bar", result.get(1));
422431

432+
// Multi keys
433+
result = jedis.blpop(1, "foo", "foo1");
434+
assertNull(result);
435+
436+
jedis.lpush("foo", "bar");
437+
jedis.lpush("foo1", "bar1");
438+
result = jedis.blpop(1, "foo1", "foo");
439+
440+
assertNotNull(result);
441+
assertEquals(2, result.size());
442+
assertEquals("foo1", result.get(0));
443+
assertEquals("bar1", result.get(1));
444+
423445
// Binary
424446
jedis.lpush(bfoo, bbar);
425447
List<byte[]> bresult = jedis.blpop(1, bfoo);
@@ -429,6 +451,95 @@ public void blpop() throws InterruptedException {
429451
assertArrayEquals(bfoo, bresult.get(0));
430452
assertArrayEquals(bbar, bresult.get(1));
431453

454+
// Binary Multi keys
455+
bresult = jedis.blpop(1, bfoo, bfoo1);
456+
assertNull(bresult);
457+
458+
jedis.lpush(bfoo, bbar);
459+
jedis.lpush(bfoo1, bcar);
460+
bresult = jedis.blpop(1, bfoo, bfoo1);
461+
462+
assertNotNull(bresult);
463+
assertEquals(2, bresult.size());
464+
assertArrayEquals(bfoo, bresult.get(0));
465+
assertArrayEquals(bbar, bresult.get(1));
466+
}
467+
468+
@Test
469+
public void blpopDouble() throws InterruptedException {
470+
KeyedListElement result = jedis.blpop(0.1, "foo");
471+
assertNull(result);
472+
473+
jedis.lpush("foo", "bar");
474+
result = jedis.blpop(3.2, "foo");
475+
476+
assertNotNull(result);
477+
assertEquals("foo", result.getKey());
478+
assertEquals("bar", result.getElement());
479+
480+
// Multi keys
481+
result = jedis.blpop(0.18, "foo", "foo1");
482+
assertNull(result);
483+
484+
jedis.lpush("foo", "bar");
485+
jedis.lpush("foo1", "bar1");
486+
result = jedis.blpop(1d, "foo1", "foo");
487+
488+
assertNotNull(result);
489+
assertEquals("foo1", result.getKey());
490+
assertEquals("bar1", result.getElement());
491+
492+
// Binary
493+
jedis.lpush(bfoo, bbar);
494+
List<byte[]> bresult = jedis.blpop(3.12, bfoo);
495+
496+
assertNotNull(bresult);
497+
assertEquals(2, bresult.size());
498+
assertArrayEquals(bfoo, bresult.get(0));
499+
assertArrayEquals(bbar, bresult.get(1));
500+
501+
// Binary Multi keys
502+
bresult = jedis.blpop(0.11, bfoo, bfoo1);
503+
assertNull(bresult);
504+
505+
jedis.lpush(bfoo, bbar);
506+
jedis.lpush(bfoo1, bcar);
507+
bresult = jedis.blpop(1d, bfoo, bfoo1);
508+
509+
assertNotNull(bresult);
510+
assertEquals(2, bresult.size());
511+
assertArrayEquals(bfoo, bresult.get(0));
512+
assertArrayEquals(bbar, bresult.get(1));
513+
}
514+
515+
@Test
516+
public void blpopDoubleWithSleep() {
517+
long startMillis, totalMillis;
518+
519+
startMillis = System.currentTimeMillis();
520+
KeyedListElement result = jedis.blpop(0.04, "foo");
521+
totalMillis = System.currentTimeMillis() - startMillis;
522+
assertTrue("TotalMillis=" + totalMillis, totalMillis < 200);
523+
assertNull(result);
524+
525+
startMillis = System.currentTimeMillis();
526+
new Thread(() -> {
527+
try {
528+
Thread.sleep(30);
529+
} catch(InterruptedException e) {
530+
logger.error("", e);
531+
}
532+
try (Jedis j = createJedis()) {
533+
j.lpush("foo", "bar");
534+
}
535+
}).start();
536+
result = jedis.blpop(1.2, "foo");
537+
totalMillis = System.currentTimeMillis() - startMillis;
538+
assertTrue("TotalMillis=" + totalMillis, totalMillis < 200);
539+
540+
assertNotNull(result);
541+
assertEquals("foo", result.getKey());
542+
assertEquals("bar", result.getElement());
432543
}
433544

434545
@Test
@@ -443,15 +554,116 @@ public void brpop() throws InterruptedException {
443554
assertEquals("foo", result.get(0));
444555
assertEquals("bar", result.get(1));
445556

446-
// Binary
557+
// Multi keys
558+
result = jedis.brpop(1, "foo", "foo1");
559+
assertNull(result);
560+
561+
jedis.lpush("foo", "bar");
562+
jedis.lpush("foo1", "bar1");
563+
result = jedis.brpop(1, "foo1", "foo");
447564

565+
assertNotNull(result);
566+
assertEquals(2, result.size());
567+
assertEquals("foo1", result.get(0));
568+
assertEquals("bar1", result.get(1));
569+
570+
// Binary
448571
jedis.lpush(bfoo, bbar);
449572
List<byte[]> bresult = jedis.brpop(1, bfoo);
450573
assertNotNull(bresult);
451574
assertEquals(2, bresult.size());
452575
assertArrayEquals(bfoo, bresult.get(0));
453576
assertArrayEquals(bbar, bresult.get(1));
454577

578+
// Binary Multi keys
579+
bresult = jedis.brpop(1, bfoo, bfoo1);
580+
assertNull(bresult);
581+
582+
jedis.lpush(bfoo, bbar);
583+
jedis.lpush(bfoo1, bcar);
584+
bresult = jedis.brpop(1, bfoo, bfoo1);
585+
586+
assertNotNull(bresult);
587+
assertEquals(2, bresult.size());
588+
assertArrayEquals(bfoo, bresult.get(0));
589+
assertArrayEquals(bbar, bresult.get(1));
590+
}
591+
592+
@Test
593+
public void brpopDouble() throws InterruptedException {
594+
KeyedListElement result = jedis.brpop(0.1, "foo");
595+
assertNull(result);
596+
597+
jedis.lpush("foo", "bar");
598+
result = jedis.brpop(3.2, "foo");
599+
600+
assertNotNull(result);
601+
assertEquals("foo", result.getKey());
602+
assertEquals("bar", result.getElement());
603+
604+
// Multi keys
605+
result = jedis.brpop(0.18, "foo", "foo1");
606+
assertNull(result);
607+
608+
jedis.lpush("foo", "bar");
609+
jedis.lpush("foo1", "bar1");
610+
result = jedis.brpop(1d, "foo1", "foo");
611+
612+
assertNotNull(result);
613+
assertEquals("foo1", result.getKey());
614+
assertEquals("bar1", result.getElement());
615+
616+
// Binary
617+
jedis.lpush(bfoo, bbar);
618+
List<byte[]> bresult = jedis.brpop(3.12, bfoo);
619+
620+
assertNotNull(bresult);
621+
assertEquals(2, bresult.size());
622+
assertArrayEquals(bfoo, bresult.get(0));
623+
assertArrayEquals(bbar, bresult.get(1));
624+
625+
// Binary Multi keys
626+
bresult = jedis.brpop(0.11, bfoo, bfoo1);
627+
assertNull(bresult);
628+
629+
jedis.lpush(bfoo, bbar);
630+
jedis.lpush(bfoo1, bcar);
631+
bresult = jedis.brpop(1d, bfoo, bfoo1);
632+
633+
assertNotNull(bresult);
634+
assertEquals(2, bresult.size());
635+
assertArrayEquals(bfoo, bresult.get(0));
636+
assertArrayEquals(bbar, bresult.get(1));
637+
}
638+
639+
@Test
640+
public void brpopDoubleWithSleep() {
641+
long startMillis, totalMillis;
642+
643+
startMillis = System.currentTimeMillis();
644+
KeyedListElement result = jedis.brpop(0.04, "foo");
645+
totalMillis = System.currentTimeMillis() - startMillis;
646+
assertTrue("TotalMillis=" + totalMillis, totalMillis < 200);
647+
assertNull(result);
648+
649+
startMillis = System.currentTimeMillis();
650+
new Thread(() -> {
651+
try {
652+
Thread.sleep(30);
653+
} catch(InterruptedException e) {
654+
logger.error("", e);
655+
}
656+
try (Jedis j = createJedis()) {
657+
j.lpush("foo", "bar");
658+
}
659+
}).start();
660+
result = jedis.brpop(1.2, "foo");
661+
totalMillis = System.currentTimeMillis() - startMillis;
662+
assertTrue("TotalMillis=" + totalMillis, totalMillis < 200);
663+
664+
assertNotNull(result);
665+
assertEquals("foo", result.getKey());
666+
assertEquals("bar", result.getElement());
455667
}
456668

457669
@Test
@@ -538,11 +750,11 @@ public void brpoplpush() {
538750
public void run() {
539751
try {
540752
Thread.sleep(100);
541-
try (Jedis j = createJedis()) {
542-
j.lpush("foo", "a");
543-
}
544753
} catch (InterruptedException e) {
545-
org.apache.logging.log4j.LogManager.getLogger().error("Interruption in string lpush", e);
754+
logger.error("", e);
755+
}
756+
try (Jedis j = createJedis()) {
757+
j.lpush("foo", "a");
546758
}
547759
}
548760
}).start();
@@ -560,11 +772,11 @@ public void run() {
560772
public void run() {
561773
try {
562774
Thread.sleep(100);
563-
try (Jedis j = createJedis()) {
564-
j.lpush(bfoo, bA);
565-
}
566775
} catch (InterruptedException e) {
567-
org.apache.logging.log4j.LogManager.getLogger().error("Interruption in binary lpush", e);
776+
logger.error("", e);
777+
}
778+
try (Jedis j = createJedis()) {
779+
j.lpush(bfoo, bA);
568780
}
569781
}
570782
}).start();
@@ -678,7 +890,7 @@ public void blmove() {
678890
try {
679891
Thread.sleep(100);
680892
} catch (InterruptedException e) {
681-
// ignore
893+
logger.error("", e);
682894
}
683895
try (Jedis j = createJedis()) {
684896
j.rpush("foo", "bar1", "bar2", "bar3");
@@ -694,7 +906,7 @@ public void blmove() {
694906
try {
695907
Thread.sleep(100);
696908
} catch (InterruptedException e) {
697-
// ignore
909+
logger.error("", e);
698910
}
699911
try (Jedis j = createJedis()) {
700912
j.rpush(bfoo, b1, b2, b3);

0 commit comments

Comments
 (0)