Fixed - RedissonReadLock by name with colon couldn't be unlocked properly #1219

pull/1263/head
Nikita 7 years ago
parent 1c4df64185
commit 3db1c46c42

@ -87,6 +87,8 @@ public class RedissonReadLock extends RedissonLock implements RLock {
@Override
protected RFuture<Boolean> unlockInnerAsync(long threadId) {
String timeoutPrefix = getReadWriteTimeoutNamePrefix(threadId);
String keyPrefix = timeoutPrefix.split(":" + getLockName(threadId))[0];
return commandExecutor.evalWriteAsync(getName(), LongCodec.INSTANCE, RedisCommands.EVAL_BOOLEAN,
"local mode = redis.call('hget', KEYS[1], 'mode'); " +
"if (mode == false) then " +
@ -129,7 +131,7 @@ public class RedissonReadLock extends RedissonLock implements RLock {
"redis.call('del', KEYS[1]); " +
"redis.call('publish', KEYS[2], ARGV[1]); " +
"return 1; ",
Arrays.<Object>asList(getName(), getChannelName(), timeoutPrefix, timeoutPrefix.split(":")[0]),
Arrays.<Object>asList(getName(), getChannelName(), timeoutPrefix, keyPrefix),
LockPubSub.unlockMessage, getLockName(threadId));
}

@ -1,10 +1,20 @@
package org.redisson;
import static org.assertj.core.api.Assertions.assertThat;
import static org.assertj.core.api.Assertions.assertThatCode;
import static org.awaitility.Awaitility.await;
import java.security.SecureRandom;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.TimeoutException;
import java.util.concurrent.atomic.AtomicBoolean;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.concurrent.atomic.AtomicReference;
@ -18,10 +28,38 @@ import org.redisson.api.RReadWriteLock;
import org.redisson.api.RedissonClient;
import org.redisson.config.Config;
import static org.awaitility.Awaitility.*;
public class RedissonReadWriteLockTest extends BaseConcurrentTest {
@Test
public void testName() throws InterruptedException, ExecutionException, TimeoutException {
ExecutorService service = Executors.newFixedThreadPool(10);
RReadWriteLock rwlock = redisson.getReadWriteLock("{test}:abc:key");
RLock rlock = rwlock.readLock();
List<Callable<Void>> callables = new ArrayList<>();
for (int i = 0; i < 10; i++) {
callables.add(() -> {
for (int j = 0; j < 10; j++) {
rlock.lock();
try {
} finally {
rlock.unlock();
}
}
return null;
});
}
List<Future<Void>> futures = service.invokeAll(callables);
for (Future<Void> future : futures) {
assertThatCode(future::get).doesNotThrowAnyException();
}
service.shutdown();
assertThat(service.awaitTermination(1, TimeUnit.MINUTES)).isTrue();
}
@Test
public void testWriteLockExpiration() throws InterruptedException {
RReadWriteLock rw1 = redisson.getReadWriteLock("test2s3");

Loading…
Cancel
Save