diff --git a/redisson/src/main/java/org/redisson/client/handler/CommandDecoder.java b/redisson/src/main/java/org/redisson/client/handler/CommandDecoder.java index d529ea939..1aa24fdfe 100644 --- a/redisson/src/main/java/org/redisson/client/handler/CommandDecoder.java +++ b/redisson/src/main/java/org/redisson/client/handler/CommandDecoder.java @@ -147,16 +147,20 @@ public class CommandDecoder extends ReplayingDecoder { } if (state().getLevels().size() == 1) { StateLevel firstLevel = state().getLevels().get(0); - if (firstLevel.getParts().isEmpty()) { + if (firstLevel.getParts().isEmpty() && firstLevel.getLastList() == null) { state().resetLevel(); decode(in, cmd, null, ctx.channel()); } else { if (firstLevel.getLastList() != null) { - decodeList(in, cmd, firstLevel.getParts(), ctx.channel(), firstLevel.getLastListSize(), firstLevel.getLastList()); + if (firstLevel.getLastList().isEmpty()) { + decode(in, cmd, firstLevel.getParts(), ctx.channel()); + } else { + decodeList(in, cmd, firstLevel.getParts(), ctx.channel(), firstLevel.getLastListSize(), firstLevel.getLastList()); + } firstLevel.setLastList(null); firstLevel.setLastListSize(0); - if (in.isReadable()) { + while (in.isReadable() && firstLevel.getParts().size() < firstLevel.getSize()) { decode(in, cmd, firstLevel.getParts(), ctx.channel()); } decodeList(in, cmd, null, ctx.channel(), 0, firstLevel.getParts()); diff --git a/redisson/src/main/java/org/redisson/client/protocol/decoder/ListMultiDecoder.java b/redisson/src/main/java/org/redisson/client/protocol/decoder/ListMultiDecoder.java index 26c562037..ec7e45528 100644 --- a/redisson/src/main/java/org/redisson/client/protocol/decoder/ListMultiDecoder.java +++ b/redisson/src/main/java/org/redisson/client/protocol/decoder/ListMultiDecoder.java @@ -111,6 +111,10 @@ public class ListMultiDecoder implements MultiDecoder { } int index = getDecoder(state).getIndex(); + if (index == -1) { + getDecoder(state).resetIndex(); + index = 0; + } Decoder decoder = decoders[index].getDecoder(paramNum, state); if (decoder == RESET) { NestedDecoderState s = getDecoder(state);