fix infinite loop in RedLock or MultiLock

pull/1888/head
zhaixiaoxiang 6 years ago
parent 6fc768ad40
commit e592e0e7fa

@ -82,9 +82,9 @@ public class RedissonMultiLock implements Lock {
long waitTime = -1;
if (leaseTime == -1) {
waitTime = baseWaitTime;
unit = TimeUnit.MILLISECONDS;
} else {
waitTime = unit.toMillis(leaseTime);
leaseTime = unit.toMillis(leaseTime);
waitTime = leaseTime;
if (waitTime <= 2000) {
waitTime = 2000;
} else if (waitTime <= baseWaitTime) {
@ -92,11 +92,10 @@ public class RedissonMultiLock implements Lock {
} else {
waitTime = ThreadLocalRandom.current().nextLong(baseWaitTime, waitTime);
}
waitTime = unit.convert(waitTime, TimeUnit.MILLISECONDS);
}
RPromise<Void> result = new RedissonPromise<Void>();
tryLockAsync(leaseTime, unit, waitTime, result);
tryLockAsync(leaseTime, TimeUnit.MILLISECONDS, waitTime, result);
return result;
}
@ -129,9 +128,9 @@ public class RedissonMultiLock implements Lock {
long waitTime = -1;
if (leaseTime == -1) {
waitTime = baseWaitTime;
unit = TimeUnit.MILLISECONDS;
} else {
waitTime = unit.toMillis(leaseTime);
leaseTime = unit.toMillis(leaseTime);
waitTime = leaseTime;
if (waitTime <= 2000) {
waitTime = 2000;
} else if (waitTime <= baseWaitTime) {
@ -139,11 +138,10 @@ public class RedissonMultiLock implements Lock {
} else {
waitTime = ThreadLocalRandom.current().nextLong(baseWaitTime, waitTime);
}
waitTime = unit.convert(waitTime, TimeUnit.MILLISECONDS);
}
while (true) {
if (tryLock(waitTime, leaseTime, unit)) {
if (tryLock(waitTime, leaseTime, TimeUnit.MILLISECONDS)) {
return;
}
}

@ -23,7 +23,21 @@ import static org.assertj.core.api.Assertions.assertThat;
public class RedissonRedLockTest {
@Test
public void testLockLeasetime() throws IOException, InterruptedException {
public void testLockLeasetimeWithMilliSeconds() throws IOException, InterruptedException {
testLockLeasetime(2000, TimeUnit.MILLISECONDS);
}
@Test
public void testLockLeasetimeWithSeconds() throws IOException, InterruptedException {
testLockLeasetime(2, TimeUnit.SECONDS);
}
@Test
public void testLockLeasetimeWithMinutes() throws IOException, InterruptedException {
testLockLeasetime(1, TimeUnit.MINUTES);
}
private void testLockLeasetime(final long leaseTime, final TimeUnit unit) throws IOException, InterruptedException {
RedisProcess redis1 = redisTestMultilockInstance();
RedisProcess redis2 = redisTestMultilockInstance();
@ -47,7 +61,7 @@ public class RedissonRedLockTest {
executor.submit(() -> {
for (int j = 0; j < 5; j++) {
try {
lock.lock(2, TimeUnit.SECONDS);
lock.lock(leaseTime, unit);
int nextValue = counter.get() + 1;
Thread.sleep(1000);
counter.set(nextValue);

Loading…
Cancel
Save