From ff8f8beccc9ace7d1c343947bc4d024b11886189 Mon Sep 17 00:00:00 2001 From: LearningBot Date: Fri, 9 Jun 2023 17:32:10 +0800 Subject: [PATCH 1/5] remove unnecessary generic type definition in RedissonLock.java Signed-off-by: wynn5a --- redisson/src/main/java/org/redisson/RedissonLock.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/redisson/src/main/java/org/redisson/RedissonLock.java b/redisson/src/main/java/org/redisson/RedissonLock.java index 4959a67b3..9dae02f97 100644 --- a/redisson/src/main/java/org/redisson/RedissonLock.java +++ b/redisson/src/main/java/org/redisson/RedissonLock.java @@ -172,7 +172,7 @@ public class RedissonLock extends RedissonBaseLock { return new CompletableFutureWrapper<>(f); } - private RFuture tryAcquireAsync(long waitTime, long leaseTime, TimeUnit unit, long threadId) { + private RFuture tryAcquireAsync(long waitTime, long leaseTime, TimeUnit unit, long threadId) { RFuture ttlRemainingFuture; if (leaseTime > 0) { ttlRemainingFuture = tryLockInnerAsync(waitTime, leaseTime, unit, threadId, RedisCommands.EVAL_LONG); From 295dec1a2a3432e31c6e44501072a63a07358b45 Mon Sep 17 00:00:00 2001 From: vladimirkl <72238+vladimirkl@users.noreply.github.com> Date: Fri, 9 Jun 2023 10:54:33 +0300 Subject: [PATCH 2/5] Fixed wait time handling in RedissonSpinLock #5002 Signed-off-by: vladimirkl <72238+vladimirkl@users.noreply.github.com> --- .../java/org/redisson/RedissonSpinLock.java | 29 +++++++------------ .../org/redisson/RedissonSpinLockTest.java | 21 ++++++++++++++ 2 files changed, 31 insertions(+), 19 deletions(-) diff --git a/redisson/src/main/java/org/redisson/RedissonSpinLock.java b/redisson/src/main/java/org/redisson/RedissonSpinLock.java index 4299af0d9..a7786dcf5 100644 --- a/redisson/src/main/java/org/redisson/RedissonSpinLock.java +++ b/redisson/src/main/java/org/redisson/RedissonSpinLock.java @@ -27,7 +27,6 @@ import java.util.Collections; import java.util.concurrent.CompletableFuture; import java.util.concurrent.CompletionStage; import java.util.concurrent.TimeUnit; -import java.util.concurrent.atomic.AtomicLong; /** * Distributed implementation of {@link java.util.concurrent.locks.Lock} @@ -145,31 +144,28 @@ public class RedissonSpinLock extends RedissonBaseLock { @Override public boolean tryLock(long waitTime, long leaseTime, TimeUnit unit) throws InterruptedException { - long time = unit.toMillis(waitTime); - long current = System.currentTimeMillis(); - long threadId = Thread.currentThread().getId(); + final long time = unit.toMillis(waitTime); + final long current = System.currentTimeMillis(); + final long threadId = Thread.currentThread().getId(); Long ttl = tryAcquire(leaseTime, unit, threadId); // lock acquired if (ttl == null) { return true; } - time -= System.currentTimeMillis() - current; - if (time <= 0) { + if (System.currentTimeMillis() - current >= time) { acquireFailed(waitTime, unit, threadId); return false; } LockOptions.BackOffPolicy backOffPolicy = backOff.create(); while (true) { - current = System.currentTimeMillis(); Thread.sleep(backOffPolicy.getNextSleepPeriod()); ttl = tryAcquire(leaseTime, unit, threadId); if (ttl == null) { return true; } - time -= System.currentTimeMillis() - current; - if (time <= 0) { + if (System.currentTimeMillis() - current >= time) { acquireFailed(waitTime, unit, threadId); return false; } @@ -262,16 +258,14 @@ public class RedissonSpinLock extends RedissonBaseLock { long currentThreadId) { CompletableFuture result = new CompletableFuture<>(); - AtomicLong time = new AtomicLong(unit.toMillis(waitTime)); LockOptions.BackOffPolicy backOffPolicy = backOff.create(); - tryLock(leaseTime, unit, currentThreadId, result, time, backOffPolicy); + tryLock(System.currentTimeMillis(), leaseTime, unit, currentThreadId, result, unit.toMillis(waitTime), backOffPolicy); return new CompletableFutureWrapper<>(result); } - private void tryLock(long leaseTime, TimeUnit unit, long currentThreadId, CompletableFuture result, - AtomicLong time, LockOptions.BackOffPolicy backOffPolicy) { - long startTime = System.currentTimeMillis(); + private void tryLock(long startTime, long leaseTime, TimeUnit unit, long currentThreadId, CompletableFuture result, + long waitTime, LockOptions.BackOffPolicy backOffPolicy) { RFuture ttlFuture = tryAcquireAsync(leaseTime, unit, currentThreadId); ttlFuture.whenComplete((ttl, e) -> { if (e != null) { @@ -287,17 +281,14 @@ public class RedissonSpinLock extends RedissonBaseLock { return; } - long el = System.currentTimeMillis() - startTime; - time.addAndGet(-el); - - if (time.get() <= 0) { + if (System.currentTimeMillis() - startTime >= waitTime) { trySuccessFalse(currentThreadId, result); return; } long nextSleepPeriod = backOffPolicy.getNextSleepPeriod(); getServiceManager().newTimeout( - timeout -> tryLock(leaseTime, unit, currentThreadId, result, time, backOffPolicy), + timeout -> tryLock(startTime, leaseTime, unit, currentThreadId, result, waitTime, backOffPolicy), nextSleepPeriod, TimeUnit.MILLISECONDS); }); } diff --git a/redisson/src/test/java/org/redisson/RedissonSpinLockTest.java b/redisson/src/test/java/org/redisson/RedissonSpinLockTest.java index 36e0800f7..cee8c96bd 100644 --- a/redisson/src/test/java/org/redisson/RedissonSpinLockTest.java +++ b/redisson/src/test/java/org/redisson/RedissonSpinLockTest.java @@ -473,6 +473,27 @@ public class RedissonSpinLockTest extends BaseConcurrentTest { } + @Test + public void testTryLockAsyncWaitTime() throws InterruptedException { + RLock lock = redisson.getSpinLock("lock"); + lock.lock(); + + AtomicBoolean lockAsyncSucceed = new AtomicBoolean(true); + Thread thread = new Thread(() -> { + RFuture booleanRFuture = lock.tryLockAsync(1, 30, TimeUnit.SECONDS); + booleanRFuture.whenComplete((res, e) -> { + if (e != null) { + Assertions.fail("Lock aquire failed for some reason"); + } + lockAsyncSucceed.set(res); + }); + }); + thread.start(); + Thread.sleep(1500); + assertThat(lockAsyncSucceed.get()).isFalse(); + lock.forceUnlock(); + } + @Test public void testTryLockAsyncFailed() throws InterruptedException { RLock lock = redisson.getSpinLock("lock"); From ae9dddd5746cab45c61d511a3bbbb58bc7f1260d Mon Sep 17 00:00:00 2001 From: wynn5a Date: Mon, 12 Jun 2023 17:57:54 +0800 Subject: [PATCH 3/5] Fixed: issue #5094 - java.lang.ClassCastException:MonoNext cannot be cast to class Flux Signed-off-by: wynn5a --- .../redisson/reactive/ReactiveProxyBuilder.java | 9 ++++++++- .../org/redisson/RedissonDequeReactiveTest.java | 17 +++++++++++++++++ 2 files changed, 25 insertions(+), 1 deletion(-) diff --git a/redisson/src/main/java/org/redisson/reactive/ReactiveProxyBuilder.java b/redisson/src/main/java/org/redisson/reactive/ReactiveProxyBuilder.java index ca20f141a..770d5602e 100644 --- a/redisson/src/main/java/org/redisson/reactive/ReactiveProxyBuilder.java +++ b/redisson/src/main/java/org/redisson/reactive/ReactiveProxyBuilder.java @@ -21,6 +21,8 @@ import java.util.concurrent.Callable; import org.redisson.api.RFuture; import org.redisson.misc.ProxyBuilder; import org.redisson.misc.ProxyBuilder.Callback; +import reactor.core.publisher.Flux; +import reactor.core.publisher.Mono; /** * @@ -37,7 +39,12 @@ public class ReactiveProxyBuilder { return ProxyBuilder.create(new Callback() { @Override public Object execute(Callable> callable, Method instanceMethod) { - return commandExecutor.reactive(callable); + Mono result = commandExecutor.reactive(callable); + if(instanceMethod.getReturnType().isAssignableFrom(Flux.class)){ + Mono monoListResult = result.cast(Iterable.class); + return monoListResult.flatMapMany(Flux::fromIterable); + } + return result; } }, instance, implementation, clazz, commandExecutor.getServiceManager()); } diff --git a/redisson/src/test/java/org/redisson/RedissonDequeReactiveTest.java b/redisson/src/test/java/org/redisson/RedissonDequeReactiveTest.java index 0c169cd1f..a53d1f815 100644 --- a/redisson/src/test/java/org/redisson/RedissonDequeReactiveTest.java +++ b/redisson/src/test/java/org/redisson/RedissonDequeReactiveTest.java @@ -124,4 +124,21 @@ public class RedissonDequeReactiveTest extends BaseReactiveTest { assertThat(toIterator(queue.descendingIterator())).toIterable().containsExactly(3, 2, 1); } + @Test + public void testPollLast() { + final RDequeReactive queue = redisson.getDeque("deque"); + sync(queue.addAll(Arrays.asList(1, 2, 3))); + + assertThat(toIterator(queue.pollLast(2))).toIterable().containsExactly(3, 2); + } + + @Test + public void testPollFirst() { + final RDequeReactive queue = redisson.getDeque("deque"); + sync(queue.addAll(Arrays.asList(1, 2, 3))); + + assertThat(toIterator(queue.pollFirst(2))).toIterable().containsExactly(1, 2); + } + + } From f398185925bc8b34cf4664fbd7805b31b634e7b1 Mon Sep 17 00:00:00 2001 From: Nikita Koksharov Date: Tue, 13 Jun 2023 08:18:54 +0300 Subject: [PATCH 4/5] Update README.md --- redisson-tomcat/README.md | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/redisson-tomcat/README.md b/redisson-tomcat/README.md index a9a801c6c..837a99690 100644 --- a/redisson-tomcat/README.md +++ b/redisson-tomcat/README.md @@ -67,14 +67,14 @@ Amount of Redisson instances created by Tomcat for multiple contexts could be re ### 2. Copy two jars into `TOMCAT_BASE/lib` directory: -[redisson-all-3.22.0.jar](https://repository.sonatype.org/service/local/artifact/maven/redirect?r=central-proxy&g=org.redisson&a=redisson-all&v=3.22.0&e=jar) +[redisson-all-3.22.0.jar](https://repo1.maven.org/maven2/org/redisson/redisson-all/3.22.0/redisson-all-3.22.0.jar) -Tomcat 7.x - [redisson-tomcat-7-3.22.0.jar](https://repository.sonatype.org/service/local/artifact/maven/redirect?r=central-proxy&g=org.redisson&a=redisson-tomcat-7&v=3.22.0&e=jar) +Tomcat 7.x - [redisson-tomcat-7-3.22.0.jar](https://repo1.maven.org/maven2/org/redisson/redisson-tomcat-7/3.22.0/redisson-tomcat-7-3.22.0.jar) -Tomcat 8.x - [redisson-tomcat-8-3.22.0.jar](https://repository.sonatype.org/service/local/artifact/maven/redirect?r=central-proxy&g=org.redisson&a=redisson-tomcat-8&v=3.22.0&e=jar) +Tomcat 8.x - [redisson-tomcat-8-3.22.0.jar](https://repo1.maven.org/maven2/org/redisson/redisson-tomcat-8/3.22.0/redisson-tomcat-8-3.22.0.jar) -Tomcat 9.x - [redisson-tomcat-9-3.22.0.jar](https://repository.sonatype.org/service/local/artifact/maven/redirect?r=central-proxy&g=org.redisson&a=redisson-tomcat-9&v=3.22.0&e=jar) +Tomcat 9.x - [redisson-tomcat-9-3.22.0.jar](https://repo1.maven.org/maven2/org/redisson/redisson-tomcat-9/3.22.0/redisson-tomcat-9-3.22.0.jar) -Tomcat 10.x - [redisson-tomcat-10-3.22.0.jar](https://repository.sonatype.org/service/local/artifact/maven/redirect?r=central-proxy&g=org.redisson&a=redisson-tomcat-10&v=3.22.0&e=jar) +Tomcat 10.x - [redisson-tomcat-10-3.22.0.jar](https://repo1.maven.org/maven2/org/redisson/redisson-tomcat-10/3.22.0/redisson-tomcat-10-3.22.0.jar) Try __[Redisson PRO](https://redisson.pro)__ with **ultra-fast performance** and **support by SLA**. From 2ef67fef1acb3ced009fd1bfbf18cb3001073b5e Mon Sep 17 00:00:00 2001 From: wynn5a Date: Tue, 13 Jun 2023 15:25:09 +0800 Subject: [PATCH 5/5] Fixed: check style issue Signed-off-by: wynn5a --- .../main/java/org/redisson/reactive/ReactiveProxyBuilder.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/redisson/src/main/java/org/redisson/reactive/ReactiveProxyBuilder.java b/redisson/src/main/java/org/redisson/reactive/ReactiveProxyBuilder.java index 770d5602e..3ff43253e 100644 --- a/redisson/src/main/java/org/redisson/reactive/ReactiveProxyBuilder.java +++ b/redisson/src/main/java/org/redisson/reactive/ReactiveProxyBuilder.java @@ -40,7 +40,7 @@ public class ReactiveProxyBuilder { @Override public Object execute(Callable> callable, Method instanceMethod) { Mono result = commandExecutor.reactive(callable); - if(instanceMethod.getReturnType().isAssignableFrom(Flux.class)){ + if (instanceMethod.getReturnType().isAssignableFrom(Flux.class)) { Mono monoListResult = result.cast(Iterable.class); return monoListResult.flatMapMany(Flux::fromIterable); }