diff --git a/redisson/src/main/java/org/redisson/RedissonBaseLock.java b/redisson/src/main/java/org/redisson/RedissonBaseLock.java index b366f31e4..6203d3d4e 100644 --- a/redisson/src/main/java/org/redisson/RedissonBaseLock.java +++ b/redisson/src/main/java/org/redisson/RedissonBaseLock.java @@ -174,7 +174,13 @@ public abstract class RedissonBaseLock extends RedissonExpirable implements RLoc oldEntry.addThreadId(threadId); } else { entry.addThreadId(threadId); - renewExpiration(); + try { + renewExpiration(); + } finally { + if (Thread.currentThread().isInterrupted()) { + cancelExpirationRenewal(threadId); + } + } } } diff --git a/redisson/src/main/java/org/redisson/command/CommandAsyncService.java b/redisson/src/main/java/org/redisson/command/CommandAsyncService.java index b7a4b6f77..44ad4fdea 100644 --- a/redisson/src/main/java/org/redisson/command/CommandAsyncService.java +++ b/redisson/src/main/java/org/redisson/command/CommandAsyncService.java @@ -112,6 +112,7 @@ public class CommandAsyncService implements CommandAsyncExecutor { try { future.await(); } catch (InterruptedException e) { + future.cancel(true); Thread.currentThread().interrupt(); throw new RedisException(e); } diff --git a/redisson/src/test/java/org/redisson/RedissonLockTest.java b/redisson/src/test/java/org/redisson/RedissonLockTest.java index b412d9d5c..414f46fa8 100644 --- a/redisson/src/test/java/org/redisson/RedissonLockTest.java +++ b/redisson/src/test/java/org/redisson/RedissonLockTest.java @@ -111,6 +111,29 @@ public class RedissonLockTest extends BaseConcurrentTest { runner.stop(); } + @Test + public void testLockIsNotRenewedAfterInterruptedTryLock() throws InterruptedException { + final CountDownLatch countDownLatch = new CountDownLatch(1); + RLock lock = redisson.getLock("myLock"); + assertThat(lock.isLocked()).isFalse(); + + Thread thread = new Thread(() -> { + countDownLatch.countDown(); + if (!lock.tryLock()) { + return; + } + lock.unlock(); + }); + thread.start(); + countDownLatch.await(); + // let the tcp request be sent out + TimeUnit.MILLISECONDS.sleep(5); + thread.interrupt(); + TimeUnit.SECONDS.sleep(45); + + assertThat(lock.isLocked()).isFalse(); + } + @Test public void testRedisFailed() { Assertions.assertThrows(WriteRedisConnectionException.class, () -> {