diff --git a/redisson/checkstyle.xml b/redisson/checkstyle.xml index 20bda8834..36595370f 100644 --- a/redisson/checkstyle.xml +++ b/redisson/checkstyle.xml @@ -128,7 +128,9 @@ - + + + diff --git a/redisson/pom.xml b/redisson/pom.xml index 5515c63af..b2cfcbfd5 100644 --- a/redisson/pom.xml +++ b/redisson/pom.xml @@ -350,7 +350,7 @@ org.codehaus.mojo versions-maven-plugin - 2.2 + 2.5 @@ -372,7 +372,7 @@ org.apache.maven.plugins maven-pmd-plugin - 3.6 + 3.9.0 verify @@ -393,7 +393,7 @@ org.apache.maven.plugins maven-checkstyle-plugin - 2.17 + 3.0.0 verify @@ -411,7 +411,7 @@ maven-compiler-plugin - 3.6.1 + 3.7.0 ${source.version} ${source.version} @@ -437,7 +437,7 @@ org.apache.maven.plugins maven-surefire-plugin - 2.19.1 + 2.21.0 diff --git a/redisson/src/main/java/org/redisson/RedissonLiveObjectService.java b/redisson/src/main/java/org/redisson/RedissonLiveObjectService.java index fd43b66ae..5c5bbab13 100644 --- a/redisson/src/main/java/org/redisson/RedissonLiveObjectService.java +++ b/redisson/src/main/java/org/redisson/RedissonLiveObjectService.java @@ -485,8 +485,12 @@ public class RedissonLiveObjectService implements RLiveObjectService { } @Override - public void delete(Class entityClass, K id) { - asLiveObject(get(entityClass, id)).delete(); + public boolean delete(Class entityClass, K id) { + T entity = get(entityClass, id); + if (entity == null) { + return false; + } + return asLiveObject(entity).delete(); } @Override diff --git a/redisson/src/main/java/org/redisson/api/BatchOptions.java b/redisson/src/main/java/org/redisson/api/BatchOptions.java index 2dc85bd78..dfd15d5c3 100644 --- a/redisson/src/main/java/org/redisson/api/BatchOptions.java +++ b/redisson/src/main/java/org/redisson/api/BatchOptions.java @@ -122,7 +122,7 @@ public class BatchOptions { } /** - * Atomically executes all batched commands as a single command. + * Switches batch to atomic mode. Redis atomically executes all commands of this batch as a single command. *

* Please note, that in cluster mode all objects should be on the same cluster slot. * https://github.com/antirez/redis/issues/3682 @@ -138,7 +138,7 @@ public class BatchOptions { } /** - * Inform Redis not to send reply. It may save network traffic. + * Inform Redis not to send reply. This allows to save network traffic for commands with batch with big response. *

* NOTE: Redis 3.2+ required * diff --git a/redisson/src/main/java/org/redisson/api/RLiveObjectService.java b/redisson/src/main/java/org/redisson/api/RLiveObjectService.java index f5cae8c8c..cffaaf23f 100644 --- a/redisson/src/main/java/org/redisson/api/RLiveObjectService.java +++ b/redisson/src/main/java/org/redisson/api/RLiveObjectService.java @@ -120,9 +120,11 @@ public interface RLiveObjectService { * @param Key type * @param entityClass - object class * @param id - object id + * + * @return true if entity was deleted successfully, false otherwise */ - void delete(Class entityClass, K id); - + boolean delete(Class entityClass, K id); + /** * To cast the instance to RLiveObject instance. * diff --git a/redisson/src/main/java/org/redisson/connection/MasterSlaveConnectionManager.java b/redisson/src/main/java/org/redisson/connection/MasterSlaveConnectionManager.java index d2ad9c769..24a765c6a 100644 --- a/redisson/src/main/java/org/redisson/connection/MasterSlaveConnectionManager.java +++ b/redisson/src/main/java/org/redisson/connection/MasterSlaveConnectionManager.java @@ -142,12 +142,10 @@ public class MasterSlaveConnectionManager implements ConnectionManager { private final ConnectionEventsHub connectionEventsHub = new ConnectionEventsHub(); - private final AsyncSemaphore[] locks = new AsyncSemaphore[50]; - private final ExecutorService executor; private final CommandSyncService commandExecutor; - + private final Config cfg; protected final DnsAddressResolverGroup resolverGroup; @@ -156,12 +154,6 @@ public class MasterSlaveConnectionManager implements ConnectionManager { private final Map nodeConnections = PlatformDependent.newConcurrentHashMap(); - { - for (int i = 0; i < locks.length; i++) { - locks[i] = new AsyncSemaphore(1); - } - } - public MasterSlaveConnectionManager(MasterSlaveServersConfig cfg, Config config, UUID id) { this(config, id); this.config = cfg; @@ -186,7 +178,7 @@ public class MasterSlaveConnectionManager implements ConnectionManager { } else if (cfg.getTransportMode() == TransportMode.KQUEUE) { if (cfg.getEventLoopGroup() == null) { this.group = new KQueueEventLoopGroup(cfg.getNettyThreads(), new DefaultThreadFactory("redisson-netty")); - } else { + } else { this.group = cfg.getEventLoopGroup(); } @@ -218,6 +210,19 @@ public class MasterSlaveConnectionManager implements ConnectionManager { this.shutdownPromise = new RedissonPromise(); this.commandExecutor = new CommandSyncService(this); } + + /* + * Remove it once https://github.com/netty/netty/issues/7882 get resolved + */ + protected DnsAddressResolverGroup createResolverGroup() { + if (cfg.getTransportMode() == TransportMode.EPOLL) { + return cfg.getAddressResolverGroupFactory().create(EpollDatagramChannel.class, DnsServerAddressStreamProviders.platformDefault()); + } else if (cfg.getTransportMode() == TransportMode.KQUEUE) { + return cfg.getAddressResolverGroupFactory().create(KQueueDatagramChannel.class, DnsServerAddressStreamProviders.platformDefault()); + } + + return cfg.getAddressResolverGroupFactory().create(NioDatagramChannel.class, DnsServerAddressStreamProviders.platformDefault()); + } protected void closeNodeConnections() { List> futures = new ArrayList>(); @@ -351,7 +356,7 @@ public class MasterSlaveConnectionManager implements ConnectionManager { } RFuture f = entry.setupMasterEntry(config.getMasterAddress()); f.syncUninterruptibly(); - + for (int slot = singleSlotRange.getStartSlot(); slot < singleSlotRange.getEndSlot() + 1; slot++) { addEntry(slot, entry); } @@ -499,14 +504,14 @@ public class MasterSlaveConnectionManager implements ConnectionManager { for (MasterSlaveEntry entry : client2entry.values()) { if (URIBuilder.compare(entry.getClient().getAddr(), addr)) { return entry; - } + } if (entry.hasSlave(addr)) { return entry; } } return null; } - + @Override public MasterSlaveEntry getEntry(RedisClient redisClient) { MasterSlaveEntry entry = client2entry.get(redisClient); @@ -636,7 +641,7 @@ public class MasterSlaveConnectionManager implements ConnectionManager { for (MasterSlaveEntry entry : getEntrySet()) { entry.shutdown(); } - + if (cfg.getExecutor() == null) { executor.shutdown(); try { diff --git a/redisson/src/main/java/org/redisson/connection/MasterSlaveEntry.java b/redisson/src/main/java/org/redisson/connection/MasterSlaveEntry.java index b1155f0a9..a9be96df1 100644 --- a/redisson/src/main/java/org/redisson/connection/MasterSlaveEntry.java +++ b/redisson/src/main/java/org/redisson/connection/MasterSlaveEntry.java @@ -115,7 +115,7 @@ public class MasterSlaveEntry { } return result; } - + public RFuture setupMasterEntry(InetSocketAddress address, URI uri) { RedisClient client = connectionManager.createClient(NodeType.MASTER, address, uri, sslHostname); return setupMasterEntry(client); @@ -139,25 +139,25 @@ public class MasterSlaveEntry { return; } - masterEntry = new ClientConnectionsEntry( - client, - config.getMasterConnectionMinimumIdleSize(), - config.getMasterConnectionPoolSize(), - config.getSubscriptionConnectionMinimumIdleSize(), - config.getSubscriptionConnectionPoolSize(), - connectionManager, + masterEntry = new ClientConnectionsEntry( + client, + config.getMasterConnectionMinimumIdleSize(), + config.getMasterConnectionPoolSize(), + config.getSubscriptionConnectionMinimumIdleSize(), + config.getSubscriptionConnectionPoolSize(), + connectionManager, NodeType.MASTER); - - CountableListener listener = new CountableListener(result, client); - RFuture writeFuture = writeConnectionPool.add(masterEntry); - listener.incCounter(); - writeFuture.addListener(listener); - - if (config.getSubscriptionMode() == SubscriptionMode.MASTER) { - RFuture pubSubFuture = pubSubConnectionPool.add(masterEntry); - listener.incCounter(); - pubSubFuture.addListener(listener); - } + + CountableListener listener = new CountableListener(result, client); + RFuture writeFuture = writeConnectionPool.add(masterEntry); + listener.incCounter(); + writeFuture.addListener(listener); + + if (config.getSubscriptionMode() == SubscriptionMode.MASTER) { + RFuture pubSubFuture = pubSubConnectionPool.add(masterEntry); + listener.incCounter(); + pubSubFuture.addListener(listener); + } } }); @@ -306,7 +306,7 @@ public class MasterSlaveEntry { public RFuture addSlave(InetSocketAddress address, URI uri) { return addSlave(address, uri, false, NodeType.SLAVE); } - + private RFuture addSlave(final RedisClient client, final boolean freezed, final NodeType nodeType) { final RPromise result = new RedissonPromise(); RFuture addrFuture = client.resolveAddr(); @@ -317,7 +317,7 @@ public class MasterSlaveEntry { result.tryFailure(future.cause()); return; } - + ClientConnectionsEntry entry = new ClientConnectionsEntry(client, config.getSlaveConnectionMinimumIdleSize(), config.getSlaveConnectionPoolSize(), @@ -335,7 +335,7 @@ public class MasterSlaveEntry { }); return result; } - + private RFuture addSlave(InetSocketAddress address, URI uri, final boolean freezed, final NodeType nodeType) { RedisClient client = connectionManager.createClient(NodeType.SLAVE, address, uri, sslHostname); return addSlave(client, freezed, nodeType); @@ -346,6 +346,10 @@ public class MasterSlaveEntry { return addSlave(client, freezed, nodeType); } + public ClientConnectionsEntry getSlaveEntry(RedisClient client) { + return slaveBalancer.getEntry(client); + } + public Collection getSlaveEntries() { List result = new ArrayList(); for (ClientConnectionsEntry slaveEntry : slaveBalancer.getEntries()) { @@ -467,22 +471,6 @@ public class MasterSlaveEntry { }); } - public boolean isFreezed() { - return masterEntry.isFreezed(); - } - - public FreezeReason getFreezeReason() { - return masterEntry.getFreezeReason(); - } - - public void unfreeze() { - masterEntry.resetFirstFail(); - synchronized (masterEntry) { - masterEntry.setFreezed(false); - masterEntry.setFreezeReason(null); - } - } - public void shutdownMasterAsync() { if (!active.compareAndSet(true, false)) { return; diff --git a/redisson/src/main/java/org/redisson/connection/balancer/LoadBalancerManager.java b/redisson/src/main/java/org/redisson/connection/balancer/LoadBalancerManager.java index d4d14f0d0..af5f51597 100644 --- a/redisson/src/main/java/org/redisson/connection/balancer/LoadBalancerManager.java +++ b/redisson/src/main/java/org/redisson/connection/balancer/LoadBalancerManager.java @@ -86,8 +86,8 @@ public class LoadBalancerManager { CountableListener listener = new CountableListener(result, null) { @Override protected void onSuccess(Void value) { - client2Entry.put(entry.getClient(), entry); - } + client2Entry.put(entry.getClient(), entry); + } }; RFuture slaveFuture = slaveConnectionPool.add(entry); @@ -149,12 +149,12 @@ public class LoadBalancerManager { } return false; } - + public ClientConnectionsEntry freeze(URI address, FreezeReason freezeReason) { ClientConnectionsEntry connectionEntry = getEntry(address); return freeze(connectionEntry, freezeReason); } - + public ClientConnectionsEntry freeze(InetSocketAddress address, FreezeReason freezeReason) { ClientConnectionsEntry connectionEntry = getEntry(address); return freeze(connectionEntry, freezeReason); @@ -197,7 +197,7 @@ public class LoadBalancerManager { public boolean contains(URI addr) { return getEntry(addr) != null; } - + public boolean contains(RedisClient redisClient) { return getEntry(redisClient) != null; } @@ -222,8 +222,7 @@ public class LoadBalancerManager { return null; } - - protected ClientConnectionsEntry getEntry(RedisClient redisClient) { + public ClientConnectionsEntry getEntry(RedisClient redisClient) { return client2Entry.get(redisClient); } diff --git a/redisson/src/test/java/org/redisson/RedissonLiveObjectServiceTest.java b/redisson/src/test/java/org/redisson/RedissonLiveObjectServiceTest.java index 560820f6e..682326814 100644 --- a/redisson/src/test/java/org/redisson/RedissonLiveObjectServiceTest.java +++ b/redisson/src/test/java/org/redisson/RedissonLiveObjectServiceTest.java @@ -1401,6 +1401,11 @@ public class RedissonLiveObjectServiceTest extends BaseTest { assertThat(redisson.getKeys().count()).isEqualTo(1); } + @Test + public void testDeleteNotExisted() { + RLiveObjectService service = redisson.getLiveObjectService(); + assertThat(service.delete(Customer.class, "id")).isFalse(); + } @Test public void testDelete() {