Skip to content
Snippets Groups Projects

f-fix-deadlock -> dev

Merged Timm Fitschen requested to merge f-issue-122 into dev
All threads resolved!
Files
2
@@ -22,10 +22,91 @@
*/
package org.caosdb.server.database;
import static org.junit.Assert.assertFalse;
import java.util.LinkedList;
import java.util.List;
import org.junit.Assert;
import org.junit.Test;
public class DatabaseAccessManagerTest {
Thread createReadThread(long wait, String name, ReadAccessSemaphore readAccess) {
return new Thread(
new Runnable() {
@Override
public void run() {
try {
readAccess.acquire();
Thread.sleep(wait);
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
readAccess.release();
}
}
},
name);
}
Thread createWriteThread(long wait, String name, WriteAccessLock writeAccess) {
return new Thread(
new Runnable() {
@Override
public void run() {
try {
writeAccess.reserve();
Thread.sleep(wait);
writeAccess.lockInterruptibly();
Thread.sleep(wait);
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
writeAccess.release();
}
}
},
name);
}
@Test
public void testDeadLock() throws InterruptedException {
final ReadAccessSemaphore readAccess = new ReadAccessSemaphore();
final WriteAccessLock writeAccess = new WriteAccessLock(readAccess);
List<Thread> ts = new LinkedList<>();
for (int i = 0; i < 1000; i++) {
Thread t1 = createReadThread(1, "Ra" + i, readAccess);
Thread t2 = createReadThread(2, "Rb" + i, readAccess);
Thread t3 = createReadThread(3, "Rc" + i, readAccess);
Thread t5 = createReadThread(5, "Rd" + i, readAccess);
Thread t7 = createReadThread(7, "Re" + i, readAccess);
Thread t11 = createReadThread(11, "Rf" + i, readAccess);
Thread w5 = createWriteThread(2, "W" + i, writeAccess);
t1.start();
t2.start();
w5.start();
t3.start();
t5.start();
t7.start();
t11.start();
ts.add(t1);
ts.add(t2);
ts.add(t3);
ts.add(t5);
ts.add(t7);
ts.add(t11);
ts.add(w5);
}
for (Thread t : ts) {
t.join(10000);
assertFalse(t.isAlive());
}
}
public static final ReadAccessSemaphore readAccess = new ReadAccessSemaphore();
public static final WriteAccessLock writeAccess = new WriteAccessLock(readAccess);
Loading