commons-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From pste...@apache.org
Subject svn commit: r558593 - in /jakarta/commons/sandbox/performance/trunk: ./ src/java/org/apache/commons/performance/pool/
Date Mon, 23 Jul 2007 03:21:38 GMT
Author: psteitz
Date: Sun Jul 22 20:21:37 2007
New Revision: 558593

URL: http://svn.apache.org/viewvc?view=rev&rev=558593
Log:
Initial commit - pool + README

Added:
    jakarta/commons/sandbox/performance/trunk/README.txt
    jakarta/commons/sandbox/performance/trunk/build-pool.xml
    jakarta/commons/sandbox/performance/trunk/config-pool.xml
    jakarta/commons/sandbox/performance/trunk/src/java/org/apache/commons/performance/pool/
    jakarta/commons/sandbox/performance/trunk/src/java/org/apache/commons/performance/pool/PoolClientThread.java
    jakarta/commons/sandbox/performance/trunk/src/java/org/apache/commons/performance/pool/PoolSoak.java
    jakarta/commons/sandbox/performance/trunk/src/java/org/apache/commons/performance/pool/PoolTest.java
    jakarta/commons/sandbox/performance/trunk/src/java/org/apache/commons/performance/pool/Waiter.java
    jakarta/commons/sandbox/performance/trunk/src/java/org/apache/commons/performance/pool/WaiterFactory.java

Added: jakarta/commons/sandbox/performance/trunk/README.txt
URL: http://svn.apache.org/viewvc/jakarta/commons/sandbox/performance/trunk/README.txt?view=auto&rev=558593
==============================================================================
--- jakarta/commons/sandbox/performance/trunk/README.txt (added)
+++ jakarta/commons/sandbox/performance/trunk/README.txt Sun Jul 22 20:21:37 2007
@@ -0,0 +1,54 @@
+=== Compiling and running ===
+
+To run the dbcp tests, edit configuration in config-dbcp.xml, make sure the
+configured database is running and accepting connections, and run
+ant -f build-dbcp.xml.  The first time you run against a configured database,
+a table with 10000 rows will be created and populated with random data.
+You also need to specify the path to the jdbc driver jar in build.properties. 
+Edit logging.properties to provide a real path for the log file or otherwise
+clean up the filespec there.
+
+To run the pool tests, use config-pool.xml and ant -f build-pool.xml and 
+again edit logging.properties to direct the log file. 
+
+=== Parameters ===
+
+In addition to pool / dbcp parameters, the client request frequency and other
+parameters can be set.  These are (poorly) documented in the config files or
+in javadoc for the ClientThread or other classes.  The min-delay and max-delay
+determine how frequently client threads will submit requests.  In the simplest
+case, if delay-type is constant, the client will try to submit a request every
+min-delay milliseconds. Ramping and oscillating loads are also supported. See
+the javadoc for ClientThread.nextDelay for details. 
+
+=== Statistics ===
+
+Runs consist of client threads submitting requests in a loop, with configurable
+delays in between.  Statistics on latency of the core request operation are
+gathered by thread and overall.  The "number of misses" reported per thread
+is the number of times that the request operation itself took longer than the 
+presribed interarrival time for the thread (e.g. the thread is supposed to send
+one request each 100ms, but it has to wait 150ms for a response). If the number
+of misses is a significant percentage of the number of iterations, you should
+consider increasing the number of service nodes (pool maxActive) or decreasing
+the delay-min / delay-max.
+
+=== TODO ===
+
+* Property representation and management is poor. Configuration objects should
+  be defined and Digester should create and populate configuration beans.
+
+* There is still a fair amount of duplicated / similar code between pool and
+  dbcp. This should all be factored out and moved to the performance package.
+
+* Ant build is lame.  To change pool impls used - e.g. to grab latest snap -
+  you need to hack the get-deps. This should be cleaned up.
+
+* More pool types need to be supported.
+
+* WaiterFactory should support stochastic latencies for lifecycle methods
+  similar to ClientThread.nextDelay. Probably nextDelay belongs in a separate
+  latency generation class. 
+
+* TESTS!!! There are no Junit tests. wtf?
+

