diff --git a/redisson/src/main/java/org/redisson/codec/LZ4CodecV2.java b/redisson/src/main/java/org/redisson/codec/LZ4CodecV2.java index 812d7cc8b..ef5ccf2f9 100644 --- a/redisson/src/main/java/org/redisson/codec/LZ4CodecV2.java +++ b/redisson/src/main/java/org/redisson/codec/LZ4CodecV2.java @@ -19,6 +19,8 @@ import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufAllocator; import io.netty.buffer.ByteBufInputStream; import io.netty.buffer.ByteBufOutputStream; +import org.apache.commons.compress.compressors.lz4.BlockLZ4CompressorInputStream; +import org.apache.commons.compress.compressors.lz4.BlockLZ4CompressorOutputStream; import org.apache.commons.compress.compressors.lz4.FramedLZ4CompressorInputStream; import org.apache.commons.compress.compressors.lz4.FramedLZ4CompressorOutputStream; import org.redisson.client.codec.BaseCodec; @@ -66,10 +68,11 @@ public class LZ4CodecV2 extends BaseCodec { private final Decoder decoder = new Decoder() { @Override public Object decode(ByteBuf buf, State state) throws IOException { - ByteBuf out = ByteBufAllocator.DEFAULT.buffer(); + int decompressionSize = buf.readInt(); + ByteBuf out = ByteBufAllocator.DEFAULT.buffer(decompressionSize); try { ByteBufInputStream ios = new ByteBufInputStream(buf); - FramedLZ4CompressorInputStream in = new FramedLZ4CompressorInputStream(ios); + BlockLZ4CompressorInputStream in = new BlockLZ4CompressorInputStream(ios); out.writeBytes(in, buf.readableBytes()); in.close(); return innerCodec.getValueDecoder().decode(out, state); @@ -86,9 +89,10 @@ public class LZ4CodecV2 extends BaseCodec { ByteBuf bytes = null; try { ByteBuf out = ByteBufAllocator.DEFAULT.buffer(); - ByteBufOutputStream baos = new ByteBufOutputStream(out); - FramedLZ4CompressorOutputStream compressor = new FramedLZ4CompressorOutputStream(baos); bytes = innerCodec.getValueEncoder().encode(in); + out.writeInt(bytes.readableBytes()); + ByteBufOutputStream baos = new ByteBufOutputStream(out); + BlockLZ4CompressorOutputStream compressor = new BlockLZ4CompressorOutputStream(baos); bytes.getBytes(bytes.readerIndex(), compressor, bytes.readableBytes()); compressor.close(); return out; diff --git a/redisson/src/test/java/org/redisson/LZ4CodecV2Test.java b/redisson/src/test/java/org/redisson/LZ4CodecV2Test.java new file mode 100644 index 000000000..5973d432b --- /dev/null +++ b/redisson/src/test/java/org/redisson/LZ4CodecV2Test.java @@ -0,0 +1,33 @@ +package org.redisson; + +import org.junit.jupiter.api.Test; +import org.redisson.api.RBucket; +import org.redisson.api.RedissonClient; +import org.redisson.codec.LZ4Codec; +import org.redisson.codec.LZ4CodecV2; +import org.redisson.config.Config; + +import static org.assertj.core.api.Assertions.assertThat; + +public class LZ4CodecV2Test extends BaseTest { + + @Test + public void test1() { + Config config = new Config(); + config.setCodec(new LZ4Codec()); + config.useSingleServer() + .setAddress(RedisRunner.getDefaultRedisServerBindAddressAndPort()); + RedissonClient r = Redisson.create(config); + RBucket s = r.getBucket("test1"); + s.set("12324"); + + Config config2 = new Config(); + config2.setCodec(new LZ4CodecV2()); + config2.useSingleServer() + .setAddress(RedisRunner.getDefaultRedisServerBindAddressAndPort()); + RedissonClient r2 = Redisson.create(config2); + RBucket s2 = r2.getBucket("test1"); + assertThat(s2.get()).isEqualTo("12324"); + } + +}