From 7d5dd8ebc346b8c32f2ce3b169f6ddc2410d5954 Mon Sep 17 00:00:00 2001 From: Nikita Date: Wed, 10 Feb 2016 11:03:06 +0300 Subject: [PATCH 1/5] Code cleanup --- src/main/java/org/redisson/RedissonKeys.java | 2 +- src/main/java/org/redisson/core/RKeys.java | 2 +- src/main/java/org/redisson/core/RedissonMultiLock.java | 3 +-- src/main/java/org/redisson/reactive/RedissonKeysReactive.java | 2 +- 4 files changed, 4 insertions(+), 5 deletions(-) diff --git a/src/main/java/org/redisson/RedissonKeys.java b/src/main/java/org/redisson/RedissonKeys.java index c015cf016..e553bb169 100644 --- a/src/main/java/org/redisson/RedissonKeys.java +++ b/src/main/java/org/redisson/RedissonKeys.java @@ -282,7 +282,7 @@ public class RedissonKeys implements RKeys { } @Override - public Long count() { + public long count() { return commandExecutor.get(countAsync()); } diff --git a/src/main/java/org/redisson/core/RKeys.java b/src/main/java/org/redisson/core/RKeys.java index 867026ac6..a32781a0f 100644 --- a/src/main/java/org/redisson/core/RKeys.java +++ b/src/main/java/org/redisson/core/RKeys.java @@ -95,7 +95,7 @@ public interface RKeys extends RKeysAsync { * * @return */ - Long count(); + long count(); /** * Delete all keys of currently selected database diff --git a/src/main/java/org/redisson/core/RedissonMultiLock.java b/src/main/java/org/redisson/core/RedissonMultiLock.java index 22264cb58..3d5633aac 100644 --- a/src/main/java/org/redisson/core/RedissonMultiLock.java +++ b/src/main/java/org/redisson/core/RedissonMultiLock.java @@ -35,8 +35,7 @@ import io.netty.util.concurrent.Promise; import io.netty.util.internal.PlatformDependent; /** - * Guarantees multiple locks operation handling (lock, tryLock...) - * in atomic way without deadlocks. + * Groups multiple independent locks and handles them as one lock. * * @author Nikita Koksharov * diff --git a/src/main/java/org/redisson/reactive/RedissonKeysReactive.java b/src/main/java/org/redisson/reactive/RedissonKeysReactive.java index e54ce5273..51c687f16 100644 --- a/src/main/java/org/redisson/reactive/RedissonKeysReactive.java +++ b/src/main/java/org/redisson/reactive/RedissonKeysReactive.java @@ -39,7 +39,7 @@ public class RedissonKeysReactive implements RKeysReactive { private final CommandReactiveService commandExecutor; - RedissonKeys instance; + private final RedissonKeys instance; public RedissonKeysReactive(CommandReactiveService commandExecutor) { super(); From 0bbc332e3788cf7b0532cd83b5a923f096962f9f Mon Sep 17 00:00:00 2001 From: Nikita Date: Wed, 10 Feb 2016 11:18:55 +0300 Subject: [PATCH 2/5] Cancel command retry if Redisson in shutdown mode. #402 --- src/main/java/org/redisson/command/CommandAsyncService.java | 4 ++++ src/main/java/org/redisson/command/CommandBatchService.java | 4 ++++ 2 files changed, 8 insertions(+) diff --git a/src/main/java/org/redisson/command/CommandAsyncService.java b/src/main/java/org/redisson/command/CommandAsyncService.java index d8c44d2fa..3376248b8 100644 --- a/src/main/java/org/redisson/command/CommandAsyncService.java +++ b/src/main/java/org/redisson/command/CommandAsyncService.java @@ -390,6 +390,10 @@ public class CommandAsyncService implements CommandAsyncExecutor { } } + if (connectionManager.isShuttingDown()) { + return; + } + if (details.getMainPromise().isCancelled()) { if (details.getAttemptPromise().cancel(false)) { AsyncDetails.release(details); diff --git a/src/main/java/org/redisson/command/CommandBatchService.java b/src/main/java/org/redisson/command/CommandBatchService.java index 6bf4083cb..4d8dd33cb 100644 --- a/src/main/java/org/redisson/command/CommandBatchService.java +++ b/src/main/java/org/redisson/command/CommandBatchService.java @@ -233,6 +233,10 @@ public class CommandBatchService extends CommandReactiveService { } } + if (connectionManager.isShuttingDown()) { + return; + } + if (mainPromise.isCancelled()) { attemptPromise.cancel(false); return; From 5cca26e5260bfb8129da758c45f9fdf4efc323a4 Mon Sep 17 00:00:00 2001 From: Nikita Date: Wed, 10 Feb 2016 13:27:46 +0300 Subject: [PATCH 3/5] RedissonListReactive refactoring --- src/main/java/org/redisson/RedissonList.java | 4 +- .../java/org/redisson/api/RListReactive.java | 6 +- .../reactive/RedissonListReactive.java | 65 +++++-------------- .../redisson/RedissonListReactiveTest.java | 6 +- 4 files changed, 23 insertions(+), 58 deletions(-) diff --git a/src/main/java/org/redisson/RedissonList.java b/src/main/java/org/redisson/RedissonList.java index c0397117a..734ec97ad 100644 --- a/src/main/java/org/redisson/RedissonList.java +++ b/src/main/java/org/redisson/RedissonList.java @@ -56,11 +56,11 @@ public class RedissonList extends RedissonExpirable implements RList { public static final RedisCommand EVAL_BOOLEAN_ARGS2 = new RedisCommand("EVAL", new BooleanReplayConvertor(), 5, ValueType.OBJECTS); - protected RedissonList(CommandAsyncExecutor commandExecutor, String name) { + public RedissonList(CommandAsyncExecutor commandExecutor, String name) { super(commandExecutor, name); } - protected RedissonList(Codec codec, CommandAsyncExecutor commandExecutor, String name) { + public RedissonList(Codec codec, CommandAsyncExecutor commandExecutor, String name) { super(codec, commandExecutor, name); } diff --git a/src/main/java/org/redisson/api/RListReactive.java b/src/main/java/org/redisson/api/RListReactive.java index 45ee12403..6c2536f52 100644 --- a/src/main/java/org/redisson/api/RListReactive.java +++ b/src/main/java/org/redisson/api/RListReactive.java @@ -35,9 +35,9 @@ public interface RListReactive extends RCollectionReactive { Publisher iterator(int startIndex); - Publisher lastIndexOf(Object o); + Publisher lastIndexOf(Object o); - Publisher indexOf(Object o); + Publisher indexOf(Object o); Publisher add(long index, V element); @@ -49,6 +49,6 @@ public interface RListReactive extends RCollectionReactive { Publisher get(long index); - Publisher remove(int index); + Publisher remove(long index); } diff --git a/src/main/java/org/redisson/reactive/RedissonListReactive.java b/src/main/java/org/redisson/reactive/RedissonListReactive.java index 008b5ade8..d33213308 100644 --- a/src/main/java/org/redisson/reactive/RedissonListReactive.java +++ b/src/main/java/org/redisson/reactive/RedissonListReactive.java @@ -30,14 +30,13 @@ import java.util.List; import org.reactivestreams.Publisher; import org.reactivestreams.Subscriber; import org.reactivestreams.Subscription; +import org.redisson.RedissonList; import org.redisson.api.RListReactive; import org.redisson.client.codec.Codec; import org.redisson.client.protocol.RedisCommand; import org.redisson.client.protocol.RedisCommand.ValueType; import org.redisson.client.protocol.RedisCommands; -import org.redisson.client.protocol.convertor.BooleanNumberReplayConvertor; import org.redisson.client.protocol.convertor.Convertor; -import org.redisson.client.protocol.convertor.IntegerReplayConvertor; import org.redisson.client.protocol.convertor.LongReplayConvertor; import org.redisson.command.CommandReactiveExecutor; @@ -56,12 +55,16 @@ import reactor.rx.subscription.ReactiveSubscription; */ public class RedissonListReactive extends RedissonExpirableReactive implements RListReactive { + private final RedissonList instance; + public RedissonListReactive(CommandReactiveExecutor commandExecutor, String name) { super(commandExecutor, name); + instance = new RedissonList(commandExecutor, name); } public RedissonListReactive(Codec codec, CommandReactiveExecutor commandExecutor, String name) { super(codec, commandExecutor, name); + instance = new RedissonList(codec, commandExecutor, name); } @Override @@ -151,7 +154,7 @@ public class RedissonListReactive extends RedissonExpirableReactive implement @Override public Publisher remove(Object o) { - return remove(o, 1); + return reactive(instance.removeAsync(o)); } protected Publisher remove(Object o, int count) { @@ -160,17 +163,7 @@ public class RedissonListReactive extends RedissonExpirableReactive implement @Override public Publisher containsAll(Collection c) { - return commandExecutor.evalReadReactive(getName(), codec, RedisCommands.EVAL_BOOLEAN_WITH_VALUES, - "local items = redis.call('lrange', KEYS[1], 0, -1) " + - "for i=1, #items do " + - "for j = 0, table.getn(ARGV), 1 do " + - "if items[i] == ARGV[j] then " + - "table.remove(ARGV, j) " + - "end " + - "end " + - "end " + - "return table.getn(ARGV) == 0 and 1 or 0", - Collections.singletonList(getName()), c.toArray()); + return reactive(instance.containsAllAsync(c)); } @Override @@ -232,40 +225,12 @@ public class RedissonListReactive extends RedissonExpirableReactive implement @Override public Publisher removeAll(Collection c) { - return commandExecutor.evalWriteReactive(getName(), codec, RedisCommands.EVAL_BOOLEAN_WITH_VALUES, - "local v = 0 " + - "for i = 0, table.getn(ARGV), 1 do " - + "if redis.call('lrem', KEYS[1], 0, ARGV[i]) == 1 " - + "then v = 1 end " - +"end " - + "return v ", - Collections.singletonList(getName()), c.toArray()); + return reactive(instance.removeAllAsync(c)); } @Override public Publisher retainAll(Collection c) { - return commandExecutor.evalWriteReactive(getName(), codec, RedisCommands.EVAL_BOOLEAN_WITH_VALUES, - "local changed = 0 " + - "local items = redis.call('lrange', KEYS[1], 0, -1) " - + "local i = 1 " - + "local s = table.getn(items) " - + "while i <= s do " - + "local element = items[i] " - + "local isInAgrs = false " - + "for j = 0, table.getn(ARGV), 1 do " - + "if ARGV[j] == element then " - + "isInAgrs = true " - + "break " - + "end " - + "end " - + "if isInAgrs == false then " - + "redis.call('LREM', KEYS[1], 0, element) " - + "changed = 1 " - + "end " - + "i = i + 1 " - + "end " - + "return changed ", - Collections.singletonList(getName()), c.toArray()); + return reactive(instance.retainAllAsync(c)); } @Override @@ -293,7 +258,7 @@ public class RedissonListReactive extends RedissonExpirableReactive implement } @Override - public Publisher remove(int index) { + public Publisher remove(long index) { if (index == 0) { return commandExecutor.writeReactive(getName(), codec, LPOP, getName()); } @@ -309,7 +274,7 @@ public class RedissonListReactive extends RedissonExpirableReactive implement @Override public Publisher contains(Object o) { - return indexOf(o, new BooleanNumberReplayConvertor(-1L)); + return reactive(instance.containsAsync(o)); } private Publisher indexOf(Object o, Convertor convertor) { @@ -327,13 +292,13 @@ public class RedissonListReactive extends RedissonExpirableReactive implement } @Override - public Publisher indexOf(Object o) { - return indexOf(o, new IntegerReplayConvertor()); + public Publisher indexOf(Object o) { + return indexOf(o, new LongReplayConvertor()); } @Override - public Publisher lastIndexOf(Object o) { - return commandExecutor.evalReadReactive(getName(), codec, new RedisCommand("EVAL", new IntegerReplayConvertor(), 4), + public Publisher lastIndexOf(Object o) { + return commandExecutor.evalReadReactive(getName(), codec, new RedisCommand("EVAL", 4), "local key = KEYS[1] " + "local obj = ARGV[1] " + "local items = redis.call('lrange', key, 0, -1) " + diff --git a/src/test/java/org/redisson/RedissonListReactiveTest.java b/src/test/java/org/redisson/RedissonListReactiveTest.java index f6a45d0d2..755a48083 100644 --- a/src/test/java/org/redisson/RedissonListReactiveTest.java +++ b/src/test/java/org/redisson/RedissonListReactiveTest.java @@ -229,7 +229,7 @@ public class RedissonListReactiveTest extends BaseReactiveTest { sync(list.add(0)); sync(list.add(10)); - int index = sync(list.lastIndexOf(3)); + long index = sync(list.lastIndexOf(3)); Assert.assertEquals(2, index); } @@ -247,7 +247,7 @@ public class RedissonListReactiveTest extends BaseReactiveTest { sync(list.add(0)); sync(list.add(10)); - int index = sync(list.lastIndexOf(3)); + long index = sync(list.lastIndexOf(3)); Assert.assertEquals(5, index); } @@ -265,7 +265,7 @@ public class RedissonListReactiveTest extends BaseReactiveTest { sync(list.add(3)); sync(list.add(10)); - int index = sync(list.lastIndexOf(3)); + long index = sync(list.lastIndexOf(3)); Assert.assertEquals(8, index); } From eb0a8363a8919ff04b3a556bb14147e1b5f36fa1 Mon Sep 17 00:00:00 2001 From: Nikita Date: Wed, 10 Feb 2016 15:03:06 +0300 Subject: [PATCH 4/5] Code formatting --- src/main/java/org/redisson/BaseConfig.java | 25 +++++++---- src/main/java/org/redisson/Config.java | 14 ++++-- .../client/handler/CommandEncoder.java | 45 +++++++++---------- .../org/redisson/codec/CborJacksonCodec.java | 8 ++-- .../org/redisson/codec/JsonJacksonCodec.java | 12 +++-- 5 files changed, 57 insertions(+), 47 deletions(-) diff --git a/src/main/java/org/redisson/BaseConfig.java b/src/main/java/org/redisson/BaseConfig.java index 4256a7dbc..c021b6ca9 100644 --- a/src/main/java/org/redisson/BaseConfig.java +++ b/src/main/java/org/redisson/BaseConfig.java @@ -15,7 +15,6 @@ */ package org.redisson; - class BaseConfig> { /** @@ -113,6 +112,7 @@ class BaseConfig> { this.subscriptionsPerConnection = subscriptionsPerConnection; return (T) this; } + public int getSubscriptionsPerConnection() { return subscriptionsPerConnection; } @@ -127,6 +127,7 @@ class BaseConfig> { this.password = password; return (T) this; } + public String getPassword() { return password; } @@ -142,6 +143,7 @@ class BaseConfig> { this.retryAttempts = retryAttempts; return (T) this; } + public int getRetryAttempts() { return retryAttempts; } @@ -156,6 +158,7 @@ class BaseConfig> { this.retryInterval = retryInterval; return (T) this; } + public int getRetryInterval() { return retryInterval; } @@ -169,6 +172,7 @@ class BaseConfig> { this.timeout = timeout; return (T) this; } + public int getTimeout() { return timeout; } @@ -183,11 +187,11 @@ class BaseConfig> { this.clientName = clientName; return (T) this; } + public String getClientName() { return clientName; } - /** * Ping timeout used in Node.ping and Node.pingAll operation * @@ -197,13 +201,14 @@ class BaseConfig> { this.pingTimeout = pingTimeout; return (T) this; } + public int getPingTimeout() { return pingTimeout; } /** * Timeout during connecting to any Redis server. - * + *

* @param connectTimeout - timeout in milliseconds * @return */ @@ -211,6 +216,7 @@ class BaseConfig> { this.connectTimeout = connectTimeout; return (T) this; } + public int getConnectTimeout() { return connectTimeout; } @@ -227,6 +233,7 @@ class BaseConfig> { this.idleConnectionTimeout = idleConnectionTimeout; return (T) this; } + public int getIdleConnectionTimeout() { return idleConnectionTimeout; } @@ -234,10 +241,10 @@ class BaseConfig> { /** * Reconnection attempt timeout to Redis server when * it has been excluded from internal list of available servers. - * + *

* On every such timeout event Redisson tries * to connect to disconnected Redis server. - * + *

* Default is 3000 * * @see #failedAttempts @@ -246,8 +253,9 @@ class BaseConfig> { public T setReconnectionTimeout(int slaveRetryTimeout) { this.reconnectionTimeout = slaveRetryTimeout; - return (T)this; + return (T) this; } + public int getReconnectionTimeout() { return reconnectionTimeout; } @@ -256,14 +264,15 @@ class BaseConfig> { * Redis server will be excluded from the internal list of available nodes * when sequential unsuccessful execution attempts of any Redis command * on this server reaches failedAttempts. - * + *

* Default is 3 * */ public T setFailedAttempts(int slaveFailedAttempts) { this.failedAttempts = slaveFailedAttempts; - return (T)this; + return (T) this; } + public int getFailedAttempts() { return failedAttempts; } diff --git a/src/main/java/org/redisson/Config.java b/src/main/java/org/redisson/Config.java index 5c8d7e98c..28e697915 100644 --- a/src/main/java/org/redisson/Config.java +++ b/src/main/java/org/redisson/Config.java @@ -79,10 +79,10 @@ public class Config { if (oldConf.getMasterSlaveServersConfig() != null) { setMasterSlaveServersConfig(new MasterSlaveServersConfig(oldConf.getMasterSlaveServersConfig())); } - if (oldConf.getSentinelServersConfig() != null ) { + if (oldConf.getSentinelServersConfig() != null) { setSentinelServersConfig(new SentinelServersConfig(oldConf.getSentinelServersConfig())); } - if (oldConf.getClusterServersConfig() != null ) { + if (oldConf.getClusterServersConfig() != null) { setClusterServersConfig(new ClusterServersConfig(oldConf.getClusterServersConfig())); } if (oldConf.getElasticacheServersConfig() != null) { @@ -100,6 +100,7 @@ public class Config { this.codec = codec; return this; } + public Codec getCodec() { return codec; } @@ -131,10 +132,10 @@ public class Config { return clusterServersConfig; } - ClusterServersConfig getClusterServersConfig() { return clusterServersConfig; } + void setClusterServersConfig(ClusterServersConfig clusterServersConfig) { this.clusterServersConfig = clusterServersConfig; } @@ -169,6 +170,7 @@ public class Config { ElasticacheServersConfig getElasticacheServersConfig() { return elasticacheServersConfig; } + void setElasticacheServersConfig(ElasticacheServersConfig elasticacheServersConfig) { this.elasticacheServersConfig = elasticacheServersConfig; } @@ -200,10 +202,10 @@ public class Config { return singleServerConfig; } - SingleServerConfig getSingleServerConfig() { return singleServerConfig; } + void setSingleServerConfig(SingleServerConfig singleConnectionConfig) { this.singleServerConfig = singleConnectionConfig; } @@ -237,6 +239,7 @@ public class Config { SentinelServersConfig getSentinelServersConfig() { return sentinelServersConfig; } + void setSentinelServersConfig(SentinelServersConfig sentinelConnectionConfig) { this.sentinelServersConfig = sentinelConnectionConfig; } @@ -270,6 +273,7 @@ public class Config { MasterSlaveServersConfig getMasterSlaveServersConfig() { return masterSlaveServersConfig; } + void setMasterSlaveServersConfig(MasterSlaveServersConfig masterSlaveConnectionConfig) { this.masterSlaveServersConfig = masterSlaveConnectionConfig; } @@ -339,6 +343,7 @@ public class Config { this.useLinuxNativeEpoll = useLinuxNativeEpoll; return this; } + public boolean isUseLinuxNativeEpoll() { return useLinuxNativeEpoll; } @@ -360,6 +365,7 @@ public class Config { this.eventLoopGroup = eventLoopGroup; return this; } + public EventLoopGroup getEventLoopGroup() { return eventLoopGroup; } diff --git a/src/main/java/org/redisson/client/handler/CommandEncoder.java b/src/main/java/org/redisson/client/handler/CommandEncoder.java index dacbe6911..8c7560908 100644 --- a/src/main/java/org/redisson/client/handler/CommandEncoder.java +++ b/src/main/java/org/redisson/client/handler/CommandEncoder.java @@ -66,9 +66,11 @@ public class CommandEncoder extends MessageToByteEncoder>> (16 + 3); r = i - ((q << 3) + (q << 1)); // r = i-(q*10) ... - buf[--charPos] = (byte) digits[(int)r]; + buf[--charPos] = (byte) DIGITS[(int) r]; i = q; if (i == 0) break; @@ -194,5 +192,4 @@ public class CommandEncoder extends MessageToByteEncoder mapTyper = new DefaultTypeResolverBuilder(DefaultTyping.NON_FINAL) { - public boolean useForType(JavaType t) - { + public boolean useForType(JavaType t) { switch (_appliesFor) { case NON_CONCRETE_AND_ARRAYS: while (t.isArrayType()) { @@ -93,7 +92,7 @@ public class JsonJacksonCodec implements Codec { } return !t.isFinal(); // includes Object.class default: - //case JAVA_LANG_OBJECT: + // case JAVA_LANG_OBJECT: return (t.getRawClass() == Object.class); } } @@ -106,10 +105,9 @@ public class JsonJacksonCodec implements Codec { protected void init(ObjectMapper objectMapper) { objectMapper.setSerializationInclusion(Include.NON_NULL); objectMapper.setVisibilityChecker(objectMapper.getSerializationConfig().getDefaultVisibilityChecker() - .withFieldVisibility(JsonAutoDetect.Visibility.ANY) - .withGetterVisibility(JsonAutoDetect.Visibility.NONE) - .withSetterVisibility(JsonAutoDetect.Visibility.NONE) - .withCreatorVisibility(JsonAutoDetect.Visibility.NONE)); + .withFieldVisibility(JsonAutoDetect.Visibility.ANY).withGetterVisibility(JsonAutoDetect.Visibility.NONE) + .withSetterVisibility(JsonAutoDetect.Visibility.NONE) + .withCreatorVisibility(JsonAutoDetect.Visibility.NONE)); objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); objectMapper.configure(SerializationFeature.WRITE_BIGDECIMAL_AS_PLAIN, true); objectMapper.configure(MapperFeature.SORT_PROPERTIES_ALPHABETICALLY, true); From d79708ffc2fc48b0e82cf775d18b6f146415e6cf Mon Sep 17 00:00:00 2001 From: Nikita Date: Wed, 10 Feb 2016 15:03:28 +0300 Subject: [PATCH 5/5] reverted. #402 --- src/main/java/org/redisson/command/CommandAsyncService.java | 4 ---- src/main/java/org/redisson/command/CommandBatchService.java | 4 ---- 2 files changed, 8 deletions(-) diff --git a/src/main/java/org/redisson/command/CommandAsyncService.java b/src/main/java/org/redisson/command/CommandAsyncService.java index 3376248b8..d8c44d2fa 100644 --- a/src/main/java/org/redisson/command/CommandAsyncService.java +++ b/src/main/java/org/redisson/command/CommandAsyncService.java @@ -390,10 +390,6 @@ public class CommandAsyncService implements CommandAsyncExecutor { } } - if (connectionManager.isShuttingDown()) { - return; - } - if (details.getMainPromise().isCancelled()) { if (details.getAttemptPromise().cancel(false)) { AsyncDetails.release(details); diff --git a/src/main/java/org/redisson/command/CommandBatchService.java b/src/main/java/org/redisson/command/CommandBatchService.java index 4d8dd33cb..6bf4083cb 100644 --- a/src/main/java/org/redisson/command/CommandBatchService.java +++ b/src/main/java/org/redisson/command/CommandBatchService.java @@ -233,10 +233,6 @@ public class CommandBatchService extends CommandReactiveService { } } - if (connectionManager.isShuttingDown()) { - return; - } - if (mainPromise.isCancelled()) { attemptPromise.cancel(false); return;