Added: jakarta/commons/sandbox/performance/trunk/build-pool.xml
URL: http://svn.apache.org/viewvc/jakarta/commons/sandbox/performance/trunk/build-pool.xml?view=auto&rev=558593
==============================================================================
--- jakarta/commons/sandbox/performance/trunk/build-pool.xml (added)
+++ jakarta/commons/sandbox/performance/trunk/build-pool.xml Sun Jul 22 20:21:37 2007
@@ -0,0 +1,116 @@
+<!--
+/*
+ * 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.
+ */
+ -->
+
+<project name="DBCPTest" default="run" basedir=".">
+     
+  <property name="src" location="src"/>
+  <property name="build" location="build"/>
+  <property name="lib" location="lib"/>
+	
+  <property name="component-propfile" value="${basedir}/build.properties"/>
+  <property file="${component-propfile}"/>
+
+  <path id="compile.classpath">
+    <fileset dir="${lib}">
+      <include name="*.jar"/>
+    </fileset>
+  </path>
+	
+  <path id="run.classpath">
+    <pathelement path="${build}"/>
+    <pathelement path="${java.class.path}"/>
+    <path refid="compile.classpath" /> 
+  </path>
+
+  <target name="init">
+    <mkdir dir="${build}"/>
+    <mkdir dir="${lib}"/>
+  </target>
+
+  <target name="get-collections">
+    <get
+    src="${mavenRepo}/commons-collections/commons-collections/3.1/commons-collections-3.1.jar"
+    dest="${lib}/commons-collections-3.1.jar"
+    usetimestamp="true"/>
+  </target>
+  
+  <target name="get-beanutils">
+    <get
+    src="${mavenRepo}/commons-beanutils/commons-beanutils/1.6.1/commons-beanutils-1.6.1.jar"
+    dest="${lib}/commons-beanutils-1.6.1.jar"
+    usetimestamp="true"/>
+  </target>
+
+  <target name="get-digester">
+    <get
+    src="${mavenRepo}/commons-digester/commons-digester/1.4.1/commons-digester-1.4.1.jar"
+    dest="${lib}/commons-digester-1.4.1.jar"
+    usetimestamp="true"/>
+  </target>
+
+  <target name="get-math">
+    <get
+    src="${mavenRepo}/commons-math/commons-math/1.1/commons-math-1.1.jar"
+    dest="${lib}/commons-math-1.1.jar"
+    usetimestamp="true"/>
+  </target>
+
+  <target name="get-pool">
+    <get
+    src="${mavenRepo}/commons-pool/commons-pool/1.3/commons-pool-1.3.jar"
+    dest="${lib}/commons-pool-1.3.jar"
+    usetimestamp="true"/>
+  </target>
+
+  <target name="get-logging">
+    <get
+    src="${mavenRepo}/commons-logging/commons-logging/1.0.4/commons-logging-1.0.4.jar"
+    dest="${lib}/commons-logging-1.0.4.jar"
+    usetimestamp="true"/>
+  </target>
+ 
+  <target name="get-deps"
+      depends="get-collections,get-beanutils,get-digester,get-math,get-logging,get-pool">
+  </target>
+
+  <target name="compile" depends="clean,init,get-deps">
+    <javac srcdir="${src}/java" 
+    	   destdir="${build}">
+      <classpath refid="compile.classpath"/>
+      <compilerarg value="-Xlint:unchecked" />
+    </javac>
+    <copy file="${basedir}/config-pool.xml" tofile="${build}/config-pool.xml"/>
+    <copy file="${basedir}/logging.properties" tofile="${build}/logging.properties"/>
+  </target>
+
+  <target name="run" depends="compile">
+    <java classname="org.apache.commons.performance.pool.PoolTest" fork="true">
+      <classpath refid="run.classpath"/>
+      <jvmarg 
+      value="-Dorg.apache.commons.logging.Log=org.apache.commons.logging.impl.Jdk14Logger"/>
+      <jvmarg value="-Djava.util.logging.config.file=logging.properties"/>
+    </java>
+  </target>
+  	
+  <target name="clean">
+    <delete dir="${build}"/>
+  </target>
+</project>

