From c89e9b5006cd0736b89cd82096e1e5a5487b658c Mon Sep 17 00:00:00 2001 From: Martin Furmanski Date: Mon, 8 Feb 2016 11:44:25 +0100 Subject: [PATCH] Count and allow some timeouts in election performance test. --- .../elections/DisconnectLeaderScenario.java | 33 ++++++++++++------- .../raft/elections/ElectionPerformanceIT.java | 8 +++-- 2 files changed, 28 insertions(+), 13 deletions(-) diff --git a/enterprise/core-edge/src/test/java/org/neo4j/coreedge/raft/elections/DisconnectLeaderScenario.java b/enterprise/core-edge/src/test/java/org/neo4j/coreedge/raft/elections/DisconnectLeaderScenario.java index f8f2ba14464c2..0a66ef9a8c17e 100644 --- a/enterprise/core-edge/src/test/java/org/neo4j/coreedge/raft/elections/DisconnectLeaderScenario.java +++ b/enterprise/core-edge/src/test/java/org/neo4j/coreedge/raft/elections/DisconnectLeaderScenario.java @@ -35,7 +35,8 @@ public class DisconnectLeaderScenario { private final Fixture fixture; private final long electionTimeout; - private final List electionResults = new ArrayList<>(); + private final List electionTimeResults = new ArrayList<>(); + private long timeoutCount; public DisconnectLeaderScenario( Fixture fixture, long electionTimeout ) { @@ -43,23 +44,31 @@ public DisconnectLeaderScenario( Fixture fixture, long electionTimeout ) this.electionTimeout = electionTimeout; } - public void run( long iterations ) throws InterruptedException, TimeoutException + public void run( long iterations, long leaderStabilityMaxTimeMillis ) throws InterruptedException { for ( int i = 0; i < iterations; i++ ) { - long electionTime = oneIteration(); - electionResults.add( electionTime ); + long electionTime; + try + { + electionTime = oneIteration( leaderStabilityMaxTimeMillis ); + electionTimeResults.add( electionTime ); + } + catch ( TimeoutException e ) + { + timeoutCount++; + } Thread.sleep( ThreadLocalRandom.current().nextLong( electionTimeout ) ); } } - private long oneIteration() throws InterruptedException, TimeoutException + private long oneIteration( long leaderStabilityMaxTimeMillis ) throws InterruptedException, TimeoutException { - RaftTestMember oldLeader = ElectionUtil.waitForLeaderAgreement( fixture.rafts, 10 * electionTimeout ); + RaftTestMember oldLeader = ElectionUtil.waitForLeaderAgreement( fixture.rafts, leaderStabilityMaxTimeMillis ); long startTime = System.currentTimeMillis(); fixture.net.disconnect( oldLeader ); - RaftTestMember newLeader = ElectionUtil.waitForLeaderAgreement( new FilteringIterable<>( fixture.rafts, raft -> !raft.identity().equals( oldLeader ) ), 10 * electionTimeout ); + RaftTestMember newLeader = ElectionUtil.waitForLeaderAgreement( new FilteringIterable<>( fixture.rafts, raft -> !raft.identity().equals( oldLeader ) ), leaderStabilityMaxTimeMillis ); assert !newLeader.equals( oldLeader ); // this should be guaranteed by the waitForLeaderAgreement call long endTime = System.currentTimeMillis(); @@ -82,12 +91,13 @@ public class Result double collidingAverage; double collisionRate; long collisionCount; + long timeoutCount; @Override public String toString() { - return String.format( "Result{nonCollidingAverage=%s, collidingAverage=%s, collisionRate=%s, collisionCount=%d}", - nonCollidingAverage, collidingAverage, collisionRate, collisionCount ); + return String.format( "Result{nonCollidingAverage=%s, collidingAverage=%s, collisionRate=%s, collisionCount=%d, timeoutCount=%d}", + nonCollidingAverage, collidingAverage, collisionRate, collisionCount, timeoutCount ); } } @@ -101,7 +111,7 @@ public Result result() long nonCollidingRuns = 0; long nonCollidingSum = 0; - for ( long electionTime : electionResults ) + for ( long electionTime : electionTimeResults ) { if ( hadOneOrMoreCollisions( electionTime ) ) { @@ -117,8 +127,9 @@ public Result result() result.collidingAverage = collidingSum / (double) collidingRuns; result.nonCollidingAverage = nonCollidingSum / (double) nonCollidingRuns; - result.collisionRate = collidingRuns / (double) electionResults.size(); + result.collisionRate = collidingRuns / (double) electionTimeResults.size(); result.collisionCount = collidingRuns; + result.timeoutCount = timeoutCount; return result; } diff --git a/enterprise/core-edge/src/test/java/org/neo4j/coreedge/raft/elections/ElectionPerformanceIT.java b/enterprise/core-edge/src/test/java/org/neo4j/coreedge/raft/elections/ElectionPerformanceIT.java index 8f8a42fdc83a2..c6f16df671b75 100644 --- a/enterprise/core-edge/src/test/java/org/neo4j/coreedge/raft/elections/ElectionPerformanceIT.java +++ b/enterprise/core-edge/src/test/java/org/neo4j/coreedge/raft/elections/ElectionPerformanceIT.java @@ -24,8 +24,10 @@ import org.neo4j.coreedge.raft.RaftTestNetwork; import org.neo4j.coreedge.server.RaftTestMember; +import static org.hamcrest.CoreMatchers.is; import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.lessThan; +import static org.hamcrest.Matchers.lessThanOrEqualTo; import static org.neo4j.helpers.collection.IteratorUtil.asSet; /** @@ -56,7 +58,7 @@ public void electionPerformance_NormalConditions() throws Throwable { // when running scenario fixture.boot(); - scenario.run( iterations ); + scenario.run( iterations, 10 * electionTimeout ); } finally { @@ -76,6 +78,7 @@ public void electionPerformance_NormalConditions() throws Throwable { assertThat( result.collidingAverage, lessThan( 3000d ) ); } + assertThat( result.timeoutCount, is( 0L ) ); } @Test @@ -95,7 +98,7 @@ public void electionPerformance_RapidConditions() throws Throwable { // when running scenario fixture.boot(); - scenario.run( iterations ); + scenario.run( iterations, 10 * electionTimeout ); } finally { @@ -117,5 +120,6 @@ public void electionPerformance_RapidConditions() throws Throwable { assertThat( result.collidingAverage, lessThan( 120d ) ); } + assertThat( result.timeoutCount, lessThanOrEqualTo( 1L ) ); // for GC or whatever reason } }