On 24/07/2009, fha...@apache.org <fha...@apache.org> wrote: > Author: fhanik > Date: Fri Jul 24 15:24:52 2009 > New Revision: 797528 > > URL: http://svn.apache.org/viewvc?rev=797528&view=rev > Log: > Add in Linux special case for performance optimization around locking. > Set default queue to be the fair one > Remove unused code > > > Modified: > tomcat/trunk/modules/jdbc-pool/doc/jdbc-pool.xml > > tomcat/trunk/modules/jdbc-pool/java/org/apache/tomcat/jdbc/pool/ConnectionPool.java > > tomcat/trunk/modules/jdbc-pool/java/org/apache/tomcat/jdbc/pool/DataSourceProxy.java > > tomcat/trunk/modules/jdbc-pool/java/org/apache/tomcat/jdbc/pool/FairBlockingQueue.java > > tomcat/trunk/modules/jdbc-pool/java/org/apache/tomcat/jdbc/pool/PoolConfiguration.java > > tomcat/trunk/modules/jdbc-pool/java/org/apache/tomcat/jdbc/pool/PoolProperties.java > > Modified: tomcat/trunk/modules/jdbc-pool/doc/jdbc-pool.xml > URL: > http://svn.apache.org/viewvc/tomcat/trunk/modules/jdbc-pool/doc/jdbc-pool.xml?rev=797528&r1=797527&r2=797528&view=diff > > ============================================================================== > --- tomcat/trunk/modules/jdbc-pool/doc/jdbc-pool.xml (original) > +++ tomcat/trunk/modules/jdbc-pool/doc/jdbc-pool.xml Fri Jul 24 15:24:52 2009 > @@ -353,10 +353,16 @@ > <attribute name="fairQueue" required="false"> > <p>(boolean) Set to true if you wish that calls to getConnection > should be treated > fairly in a true FIFO fashion. This uses the > <code>org.apache.tomcat.jdbc.pool.FairBlockingQueue</code> > - implementation for the list of the idle connections. The default > value is <code>false</code>. > + implementation for the list of the idle connections. The default > value is <code>true</code>. > This flag is required when you want to use asynchronous connection > retrieval.<br/> > - During performance tests, the fairQueue does very well on a multi > core Solaris system, > - but performs terribly on a Linux Fedora 11 system. On Linux we > recommend setting this to false. > + Setting this flag ensures that threads receive connections in the > order they arrive.<br/> > + During performance tests, there is a very large difference in how > locks > + and lock waiting is implemented. When <code>fairQueue=true></code> > + there is a decision making process based on what operating system > the system is running. > + If the system is running on Linux (property > <code>os.name=Linux</code>. > + To disable this Linux specific behavior and still use the fair > queue, simply add the property > + > <code>org.apache.tomcat.jdbc.pool.FairBlockingQueue.ignoreOS=true</code> to > your system properties > + before the connection pool classes are loaded. > </p> > </attribute> > > > Modified: > tomcat/trunk/modules/jdbc-pool/java/org/apache/tomcat/jdbc/pool/ConnectionPool.java > URL: > http://svn.apache.org/viewvc/tomcat/trunk/modules/jdbc-pool/java/org/apache/tomcat/jdbc/pool/ConnectionPool.java?rev=797528&r1=797527&r2=797528&view=diff > > ============================================================================== > --- > tomcat/trunk/modules/jdbc-pool/java/org/apache/tomcat/jdbc/pool/ConnectionPool.java > (original) > +++ > tomcat/trunk/modules/jdbc-pool/java/org/apache/tomcat/jdbc/pool/ConnectionPool.java > Fri Jul 24 15:24:52 2009 > @@ -148,6 +148,9 @@ > if (idle instanceof FairBlockingQueue) { > Future<PooledConnection> pcf = > ((FairBlockingQueue<PooledConnection>)idle).pollAsync(); > return new ConnectionFuture(pcf); > + } else if (idle instanceof MultiLockFairBlockingQueue) { > + Future<PooledConnection> pcf = > ((MultiLockFairBlockingQueue<PooledConnection>)idle).pollAsync(); > + return new ConnectionFuture(pcf); > } else { > throw new SQLException("Connection pool is misconfigured, > doesn't support async retrieval. Set the 'fair' property to 'true'"); > } > @@ -306,21 +309,6 @@ > } > > /** > - * If the connection pool gets garbage collected, lets make sure we > clean up > - * and close all the connections. > - * {...@inheritdoc} > - */ > - @Override > - protected void finalize() throws Throwable { > -// Runnable closer = new Runnable() { > -// public void run() { > -// close(true); > -// } > -// }; > -// this.cancellator.execute(closer); > - } > - > - /** > * Closes the pool and all disconnects all idle connections > * Active connections will be closed upon the {...@link > java.sql.Connection#close close} method is called > * on the underlying connection instead of being returned to the pool > @@ -381,6 +369,7 @@ > //make space for 10 extra in case we flow over a bit > if (properties.isFairQueue()) { > idle = new FairBlockingQueue<PooledConnection>(); > + //idle = new MultiLockFairBlockingQueue<PooledConnection>(); > } else { > idle = new > ArrayBlockingQueue<PooledConnection>(properties.getMaxActive(),properties.isFairQueue()); > } > > Modified: > tomcat/trunk/modules/jdbc-pool/java/org/apache/tomcat/jdbc/pool/DataSourceProxy.java > URL: > http://svn.apache.org/viewvc/tomcat/trunk/modules/jdbc-pool/java/org/apache/tomcat/jdbc/pool/DataSourceProxy.java?rev=797528&r1=797527&r2=797528&view=diff > > ============================================================================== > --- > tomcat/trunk/modules/jdbc-pool/java/org/apache/tomcat/jdbc/pool/DataSourceProxy.java > (original) > +++ > tomcat/trunk/modules/jdbc-pool/java/org/apache/tomcat/jdbc/pool/DataSourceProxy.java > Fri Jul 24 15:24:52 2009 > @@ -155,17 +155,6 @@ > } > } > > - protected void finalize() throws Throwable { > -// //terminate the pool? > -// ThreadPoolExecutor closer = new > ThreadPoolExecutor(0,1,1000,TimeUnit.MILLISECONDS,new > LinkedBlockingQueue<Runnable>()); > -// final Runnable r = new Runnable() { > -// public void run(){ > -// close(true); > -// } > -// }; > -// closer.execute(r); > - } > - > public int getPoolSize() throws SQLException{ > final ConnectionPool p = pool; > if (p == null) return 0; > > 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=797528&r1=797527&r2=797528&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 > Fri Jul 24 15:24:52 2009 > @@ -43,6 +43,20 @@ > public class FairBlockingQueue<E> implements BlockingQueue<E> { > > /** > + * This little sucker is used to reorder the way to do > + * {...@link java.util.concurrent.locks.Lock#lock()}, > + * {...@link java.util.concurrent.locks.Lock#unlock()} > + * and > + * {...@link java.util.concurrent.CountDownLatch#countDown()} > + * during the {...@link #poll(long, TimeUnit)} operation. > + * On Linux, it performs much better if we count down while we hold the > global > + * lock, on Solaris its the other way around. > + * Until we have tested other platforms we only check for Linux. > + */ > + final static boolean isLinux = > "Linux".equals(System.getProperty("os.name")) && > + > (!Boolean.getBoolean(FairBlockingQueue.class.getName()+".ignoreOS")); > + > + /** > * Phase one entry lock in order to give out > * per-thread-locks for the waiting phase we have > * a phase one lock during the contention period. > @@ -86,6 +100,7 @@ > c = waiters.poll(); > //give the object to the thread instead of adding it to the > pool > c.setItem(e); > + if (isLinux && c!=null) c.countDown();
c cannot be null here, else c.setItem(e) would have failed. > } else { > //we always add first, so that the most recently used object > will be given out > items.addFirst(e); > @@ -94,7 +109,7 @@ > lock.unlock(); > } > //if we exchanged an object with another thread, wake it up. > - if (c!=null) c.countDown(); > + if (!isLinux && c!=null) c.countDown(); > //we have an unbounded queue, so always return true > return true; > } > @@ -261,6 +276,7 @@ > * {...@inheritdoc} > * @throws UnsupportedOperation - this operation is not supported > */ > + > public int drainTo(Collection<? super E> c) { > return drainTo(c,Integer.MAX_VALUE); > } > > Modified: > tomcat/trunk/modules/jdbc-pool/java/org/apache/tomcat/jdbc/pool/PoolConfiguration.java > URL: > http://svn.apache.org/viewvc/tomcat/trunk/modules/jdbc-pool/java/org/apache/tomcat/jdbc/pool/PoolConfiguration.java?rev=797528&r1=797527&r2=797528&view=diff > > ============================================================================== > --- > tomcat/trunk/modules/jdbc-pool/java/org/apache/tomcat/jdbc/pool/PoolConfiguration.java > (original) > +++ > tomcat/trunk/modules/jdbc-pool/java/org/apache/tomcat/jdbc/pool/PoolConfiguration.java > Fri Jul 24 15:24:52 2009 > @@ -65,7 +65,7 @@ > * Set to true if you wish that calls to getConnection > * should be treated fairly in a true FIFO fashion. > * This uses the {...@link FairBlockingQueue} implementation for the > list of the idle connections. > - * The default value is false. > + * The default value is true. > * This flag is required when you want to use asynchronous connection > retrieval. > * @param fairQueue > */ > > Modified: > tomcat/trunk/modules/jdbc-pool/java/org/apache/tomcat/jdbc/pool/PoolProperties.java > URL: > http://svn.apache.org/viewvc/tomcat/trunk/modules/jdbc-pool/java/org/apache/tomcat/jdbc/pool/PoolProperties.java?rev=797528&r1=797527&r2=797528&view=diff > > ============================================================================== > --- > tomcat/trunk/modules/jdbc-pool/java/org/apache/tomcat/jdbc/pool/PoolProperties.java > (original) > +++ > tomcat/trunk/modules/jdbc-pool/java/org/apache/tomcat/jdbc/pool/PoolProperties.java > Fri Jul 24 15:24:52 2009 > @@ -68,7 +68,7 @@ > protected String initSQL; > protected boolean testOnConnect =false; > protected String jdbcInterceptors=null; > - protected boolean fairQueue = false; > + protected boolean fairQueue = true; > protected boolean useEquals = false; > protected int abandonWhenPercentageFull = 0; > protected long maxAge = 0; > > > > --------------------------------------------------------------------- > To unsubscribe, e-mail: dev-unsubscr...@tomcat.apache.org > For additional commands, e-mail: dev-h...@tomcat.apache.org > > --------------------------------------------------------------------- To unsubscribe, e-mail: dev-unsubscr...@tomcat.apache.org For additional commands, e-mail: dev-h...@tomcat.apache.org