Added: jakarta/commons/sandbox/performance/trunk/config-pool.xml
URL: http://svn.apache.org/viewvc/jakarta/commons/sandbox/performance/trunk/config-pool.xml?view=auto&rev=558593
==============================================================================
--- jakarta/commons/sandbox/performance/trunk/config-pool.xml (added)
+++ jakarta/commons/sandbox/performance/trunk/config-pool.xml Sun Jul 22 20:21:37 2007
@@ -0,0 +1,74 @@
+<!--
+/*
+ * 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.
+ */
+ -->
+
+<configuration>
+  
+  <factory>
+    <activate-latency>0</activate-latency>
+    <destroy-latency>0</destroy-latency>
+    <make-latency>100</make-latency>
+    <passivate-latency>0</passivate-latency>
+    <validate-latency>100</validate-latency>
+    <waiter-latency>0</waiter-latency>
+  </factory>
+  
+  <pool>
+    <!-- GenericObjectPool or AbandonedObjectPool -->
+    <type>GenericObjectPool</type>
+    <max-active>15</max-active>
+    <max-idle>15</max-idle>
+    <min-idle>0</min-idle>
+    <max-wait>-1</max-wait>
+    <!-- block, fail, or grow -->
+    <exhausted-action>block</exhausted-action>
+    <test-on-borrow>false</test-on-borrow>
+    <test-on-return>false</test-on-return>
+    <time-between-evictions>-1</time-between-evictions>
+    <tests-per-eviction>3</tests-per-eviction>
+    <idle-timeout>-1</idle-timeout>
+    <test-while-idle>false</test-while-idle>
+  </pool>
+  
+  <!-- Ignored unless pool type is AbandonedObjectPool -->
+  <abandoned-config>
+    <log-abandoned>true</log-abandoned>
+    <remove-abandoned>true</remove-abandoned>
+    <abandoned-timeout>50000</abandoned-timeout>
+  </abandoned-config>
+  
+  <run>
+    <!-- integerIndexed, integerScan, or textScan -->
+    <query-type>integerIndexed</query-type>
+    <iterations>1000</iterations>
+    <clients>50</clients>
+    <delay-min>250</delay-min>
+    <delay-max>500</delay-max>
+    <delay-sigma>50</delay-sigma>
+    <!-- constant, gaussian, or poisson -->
+    <delay-type>gaussian</delay-type>
+    <!-- none, linear, random --> 
+    <ramp-type>random</ramp-type>
+    <period>20000</period>
+    <!-- none, oscillating (others?)-->
+    <cycle-type>oscillating</cycle-type>
+  </run>
+  
+</configuration>

