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

Reply via email to