Author: fhanik Date: Tue Oct 28 21:34:29 2008 New Revision: 708769 URL: http://svn.apache.org/viewvc?rev=708769&view=rev Log: Added in a fairness test to showcase the FairBlockingQueue
Added: tomcat/trunk/modules/jdbc-pool/test/org/apache/tomcat/jdbc/test/FairnessTest.java Modified: tomcat/trunk/modules/jdbc-pool/java/org/apache/tomcat/jdbc/pool/FairBlockingQueue.java tomcat/trunk/modules/jdbc-pool/test/org/apache/tomcat/jdbc/test/TestGCClose.java Modified: tomcat/trunk/modules/jdbc-pool/java/org/apache/tomcat/jdbc/pool/FairBlockingQueue.java URL: http://svn.apache.org/viewvc/tomcat/trunk/modules/jdbc-pool/java/org/apache/tomcat/jdbc/pool/FairBlockingQueue.java?rev=708769&r1=708768&r2=708769&view=diff ============================================================================== --- tomcat/trunk/modules/jdbc-pool/java/org/apache/tomcat/jdbc/pool/FairBlockingQueue.java (original) +++ tomcat/trunk/modules/jdbc-pool/java/org/apache/tomcat/jdbc/pool/FairBlockingQueue.java Tue Oct 28 21:34:29 2008 @@ -33,7 +33,7 @@ */ public class FairBlockingQueue<E> implements BlockingQueue<E> { - ReentrantLock lock = new ReentrantLock(); + ReentrantLock lock = new ReentrantLock(false); LinkedList<E> items = null; Added: tomcat/trunk/modules/jdbc-pool/test/org/apache/tomcat/jdbc/test/FairnessTest.java URL: http://svn.apache.org/viewvc/tomcat/trunk/modules/jdbc-pool/test/org/apache/tomcat/jdbc/test/FairnessTest.java?rev=708769&view=auto ============================================================================== --- tomcat/trunk/modules/jdbc-pool/test/org/apache/tomcat/jdbc/test/FairnessTest.java (added) +++ tomcat/trunk/modules/jdbc-pool/test/org/apache/tomcat/jdbc/test/FairnessTest.java Tue Oct 28 21:34:29 2008 @@ -0,0 +1,192 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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 org.apache.tomcat.jdbc.test; + +import java.util.concurrent.CountDownLatch; +import java.util.concurrent.TimeUnit; +import java.util.concurrent.atomic.AtomicInteger; +import java.sql.Connection; +import java.sql.Statement; +import java.sql.ResultSet; + +import javax.sql.DataSource; + +import org.apache.tomcat.jdbc.pool.DataSourceFactory; + +/** + * @author Filip Hanik + * @version 1.0 + */ +public class FairnessTest extends DefaultTestCase { + public FairnessTest(String name) { + super(name); + } + + protected boolean run = true; + protected long sleep = 10; + protected long complete = 20000; + CountDownLatch latch = null; + protected void printThreadResults(TestThread[] threads, String name) { + long minfetch = Long.MAX_VALUE, maxfetch = Long.MIN_VALUE, totalfetch = 0; + float avgfetch = 0; + for (int i=0; i<threads.length; i++) { + TestThread t = threads[i]; + totalfetch += t.nroffetch; + minfetch = Math.min(minfetch, t.nroffetch); + maxfetch = Math.max(maxfetch, t.nroffetch); + //System.out.println(t.getName()+" : Nr-of-fetch:"+t.nroffetch+ " Max fetch Time:"+t.max+" :Max close time:"+t.cmax); + } + System.out.println("["+name+"] Max fetch:"+maxfetch+" Min fetch:"+minfetch+" Average fetch:"+ + (((float)totalfetch))/(float)threads.length); + } + + public void testDBCPThreads20Connections10() throws Exception { + init(); + this.datasource.getPoolProperties().setMaxActive(10); + this.threadcount = 20; + this.transferProperties(); + this.tDatasource.getConnection().close(); + latch = new CountDownLatch(threadcount); + long start = System.currentTimeMillis(); + TestThread[] threads = new TestThread[threadcount]; + for (int i=0; i<threadcount; i++) { + threads[i] = new TestThread(); + threads[i].setName("tomcat-dbcp-"+i); + threads[i].d = this.tDatasource; + + } + for (int i=0; i<threadcount; i++) { + threads[i].start(); + } + latch.await(complete,TimeUnit.MILLISECONDS); + this.run = false; + long delta = System.currentTimeMillis() - start; + printThreadResults(threads,"testDBCPThreads20Connections10"); + tearDown(); + } + + public void testPoolThreads20Connections10() throws Exception { + init(); + this.datasource.getPoolProperties().setMaxActive(10); + this.threadcount = 20; + this.transferProperties(); + this.datasource.getConnection().close(); + latch = new CountDownLatch(threadcount); + long start = System.currentTimeMillis(); + TestThread[] threads = new TestThread[threadcount]; + for (int i=0; i<threadcount; i++) { + threads[i] = new TestThread(); + threads[i].setName("tomcat-pool-"+i); + threads[i].d = DataSourceFactory.getDataSource(this.datasource); + + } + for (int i=0; i<threadcount; i++) { + threads[i].start(); + } + latch.await(complete,TimeUnit.MILLISECONDS); + this.run = false; + long delta = System.currentTimeMillis() - start; + printThreadResults(threads,"testPoolThreads20Connections10"); + tearDown(); + + } + + public void testPoolThreads20Connections10Fair() throws Exception { + init(); + this.datasource.getPoolProperties().setMaxActive(10); + this.datasource.getPoolProperties().setFairQueue(true); + this.threadcount = 20; + this.transferProperties(); + this.datasource.getConnection().close(); + latch = new CountDownLatch(threadcount); + long start = System.currentTimeMillis(); + TestThread[] threads = new TestThread[threadcount]; + for (int i=0; i<threadcount; i++) { + threads[i] = new TestThread(); + threads[i].setName("tomcat-pool-"+i); + threads[i].d = DataSourceFactory.getDataSource(this.datasource); + + } + for (int i=0; i<threadcount; i++) { + threads[i].start(); + } + latch.await(complete,TimeUnit.MILLISECONDS); + this.run = false; + long delta = System.currentTimeMillis() - start; + printThreadResults(threads,"testPoolThreads20Connections10Fair"); + tearDown(); + } + + + public class TestThread extends Thread { + protected DataSource d; + protected String query = null; + protected long sleep = 10; + long max = -1, totalmax=0, totalcmax=0, cmax = -1, nroffetch = 0, totalruntime = 0; + public void run() { + try { + while (FairnessTest.this.run) { + long start = System.nanoTime(); + Connection con = null; + try { + con = d.getConnection(); + long delta = System.nanoTime() - start; + totalmax += delta; + max = Math.max(delta, max); + nroffetch++; + if (query!=null) { + Statement st = con.createStatement(); + ResultSet rs = st.executeQuery(query); + while (rs.next()) { + } + rs.close(); + st.close(); + } + try { + this.sleep(FairnessTest.this.sleep); + } catch (InterruptedException x) { + this.interrupted(); + } + } finally { + long cstart = System.nanoTime(); + if (con!=null) try {con.close();}catch(Exception x) {x.printStackTrace();} + long cdelta = System.nanoTime() - cstart; + totalcmax += cdelta; + cmax = Math.max(cdelta, cmax); + } + totalruntime+=(System.nanoTime()-start); + } + + } catch (Exception x) { + x.printStackTrace(); + } finally { + FairnessTest.this.latch.countDown(); + } + if (System.getProperty("print-thread-stats")!=null) { + System.out.println("["+getName()+"] "+ + "\n\tMax time to retrieve connection:"+(((float)max)/1000f/1000f)+" ms."+ + "\n\tTotal time to retrieve connection:"+(((float)totalmax)/1000f/1000f)+" ms."+ + "\n\tAverage time to retrieve connection:"+(((float)totalmax)/1000f/1000f)/(float)nroffetch+" ms."+ + "\n\tMax time to close connection:"+(((float)cmax)/1000f/1000f)+" ms."+ + "\n\tTotal time to close connection:"+(((float)totalcmax)/1000f/1000f)+" ms."+ + "\n\tAverage time to close connection:"+(((float)totalcmax)/1000f/1000f)/(float)nroffetch+" ms."+ + "\n\tRun time:"+(((float)totalruntime)/1000f/1000f)+" ms."+ + "\n\tNr of fetch:"+nroffetch); + } + } + } +} Modified: tomcat/trunk/modules/jdbc-pool/test/org/apache/tomcat/jdbc/test/TestGCClose.java URL: http://svn.apache.org/viewvc/tomcat/trunk/modules/jdbc-pool/test/org/apache/tomcat/jdbc/test/TestGCClose.java?rev=708769&r1=708768&r2=708769&view=diff ============================================================================== --- tomcat/trunk/modules/jdbc-pool/test/org/apache/tomcat/jdbc/test/TestGCClose.java (original) +++ tomcat/trunk/modules/jdbc-pool/test/org/apache/tomcat/jdbc/test/TestGCClose.java Tue Oct 28 21:34:29 2008 @@ -32,4 +32,12 @@ tearDown(); Thread.sleep(20000); } + + public void testClose() throws Exception { + init(); + datasource.getConnection(); + System.out.println("Got a connection, but didn't return it"); + datasource.close(true); + Thread.sleep(20000); + } } --------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]