Added: jakarta/commons/sandbox/performance/trunk/src/java/org/apache/commons/performance/pool/PoolClientThread.java
URL: http://svn.apache.org/viewvc/jakarta/commons/sandbox/performance/trunk/src/java/org/apache/commons/performance/pool/PoolClientThread.java?view=auto&rev=558593
==============================================================================
--- jakarta/commons/sandbox/performance/trunk/src/java/org/apache/commons/performance/pool/PoolClientThread.java
(added)
+++ jakarta/commons/sandbox/performance/trunk/src/java/org/apache/commons/performance/pool/PoolClientThread.java
Sun Jul 22 20:21:37 2007
@@ -0,0 +1,72 @@
+/*
+ * 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.commons.performance.pool;
+
+import java.util.List;
+import java.util.logging.Logger;
+
+import org.apache.commons.pool.ObjectPool;
+import org.apache.commons.math.stat.descriptive.SummaryStatistics;
+import org.apache.commons.performance.ClientThread;
+
+/**
+ * Client thread that borrows and returns objects from a pool in a loop.
+   See ClientThread javadoc for a description
+ * of how times between requests are computed.
+ *
+ */
+public class PoolClientThread extends ClientThread {
+    
+    private ObjectPool pool;
+     
+    /**
+     * Create a pool client thread.
+     * 
+     * @param iterations number of iterations
+     * @param minDelay minumum mean time between client requests
+     * @param maxDelay minumum mean time between client requests
+     * @param delayType distribution of time between client requests
+     * @param period period of cycle for cyclic load
+     * @param cycleType type of cycle for mean delay
+     * @param logger common logger shared by all clients
+     * @param statsList List of SummaryStatistics to add results to
+     */
+    public PoolClientThread(long iterations, long minDelay, long maxDelay,
+            double sigma, String delayType, long period,
+            String cycleType, String rampType, Logger logger, 
+            List <SummaryStatistics> statsList, ObjectPool pool) {
+        
+        super(iterations, minDelay, maxDelay, sigma, delayType, period, cycleType,
+                rampType, logger, statsList); 
+        this.pool = pool;
+    }
+    
+    /** put a few instances into the pool to start */
+    protected void init() throws Exception {
+        for (int i = 0; i < 10; i++) {
+            pool.addObject();
+        }
+    }
+    /** Borrow and return */
+    public void execute() throws Exception {
+       Waiter waiter = (Waiter) pool.borrowObject(); 
+       waiter.doWait();
+       pool.returnObject(waiter);
+    }
+
+}

