PubSub message decoding under heavy load fixed. #276

pull/282/head
Nikita 9 years ago
parent 2eeb592a3d
commit 7ddf605385

@ -110,6 +110,17 @@ public class CommandDecoder extends ReplayingDecoder<State> {
} else if (data instanceof CommandsData) { } else if (data instanceof CommandsData) {
CommandsData commands = (CommandsData)data; CommandsData commands = (CommandsData)data;
handleCommandsDataResponse(ctx, in, data, currentDecoder, commands);
return;
}
ctx.pipeline().get(CommandsQueue.class).sendNextCommand(ctx);
state(null);
}
private void handleCommandsDataResponse(ChannelHandlerContext ctx, ByteBuf in, QueueCommand data,
Decoder<Object> currentDecoder, CommandsData commands) throws Exception {
int i = state().getIndex(); int i = state().getIndex();
while (in.writerIndex() > in.readerIndex()) { while (in.writerIndex() > in.readerIndex()) {
@ -138,12 +149,6 @@ public class CommandDecoder extends ReplayingDecoder<State> {
checkpoint(); checkpoint();
state().setIndex(i); state().setIndex(i);
} }
return;
}
ctx.pipeline().get(CommandsQueue.class).sendNextCommand(ctx);
state(null);
} }
private void decode(ByteBuf in, CommandData<Object, Object> data, List<Object> parts, Channel channel, Decoder<Object> currentDecoder) throws IOException { private void decode(ByteBuf in, CommandData<Object, Object> data, List<Object> parts, Channel channel, Decoder<Object> currentDecoder) throws IOException {
@ -206,6 +211,9 @@ public class CommandDecoder extends ReplayingDecoder<State> {
Object result = decoder.decode(respParts, state()); Object result = decoder.decode(respParts, state());
// store current message index
checkpoint();
if (result instanceof Message) { if (result instanceof Message) {
handleMultiResult(data, null, channel, result); handleMultiResult(data, null, channel, result);
// has next messages? // has next messages?

@ -203,6 +203,8 @@ public class RedissonTopicTest {
redisson2.shutdown(); redisson2.shutdown();
} }
volatile long counter;
@Test @Test
public void testHeavyLoad() throws InterruptedException { public void testHeavyLoad() throws InterruptedException {
final CountDownLatch messageRecieved = new CountDownLatch(1000); final CountDownLatch messageRecieved = new CountDownLatch(1000);
@ -214,6 +216,7 @@ public class RedissonTopicTest {
public void onMessage(String channel, Message msg) { public void onMessage(String channel, Message msg) {
Assert.assertEquals(new Message("123"), msg); Assert.assertEquals(new Message("123"), msg);
messageRecieved.countDown(); messageRecieved.countDown();
counter++;
} }
}); });
@ -233,11 +236,13 @@ public class RedissonTopicTest {
messageRecieved.await(); messageRecieved.await();
Thread.sleep(1000);
Assert.assertEquals(500, counter);
redisson1.shutdown(); redisson1.shutdown();
redisson2.shutdown(); redisson2.shutdown();
} }
@Test @Test
public void testListenerRemove() throws InterruptedException { public void testListenerRemove() throws InterruptedException {
Redisson redisson1 = BaseTest.createInstance(); Redisson redisson1 = BaseTest.createInstance();

Loading…
Cancel
Save