/* * Copyright 2012 LinkedIn, Inc * * Licensed under the Apache License, Version 2.0 (the "License"); you may not * use this file except in compliance with the License. You may obtain a copy of * the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the * License for the specific language governing permissions and limitations under * the License. */ package voldemort.utils.pool; import static org.junit.Assert.assertTrue; import static org.junit.Assert.fail; import java.util.ArrayList; import java.util.List; import java.util.concurrent.Callable; import java.util.concurrent.CountDownLatch; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.Future; import java.util.concurrent.TimeUnit; import org.junit.Before; import org.junit.Test; public class KeyedResourcePoolRaceTest extends KeyedResourcePoolTestBase { protected static final int POOL_SIZE = 100; protected static final long TIMEOUT_MS = 500; protected static final long NUM_TESTS = 250; @Before public void setUp() { factory = new TestResourceFactory(); config = new ResourcePoolConfig().setMaxPoolSize(POOL_SIZE) .setTimeout(TIMEOUT_MS, TimeUnit.MILLISECONDS); this.pool = new KeyedResourcePool<String, TestResource>(factory, config); } // See http://code.google.com/p/project-voldemort/issues/detail?id=276 @Test public void testAttemptGrow() { ExecutorService service = Executors.newFixedThreadPool(POOL_SIZE); for(int i = 0; i < NUM_TESTS; i++) { final CountDownLatch checkouts = new CountDownLatch(POOL_SIZE); List<Callable<Boolean>> tasks = new ArrayList<Callable<Boolean>>(POOL_SIZE); for(int t = 0; t < POOL_SIZE; t++) { tasks.add(new Callable<Boolean>() { @Override public Boolean call() throws Exception { try { TestResource resource = pool.checkout("a"); checkouts.countDown(); checkouts.await(); resource.invalidate(); pool.checkin("a", resource); return true; } catch(Exception e) { checkouts.countDown(); throw e; } } }); } try { List<Future<Boolean>> futures = service.invokeAll(tasks); for(Future<Boolean> future: futures) { assertTrue(future.get()); } } catch(Exception e) { fail("Unexpected exception - " + e.getMessage()); } } } }