Added: jakarta/commons/sandbox/performance/trunk/src/java/org/apache/commons/performance/pool/PoolSoak.java
URL: http://svn.apache.org/viewvc/jakarta/commons/sandbox/performance/trunk/src/java/org/apache/commons/performance/pool/PoolSoak.java?view=auto&rev=558593
==============================================================================
--- jakarta/commons/sandbox/performance/trunk/src/java/org/apache/commons/performance/pool/PoolSoak.java
(added)
+++ jakarta/commons/sandbox/performance/trunk/src/java/org/apache/commons/performance/pool/PoolSoak.java
Sun Jul 22 20:21:37 2007
@@ -0,0 +1,307 @@
+/*
+ * 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.commons.performance.pool;
+
+import org.apache.commons.performance.ConfigurationException;
+import java.sql.Connection;
+import java.sql.Driver;
+import java.sql.DriverManager;
+import java.sql.Statement;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Properties;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+import java.util.concurrent.TimeUnit;
+import java.util.logging.Logger;
+
+import javax.sql.DataSource;
+
+import org.apache.commons.dbcp.AbandonedConfig;
+import org.apache.commons.dbcp.AbandonedObjectPool;
+import org.apache.commons.dbcp.ConnectionFactory;
+import org.apache.commons.dbcp.DataSourceConnectionFactory;
+import org.apache.commons.dbcp.DriverConnectionFactory;
+import org.apache.commons.dbcp.DriverManagerConnectionFactory;
+import org.apache.commons.dbcp.PoolableConnectionFactory;
+import org.apache.commons.dbcp.PoolingDataSource;
+import org.apache.commons.digester.Digester;
+import org.apache.commons.pool.KeyedObjectPoolFactory;
+import org.apache.commons.pool.PoolableObjectFactory;
+import org.apache.commons.pool.impl.GenericKeyedObjectPool;
+import org.apache.commons.pool.impl.GenericKeyedObjectPoolFactory;
+import org.apache.commons.pool.impl.GenericObjectPool;
+import org.apache.commons.math.random.RandomData;
+import org.apache.commons.math.random.RandomDataImpl;
+import org.apache.commons.math.stat.descriptive.SummaryStatistics;
+import org.apache.commons.math.stat.descriptive.SummaryStatisticsImpl;
+ 
+/**
+ * Configurable load / performance tester for commons pool.
+ * Uses Commons Digester to parse and load configuration and spawns
+ * PoolClientThread instances to generate load and gather statistics.
+ *
+ */
+public class PoolSoak {
+    private static Logger logger = Logger.getLogger(PoolSoak.class.getName());
+    private static List <SummaryStatistics> statsList =
+        new ArrayList <SummaryStatistics>();
+        
+    // Pool properties
+    private String poolType;
+    private GenericObjectPool pool;
+    private long numClients;
+    private long iterations;
+    private int maxActive;
+    private int maxIdle;
+    private int minIdle;
+    private long maxWait;
+    private byte exhaustedAction;
+    private boolean testOnBorrow;
+    private boolean testOnReturn;
+    private long timeBetweenEvictions;
+    private int testsPerEviction;
+    private long idleTimeout;
+    private boolean testWhileIdle;
+    private AbandonedConfig abandonedConfig = new AbandonedConfig();
+    
+    // Client thread properties
+    private long minDelay;
+    private long maxDelay;
+    private double sigma;
+    private String delayType;
+    private String rampType;
+    private long period;
+    private String cycleType;
+    
+    // WaiterFactory properties
+    private long activateLatency;
+    private long destroyLatency;
+    private long makeLatency;
+    private long passivateLatency;
+    private long validateLatency;
+    private long waiterLatency;
+    
+    
+    public void execute() throws Exception {
+      
+        // Create object pool
+        if (poolType.equals("GenericObjectPool")) {
+            pool = new GenericObjectPool(
+                    null, maxActive, exhaustedAction,
+                    maxWait, maxIdle, minIdle, testOnBorrow, testOnReturn,
+                    timeBetweenEvictions, testsPerEviction, idleTimeout,
+                    testWhileIdle);
+        } else if (poolType.equals("AbandonedObjectPool")) {
+            pool = new AbandonedObjectPool(null,abandonedConfig);
+        } else {
+            throw new ConfigurationException(
+                    "invalid pool type configuration: " + poolType);
+        }
+        
+        // Create factory
+        pool.setFactory(new WaiterFactory(activateLatency, destroyLatency,
+                makeLatency, passivateLatency, validateLatency, waiterLatency)); 
+        
+        logger.info("Starting");
+        
+        // Spawn and execute client threads
+		ExecutorService ex = Executors.newFixedThreadPool((int)numClients);
+		for (int i = 0; i < numClients; i++) {
+			ex.execute(new PoolClientThread(iterations, minDelay, maxDelay,
+                    sigma, delayType, period, cycleType, rampType,
+                    logger, statsList, pool));
+		} 
+        ex.shutdown();
+        // hard time limit of one day for now 
+        // TODO: make this configurable
+        ex.awaitTermination(60 * 60 * 24, TimeUnit.SECONDS);
+        
+        // Compute summary statistics
+        SummaryStatistics meanSummary = new SummaryStatisticsImpl();
+        SummaryStatistics stdSummary = new SummaryStatisticsImpl();
+        SummaryStatistics minSummary = new SummaryStatisticsImpl();
+        SummaryStatistics maxSummary = new SummaryStatisticsImpl();
+        for (int i = 0; i < statsList.size(); i++) {
+            SummaryStatistics stats = (SummaryStatistics) statsList.get(i);
+            meanSummary.addValue(stats.getMean());
+            stdSummary.addValue(stats.getStandardDeviation());
+            minSummary.addValue(stats.getMin());
+            maxSummary.addValue(stats.getMax());
+        }
+        logger.info("Overall statistics for the mean");
+        logger.info(meanSummary.toString());
+        logger.info("Overall statistics for the standard deviation");
+        logger.info(stdSummary.toString());
+        logger.info("Overall statistics for the min");
+        logger.info(minSummary.toString());
+        logger.info("Overall statistics for the max");
+        logger.info(maxSummary.toString());
+	}
+    
+    public void configureFactory(String activateLatency, String destroyLatency,
+            String makeLatency, String passivateLatency, String validateLatency,
+            String waiterLatency) {
+       
+        this.activateLatency = Long.parseLong(activateLatency);
+        this.destroyLatency = Long.parseLong(destroyLatency);
+        this.makeLatency = Long.parseLong(makeLatency);
+        this.passivateLatency = Long.parseLong(passivateLatency);
+        this.validateLatency = Long.parseLong(validateLatency);
+        this.waiterLatency = Long.parseLong(waiterLatency);
+    }
+    
+    public void configurePool(String maxActive, String maxIdle, String minIdle,
+            String maxWait, String exhaustedAction, String testOnBorrow,
+            String testOnReturn, String timeBetweenEvictions,
+            String testsPerEviction, String idleTimeout, 
+            String testWhileIdle, String type) throws ConfigurationException { 
+        this.maxActive = Integer.parseInt(maxActive);
+        this.maxIdle = Integer.parseInt(maxIdle);
+        this.maxWait = Long.parseLong(maxWait);
+        this.testOnBorrow = Boolean.parseBoolean(testOnBorrow);
+        this.testOnReturn = Boolean.parseBoolean(testOnReturn);
+        this.timeBetweenEvictions = Long.parseLong(timeBetweenEvictions);
+        this.testsPerEviction = Integer.parseInt(testsPerEviction);
+        this.idleTimeout = Long.parseLong(idleTimeout);
+        this.testWhileIdle = Boolean.parseBoolean(testWhileIdle);
+        this.poolType = type;
+        if (exhaustedAction.equals("block")) {
+            this.exhaustedAction = GenericObjectPool.WHEN_EXHAUSTED_BLOCK;
+        } else if (exhaustedAction.equals("fail")) {
+            this.exhaustedAction = GenericObjectPool.WHEN_EXHAUSTED_FAIL;
+        } else if (exhaustedAction.equals("grow")) {
+            this.exhaustedAction = GenericObjectPool.WHEN_EXHAUSTED_GROW;
+        } else { 
+            throw new ConfigurationException(
+            "Bad configuration setting for exhausted action: "
+                    + exhaustedAction); 
+        }           
+    }
+    
+    public void configureAbandonedConfig(String logAbandoned,
+            String removeAbandoned, String abandonedTimeout) {
+        abandonedConfig.setLogAbandoned(Boolean.parseBoolean(logAbandoned));
+        abandonedConfig.setRemoveAbandoned(
+                Boolean.parseBoolean(removeAbandoned));
+        abandonedConfig.setRemoveAbandonedTimeout(
+                Integer.parseInt(abandonedTimeout));
+    }
+    
+    public void configureRun(String queryType, String iterations,
+            String clients, String minDelay, String maxDelay, String sigma,
+            String delayType, String rampType, String period, String cycleType) 
+            throws ConfigurationException {
+     
+        this.iterations = Long.parseLong(iterations);
+        this.numClients = Long.parseLong(clients);
+        this.minDelay = Long.parseLong(minDelay);
+        this.maxDelay = Long.parseLong(maxDelay);
+        this.sigma = Double.parseDouble(sigma);
+        this.delayType = delayType;
+        this.rampType = rampType;
+        this.period = Long.parseLong(period);
+        this.cycleType = cycleType;
+        if (cycleType.equals("oscillating") && this.period <= 0) {
+            throw new ConfigurationException(
+              "Period must be positive for oscillating cycle type");
+        }
+    }
+    
+    public void configure() throws Exception {
+        Digester digester = new Digester();
+        digester.push(this);
+        
+        digester.addCallMethod("configuration/factory", 
+                "configureFactory", 6);
+        digester.addCallParam(
+                "configuration/factory/activate-latency", 0);
+        digester.addCallParam(
+                "configuration/factory/destroy-latency", 1);
+        digester.addCallParam(
+                "configuration/factory/make-latency", 2);
+        digester.addCallParam(
+                "configuration/factory/passivate-latency", 3);
+        digester.addCallParam(
+                "configuration/factory/validate-latency", 4);
+        digester.addCallParam(
+                "configuration/factory/waiter-latency", 5);
+        
+        digester.addCallMethod("configuration/pool", 
+                "configurePool", 12);
+        digester.addCallParam(
+                "configuration/pool/max-active", 0);
+        digester.addCallParam(
+                "configuration/pool/max-idle", 1);
+        digester.addCallParam(
+                "configuration/pool/min-idle", 2);
+        digester.addCallParam(
+                "configuration/pool/max-wait", 3);
+        digester.addCallParam(
+                "configuration/pool/exhausted-action", 4);
+        digester.addCallParam(
+                "configuration/pool/test-on-borrow", 5);
+        digester.addCallParam(
+                "configuration/pool/test-on-return", 6);
+        digester.addCallParam(
+                "configuration/pool/time-between-evictions", 7);
+        digester.addCallParam(
+                "configuration/pool/tests-per-eviction", 8);
+        digester.addCallParam(
+                "configuration/pool/idle-timeout", 9);
+        digester.addCallParam(
+                "configuration/pool/test-while-idle", 10);
+        digester.addCallParam(
+                "configuration/pool/type", 11);
+        
+        digester.addCallMethod("configuration/run", 
+                "configureRun", 10);
+        digester.addCallParam(
+                "configuration/run/query-type", 0);
+        digester.addCallParam(
+                "configuration/run/iterations", 1);
+        digester.addCallParam(
+                "configuration/run/clients", 2);
+        digester.addCallParam(
+                "configuration/run/delay-min", 3);
+        digester.addCallParam(
+                "configuration/run/delay-max", 4);
+        digester.addCallParam(
+                "configuration/run/delay-sigma", 5);
+        digester.addCallParam(
+                "configuration/run/delay-type", 6);
+        digester.addCallParam(
+                "configuration/run/ramp-type", 7);
+        digester.addCallParam(
+                "configuration/run/period", 8);
+        digester.addCallParam(
+                "configuration/run/cycle-type", 9);
+        
+        digester.addCallMethod("configuration/abandoned-config",
+                "configureAbandonedConfig", 3);
+        digester.addCallParam(
+                "configuration/abandoned-config/log-abandoned", 0);
+        digester.addCallParam(
+                "configuration/abandoned-config/remove-abandoned", 1);
+        digester.addCallParam(
+                "configuration/abandoned-config/abandoned-timeout", 2);
+        
+        digester.parse("config-pool.xml");
+        
+    }
+}

