Author: rombert Date: Mon Jul 8 11:33:09 2013 New Revision: 1500670 URL: http://svn.apache.org/r1500670 Log: SLING-2945 - ClusterLoadTest failures
Replaced Thread.sleep usage with RetryLoop to make the testing runs more predictable. Also, wrap dumpRepo calls in try/catch calls since they previously failed due to (probably) concurrent repo access. Modified: sling/trunk/bundles/extensions/discovery/impl/pom.xml sling/trunk/bundles/extensions/discovery/impl/src/test/java/org/apache/sling/discovery/impl/cluster/ClusterLoadTest.java Modified: sling/trunk/bundles/extensions/discovery/impl/pom.xml URL: http://svn.apache.org/viewvc/sling/trunk/bundles/extensions/discovery/impl/pom.xml?rev=1500670&r1=1500669&r2=1500670&view=diff ============================================================================== --- sling/trunk/bundles/extensions/discovery/impl/pom.xml (original) +++ sling/trunk/bundles/extensions/discovery/impl/pom.xml Mon Jul 8 11:33:09 2013 @@ -179,5 +179,11 @@ <type>bundle</type> <scope>test</scope> </dependency> + <dependency> + <groupId>org.apache.sling</groupId> + <artifactId>org.apache.sling.testing.tools</artifactId> + <version>1.0.2</version> + <scope>test</scope> + </dependency> </dependencies> </project> Modified: sling/trunk/bundles/extensions/discovery/impl/src/test/java/org/apache/sling/discovery/impl/cluster/ClusterLoadTest.java URL: http://svn.apache.org/viewvc/sling/trunk/bundles/extensions/discovery/impl/src/test/java/org/apache/sling/discovery/impl/cluster/ClusterLoadTest.java?rev=1500670&r1=1500669&r2=1500670&view=diff ============================================================================== --- sling/trunk/bundles/extensions/discovery/impl/src/test/java/org/apache/sling/discovery/impl/cluster/ClusterLoadTest.java (original) +++ sling/trunk/bundles/extensions/discovery/impl/src/test/java/org/apache/sling/discovery/impl/cluster/ClusterLoadTest.java Mon Jul 8 11:33:09 2013 @@ -11,6 +11,7 @@ import java.util.Random; import org.apache.sling.discovery.impl.common.resource.EstablishedInstanceDescription; import org.apache.sling.discovery.impl.common.resource.IsolatedInstanceDescription; import org.apache.sling.discovery.impl.setup.Instance; +import org.apache.sling.testing.tools.retry.RetryLoop; import org.junit.After; import org.junit.Test; import org.slf4j.Logger; @@ -18,7 +19,11 @@ import org.slf4j.LoggerFactory; public class ClusterLoadTest { - private final Random random = new Random(); + // wait up to 4 heartbeat intervals + private static final int INSTANCE_VIEW_WAIT_TIME_MILLIS = 5000; + private static final int INSTANCE_VIEW_POLL_INTERVAL_MILLIS = 500; + + private final Random random = new Random(); private final Logger logger = LoggerFactory.getLogger(this.getClass()); @@ -109,8 +114,6 @@ public class ClusterLoadTest { logger.info("====================="); logger.info(" START of LOOP "+i); logger.info("====================="); - // wait 4 heartbeat intervals to let things settle - Thread.sleep(5000); // count how many instances had heartbeats running in the first place int aliveCnt = 0; @@ -128,21 +131,27 @@ public class ClusterLoadTest { aliveCnt=1; } + final int aliveCntFinal = aliveCnt; + for (Iterator<Instance> it = instances.iterator(); it.hasNext();) { Instance instance = it.next(); - instance.dumpRepo(); + try { + instance.dumpRepo(); + } catch (Exception e) { + logger.error("Failed dumping repo for instance " + instance.getSlingId(), e); + } } // then verify that each instance sees that many instances for (Iterator<Instance> it = instances.iterator(); it.hasNext();) { - Instance instance = it.next(); - int actualCount = instance.getClusterViewService().getClusterView().getInstances().size(); + final Instance instance = it.next(); if (!instance.isHeartbeatRunning()) { // if the heartbeat is not running, this instance is considered dead // hence we're not doing any assert here (as the count is only // valid if heartbeat/checkView is running and that would void the test) } else { - assertEquals(actualCount, aliveCnt); + new RetryLoop(new ConditionImplementation(instance, aliveCntFinal), INSTANCE_VIEW_WAIT_TIME_MILLIS, + INSTANCE_VIEW_POLL_INTERVAL_MILLIS); } } @@ -164,4 +173,24 @@ public class ClusterLoadTest { } } + static class ConditionImplementation implements RetryLoop.Condition { + + private final int expectedAliveCount; + private final Instance instance; + + private ConditionImplementation(Instance instance, int expectedAliveCount) { + this.expectedAliveCount = expectedAliveCount; + this.instance = instance; + } + + public boolean isTrue() throws Exception { + return expectedAliveCount == instance.getClusterViewService().getClusterView().getInstances().size(); + } + + public String getDescription() { + return "Waiting for instance with " + instance.getSlingId() + " to see " + expectedAliveCount + + " instances"; + } + } + }