diff --git a/redisson/src/main/java/org/redisson/RedissonReadLock.java b/redisson/src/main/java/org/redisson/RedissonReadLock.java index ebe650c3a..a55885116 100644 --- a/redisson/src/main/java/org/redisson/RedissonReadLock.java +++ b/redisson/src/main/java/org/redisson/RedissonReadLock.java @@ -97,7 +97,7 @@ public class RedissonReadLock extends RedissonLock implements RLock { "local counter = redis.call('hincrby', KEYS[1], ARGV[2], -1); " + "if (counter == 0) then " + - "redis.call('hdel', KEYS[1], ARGV[2]); " + + "redis.call('hdel', KEYS[1], ARGV[2]); " + "end;" + "redis.call('del', KEYS[1] .. ':' .. ARGV[2] .. ':rwlock_timeout:' .. (counter+1)); " + "if (redis.call('hlen', KEYS[1]) > 1) then " + @@ -114,9 +114,13 @@ public class RedissonReadLock extends RedissonLock implements RLock { "end; " + "if maxRemainTime > 0 then " + - "redis.call('pexpire', KEYS[1], maxRemainTime); " + + "redis.call('pexpire', KEYS[1], maxRemainTime); " + "return 0; " + "end;" + + + "if mode == 'write' then " + + "return 0;" + + "end; " + "end; " + "redis.call('del', KEYS[1]); " + diff --git a/redisson/src/test/java/org/redisson/RedissonReadWriteLockTest.java b/redisson/src/test/java/org/redisson/RedissonReadWriteLockTest.java index d6d903a2d..837a8d375 100644 --- a/redisson/src/test/java/org/redisson/RedissonReadWriteLockTest.java +++ b/redisson/src/test/java/org/redisson/RedissonReadWriteLockTest.java @@ -95,6 +95,22 @@ public class RedissonReadWriteLockTest extends BaseConcurrentTest { Assert.assertTrue(writeLock.tryLock()); } + @Test + public void testWR() throws InterruptedException { + RReadWriteLock rw = redisson.getReadWriteLock("my_read_write_lock"); + RLock writeLock = rw.writeLock(); + writeLock.lock(); + + rw.readLock().lock(); + assertThat(writeLock.isLocked()).isTrue(); + rw.readLock().unlock(); + + assertThat(writeLock.isLocked()).isTrue(); + writeLock.unlock(); + assertThat(writeLock.isLocked()).isFalse(); + } + + @Test public void testWriteReadReentrancy() throws InterruptedException { RReadWriteLock readWriteLock = redisson.getReadWriteLock("TEST");