Added: jakarta/commons/sandbox/performance/trunk/src/java/org/apache/commons/performance/pool/PoolTest.java
URL: http://svn.apache.org/viewvc/jakarta/commons/sandbox/performance/trunk/src/java/org/apache/commons/performance/pool/PoolTest.java?view=auto&rev=558593
==============================================================================
--- jakarta/commons/sandbox/performance/trunk/src/java/org/apache/commons/performance/pool/PoolTest.java
(added)
+++ jakarta/commons/sandbox/performance/trunk/src/java/org/apache/commons/performance/pool/PoolTest.java
Sun Jul 22 20:21:37 2007
@@ -0,0 +1,33 @@
+/*
+ * 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.commons.performance.pool;
+
+/**
+ * Load / performance test runner.
+ *
+ */
+public class PoolTest {
+    public static void main(String[] args) {
+        PoolSoak soaker = new PoolSoak();
+        try {
+            soaker.configure();
+            soaker.execute();
+        } catch (Exception ex) {
+            ex.printStackTrace();
+        }
+    }
+}

Added: jakarta/commons/sandbox/performance/trunk/src/java/org/apache/commons/performance/pool/Waiter.java
URL: http://svn.apache.org/viewvc/jakarta/commons/sandbox/performance/trunk/src/java/org/apache/commons/performance/pool/Waiter.java?view=auto&rev=558593
==============================================================================
--- jakarta/commons/sandbox/performance/trunk/src/java/org/apache/commons/performance/pool/Waiter.java
(added)
+++ jakarta/commons/sandbox/performance/trunk/src/java/org/apache/commons/performance/pool/Waiter.java
Sun Jul 22 20:21:37 2007
@@ -0,0 +1,66 @@
+/*
+ * 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.commons.performance.pool;
+
+/**
+ * Object created by WaiterFactory. Maintains active / valid state.
+ *
+ */
+public class Waiter {
+    private boolean active = false;
+    private boolean valid = true;
+    long latency = 0;
+    
+    public Waiter(boolean active, boolean valid, long latency) {
+        this.active = active;
+        this.valid = valid;
+        this.latency = latency;
+    }
+
+    public void doWait() {
+        try {
+            Thread.sleep(latency);
+        } catch (InterruptedException ex) {
+            // ignore
+        }
+    }
+
+    public boolean isActive() {
+        return active;
+    }
+
+    public void setActive(boolean active) {
+        this.active = active;
+    }
+
+    public long getLatency() {
+        return latency;
+    }
+
+    public void setLatency(long latency) {
+        this.latency = latency;
+    }
+
+    public boolean isValid() {
+        return valid;
+    }
+
+    public void setValid(boolean valid) {
+        this.valid = valid;
+    }
+}

