Fix JdbcLockRegDiffClientTests race condition

https://build.spring.io/browse/INT-MJATS41-1242

When different `DefaultLockRepository` instances use the same client id,
there is a possibility that they will update the same row in the table.
This way we have a chance that not only one obtains a lock and try to
add a value to the collection.

* Remove the test-case for the same client id as non-stable and even
dangerous by the the distributed lock purpose
* Use `tryLock(Long.MAX_VALUE)` to really ensure the wait behavior
during the concurrent loop
* Use `20` for thread pool to align with the tasks amount

**Cherry-picked to 4.3.x**
This commit is contained in:
Artem Bilan
2018-01-24 17:26:33 -05:00
parent c48a2392d2
commit 2fbb6fbaf4

View File

@@ -191,26 +191,19 @@ public class JdbcLockRegistryDifferentClientTests {
@Test
public void testOnlyOneLock() throws Exception {
testOnlyOneLock(null);
testOnlyOneLock("AABBCCDD");
}
private void testOnlyOneLock(String id) throws Exception {
for (int i = 0; i < 100; i++) {
final BlockingQueue<String> locked = new LinkedBlockingQueue<>();
final CountDownLatch latch = new CountDownLatch(20);
ExecutorService pool = Executors.newFixedThreadPool(6);
ArrayList<Callable<Boolean>> tasks = new ArrayList<Callable<Boolean>>();
final DefaultLockRepository client = (id == null) ?
new DefaultLockRepository(this.dataSource) :
new DefaultLockRepository(this.dataSource, id);
client.afterPropertiesSet();
this.context.getAutowireCapableBeanFactory().autowireBean(client);
ExecutorService pool = Executors.newFixedThreadPool(20);
ArrayList<Callable<Boolean>> tasks = new ArrayList<>();
for (int j = 0; j < 20; j++) {
Callable<Boolean> task = () -> {
DefaultLockRepository client = new DefaultLockRepository(this.dataSource);
client.afterPropertiesSet();
Lock lock = new JdbcLockRegistry(client).obtain("foo");
try {
if (locked.isEmpty() && lock.tryLock()) {
if (locked.isEmpty() && lock.tryLock(Long.MAX_VALUE, TimeUnit.MILLISECONDS)) {
if (locked.isEmpty()) {
locked.add("done");
return true;