Skip to content

Commit

Permalink
#244: compatibility with Redisson 3.11.5
Browse files Browse the repository at this point in the history
  • Loading branch information
vladimir-bukhtoyarov committed Apr 6, 2022
1 parent 57a4420 commit d7df5ec
Show file tree
Hide file tree
Showing 3 changed files with 16 additions and 4 deletions.
2 changes: 1 addition & 1 deletion bucket4j-parent/pom.xml
Expand Up @@ -65,7 +65,7 @@
<testcontainers.version>1.15.1</testcontainers.version>
<lettuce-version>5.0.2.RELEASE</lettuce-version>
<jedis.version>2.9.0</jedis.version>
<redisson.version>3.11.5</redisson.version>
<redisson.version>3.16.8</redisson.version>
<caffeine.version>2.9.3</caffeine.version>
</properties>

Expand Down
Expand Up @@ -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;
Expand All @@ -40,6 +42,8 @@

public class RedissonBasedProxyManager extends AbstractCompareAndSwapBasedProxyManager<String> {

public static RedisCommand<Boolean> SETPXNX_WORK_ARROUND = new RedisCommand<Boolean>("SET", new BooleanNotNullReplayConvertor());

private final CommandExecutor commandExecutor;
private final long ttlMillis;

Expand All @@ -66,7 +70,7 @@ public Optional<byte[]> 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<Boolean> redissonFuture = commandExecutor.writeAsync(key, ByteArrayCodec.INSTANCE, RedisCommands.SETPXNX, key, encodeByteArray(newData), "PX", ttlMillis, "NX");
RFuture<Boolean> redissonFuture = commandExecutor.writeAsync(key, ByteArrayCodec.INSTANCE, SETPXNX_WORK_ARROUND, key, encodeByteArray(newData), "PX", ttlMillis, "NX");
return commandExecutor.get(redissonFuture);
} else {
String script =
Expand Down Expand Up @@ -99,7 +103,7 @@ public CompletableFuture<Optional<byte[]>> getStateData() {
@Override
public CompletableFuture<Boolean> compareAndSwap(byte[] originalData, byte[] newData) {
if (originalData == null) {
RFuture<Boolean> redissonFuture = commandExecutor.writeAsync(key, ByteArrayCodec.INSTANCE, RedisCommands.SETPXNX, key, encodeByteArray(newData), "PX", ttlMillis, "NX");
RFuture<Boolean> redissonFuture = commandExecutor.writeAsync(key, ByteArrayCodec.INSTANCE, SETPXNX_WORK_ARROUND, key, encodeByteArray(newData), "PX", ttlMillis, "NX");
return convertFuture(redissonFuture);
} else {
String script =
Expand Down
Expand Up @@ -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;
Expand All @@ -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
Expand All @@ -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);
Expand All @@ -55,7 +63,7 @@ private static GenericContainer startRedisContainer() {

@Override
protected ProxyManager<String> getProxyManager() {
return new RedissonBasedProxyManager(connectionManager.getCommandExecutor(), ClientSideConfig.getDefault(), Duration.ofMinutes(10));
return new RedissonBasedProxyManager(commandExecutor, ClientSideConfig.getDefault(), Duration.ofMinutes(10));
}

@Override
Expand Down

0 comments on commit d7df5ec

Please sign in to comment.