Added: jakarta/commons/sandbox/performance/trunk/src/java/org/apache/commons/performance/pool/WaiterFactory.java
URL: http://svn.apache.org/viewvc/jakarta/commons/sandbox/performance/trunk/src/java/org/apache/commons/performance/pool/WaiterFactory.java?view=auto&rev=558593
==============================================================================
--- jakarta/commons/sandbox/performance/trunk/src/java/org/apache/commons/performance/pool/WaiterFactory.java
(added)
+++ jakarta/commons/sandbox/performance/trunk/src/java/org/apache/commons/performance/pool/WaiterFactory.java
Sun Jul 22 20:21:37 2007
@@ -0,0 +1,79 @@
+/*
+ * 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.commons.performance.pool;
+
+import org.apache.commons.pool.PoolableObjectFactory;
+
+/**
+ * Object factory with configurable latencies for object lifecycle methods.
+ *
+ */
+public class WaiterFactory implements PoolableObjectFactory {
+    
+    // TODO: implement protected getters so these can be stochastic
+    private long activateLatency = 0;
+    private long destroyLatency = 0;
+    private long makeLatency = 0;
+    private long passivateLatency = 0;
+    private long validateLatency = 0;
+    private long waiterLatency = 0;
+
+    public WaiterFactory(long activateLatency, long destroyLatency,
+            long makeLatency, long passivateLatency, long validateLatency,
+            long waiterLatency) {
+        this.activateLatency = activateLatency;
+        this.destroyLatency = destroyLatency;
+        this.makeLatency = makeLatency;
+        this.passivateLatency = passivateLatency;
+        this.validateLatency = validateLatency;
+        this.waiterLatency = waiterLatency;
+    }
+
+    public void activateObject(Object arg0) throws Exception {
+        doWait(activateLatency);
+    }
+
+    public void destroyObject(Object arg0) throws Exception {
+        doWait(destroyLatency);
+        ((Waiter) arg0).setValid(false);
+    }
+
+    public Object makeObject() throws Exception {
+        doWait(makeLatency);
+        return new Waiter(false, true, waiterLatency);
+    }
+
+    public void passivateObject(Object arg0) throws Exception {
+        ((Waiter) arg0).setActive(false);
+        doWait(passivateLatency);
+    }
+
+    public boolean validateObject(Object arg0) {
+        doWait(validateLatency);
+        return ((Waiter) arg0).isValid();
+    }
+    
+    protected void doWait(long latency) {
+        try {
+            Thread.sleep(latency);
+        } catch (InterruptedException ex) {
+            // ignore
+        }
+    }
+
+}



---------------------------------------------------------------------
To unsubscribe, e-mail: commons-dev-unsubscribe@jakarta.apache.org
For additional commands, e-mail: commons-dev-help@jakarta.apache.org


Mime
View raw message