package com.orientechnologies.orient.test.database.auto; import com.orientechnologies.orient.core.config.OGlobalConfiguration; import com.orientechnologies.orient.core.db.document.ODatabaseDocumentPool; import com.orientechnologies.orient.core.db.document.ODatabaseDocumentTx; import org.testng.Assert; import org.testng.annotations.Optional; import org.testng.annotations.Parameters; import org.testng.annotations.Test; import java.util.ArrayList; import java.util.List; import java.util.Random; import java.util.concurrent.*; /** * @author Andrey Lomakin (a.lomakin-at-orientechnologies.com) * @since 3/31/14 */ @Test public class PoolTest extends DocumentDBBaseTest { private int counter = 0; private final Object lock = new Object(); private final CountDownLatch latch = new CountDownLatch(1); @Parameters(value = "url") public PoolTest(@Optional String url) { super(url); } public void testPoolSize() throws Exception { ExecutorService executorService = Executors.newCachedThreadPool(); final int maxSize = OGlobalConfiguration.DB_POOL_MAX.getValueAsInteger(); final Random random = new Random(); final List<Future<Void>> futures = new ArrayList<Future<Void>>(); for (int i = 0; i < maxSize / 2; i++) futures.add(executorService.submit(new Acquirer(maxSize, random))); latch.countDown(); for (Future<Void> future : futures) future.get(); } private final class Acquirer implements Callable<Void> { private final int maxSize; private final Random random; private Acquirer(int maxSize, Random random) { this.maxSize = maxSize; this.random = random; } @Override public Void call() throws Exception { final int delay = random.nextInt(500) + 200; ODatabaseDocumentTx databaseDocumentTx; synchronized (lock) { databaseDocumentTx = ODatabaseDocumentPool.global().acquire(url, "admin", "admin"); counter++; } try { latch.await(); Thread.sleep(delay); Assert.assertEquals(ODatabaseDocumentPool.global().getMaxSize(), maxSize); synchronized (lock) { Assert.assertEquals(ODatabaseDocumentPool.global().getAvailableConnections(url, "admin"), maxSize - counter); } } finally { synchronized (lock) { databaseDocumentTx.close(); counter--; } } return null; } } }