From d7df5eceff34d8dd2f0bdbf9528019e668dfeceb Mon Sep 17 00:00:00 2001 From: "vladimir.bukhtoyarov" Date: Wed, 6 Apr 2022 13:36:51 +0300 Subject: [PATCH] #244: compatibility with Redisson 3.11.5 --- bucket4j-parent/pom.xml | 2 +- .../redis/redisson/cas/RedissonBasedProxyManager.java | 8 ++++++-- .../redisson/cas/RedissonBasedProxyManagerTest.java | 10 +++++++++- 3 files changed, 16 insertions(+), 4 deletions(-) diff --git a/bucket4j-parent/pom.xml b/bucket4j-parent/pom.xml index a944e5c9..dee9142d 100644 --- a/bucket4j-parent/pom.xml +++ b/bucket4j-parent/pom.xml @@ -65,7 +65,7 @@ 1.15.1 5.0.2.RELEASE 2.9.0 - 3.11.5 + 3.16.8 2.9.3 diff --git a/bucket4j-redis/src/main/java/io/github/bucket4j/redis/redisson/cas/RedissonBasedProxyManager.java b/bucket4j-redis/src/main/java/io/github/bucket4j/redis/redisson/cas/RedissonBasedProxyManager.java index d99069fd..21b71cf6 100644 --- a/bucket4j-redis/src/main/java/io/github/bucket4j/redis/redisson/cas/RedissonBasedProxyManager.java +++ b/bucket4j-redis/src/main/java/io/github/bucket4j/redis/redisson/cas/RedissonBasedProxyManager.java @@ -27,7 +27,9 @@ import io.netty.buffer.ByteBuf; import org.redisson.api.RFuture; import org.redisson.client.codec.ByteArrayCodec; +import org.redisson.client.protocol.RedisCommand; import org.redisson.client.protocol.RedisCommands; +import org.redisson.client.protocol.convertor.BooleanNotNullReplayConvertor; import org.redisson.command.CommandExecutor; import java.io.IOException; @@ -40,6 +42,8 @@ public class RedissonBasedProxyManager extends AbstractCompareAndSwapBasedProxyManager { + public static RedisCommand SETPXNX_WORK_ARROUND = new RedisCommand("SET", new BooleanNotNullReplayConvertor()); + private final CommandExecutor commandExecutor; private final long ttlMillis; @@ -66,7 +70,7 @@ public Optional getStateData() { public boolean compareAndSwap(byte[] originalData, byte[] newData) { if (originalData == null) { // Redisson prohibits the usage null as values, so "replace" must not be used in such cases - RFuture redissonFuture = commandExecutor.writeAsync(key, ByteArrayCodec.INSTANCE, RedisCommands.SETPXNX, key, encodeByteArray(newData), "PX", ttlMillis, "NX"); + RFuture redissonFuture = commandExecutor.writeAsync(key, ByteArrayCodec.INSTANCE, SETPXNX_WORK_ARROUND, key, encodeByteArray(newData), "PX", ttlMillis, "NX"); return commandExecutor.get(redissonFuture); } else { String script = @@ -99,7 +103,7 @@ public CompletableFuture> getStateData() { @Override public CompletableFuture compareAndSwap(byte[] originalData, byte[] newData) { if (originalData == null) { - RFuture redissonFuture = commandExecutor.writeAsync(key, ByteArrayCodec.INSTANCE, RedisCommands.SETPXNX, key, encodeByteArray(newData), "PX", ttlMillis, "NX"); + RFuture redissonFuture = commandExecutor.writeAsync(key, ByteArrayCodec.INSTANCE, SETPXNX_WORK_ARROUND, key, encodeByteArray(newData), "PX", ttlMillis, "NX"); return convertFuture(redissonFuture); } else { String script = diff --git a/bucket4j-redis/src/test/java/io/github/bucket4j/redis/redisson/cas/RedissonBasedProxyManagerTest.java b/bucket4j-redis/src/test/java/io/github/bucket4j/redis/redisson/cas/RedissonBasedProxyManagerTest.java index 74e63798..e8fe2988 100644 --- a/bucket4j-redis/src/test/java/io/github/bucket4j/redis/redisson/cas/RedissonBasedProxyManagerTest.java +++ b/bucket4j-redis/src/test/java/io/github/bucket4j/redis/redisson/cas/RedissonBasedProxyManagerTest.java @@ -5,6 +5,8 @@ import io.github.bucket4j.tck.AbstractDistributedBucketTest; import org.junit.AfterClass; import org.junit.BeforeClass; +import org.redisson.command.CommandExecutor; +import org.redisson.command.CommandSyncService; import org.redisson.config.Config; import org.redisson.config.ConfigSupport; import org.redisson.connection.ConnectionManager; @@ -17,11 +19,13 @@ public class RedissonBasedProxyManagerTest extends AbstractDistributedBucketTest private static GenericContainer container; private static ConnectionManager connectionManager; + private static CommandExecutor commandExecutor; @BeforeClass public static void setup() { container = startRedisContainer(); connectionManager = createRedissonClient(container); + commandExecutor = createRedissonExecutor(connectionManager); } @AfterClass @@ -46,6 +50,10 @@ private static ConnectionManager createRedissonClient(GenericContainer container return connectionManager; } + private static CommandExecutor createRedissonExecutor(ConnectionManager connectionManager) { + return new CommandSyncService(connectionManager, null); + } + private static GenericContainer startRedisContainer() { GenericContainer genericContainer = new GenericContainer("redis:4.0.11") .withExposedPorts(6379); @@ -55,7 +63,7 @@ private static GenericContainer startRedisContainer() { @Override protected ProxyManager getProxyManager() { - return new RedissonBasedProxyManager(connectionManager.getCommandExecutor(), ClientSideConfig.getDefault(), Duration.ofMinutes(10)); + return new RedissonBasedProxyManager(commandExecutor, ClientSideConfig.getDefault(), Duration.ofMinutes(10)); } @Override