Skip to content

Commit 94763e3

Browse files
authored
Fix flaky CausalClusteringStressIT (#800)
Fix flaky CausalClusteringStressIT by removing read distribution checks from stress tests
1 parent fc5c117 commit 94763e3

File tree

5 files changed

+4
-211
lines changed

5 files changed

+4
-211
lines changed

driver/src/test/java/org/neo4j/driver/stress/AbstractContext.java

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -65,11 +65,8 @@ public final long getCreatedNodesCount()
6565
public final void readCompleted( ResultSummary summary )
6666
{
6767
readNodesCount.incrementAndGet();
68-
processSummary( summary );
6968
}
7069

71-
public abstract void processSummary( ResultSummary summary );
72-
7370
public long getReadNodesCount()
7471
{
7572
return readNodesCount.get();

driver/src/test/java/org/neo4j/driver/stress/AbstractStressTestBase.java

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -225,8 +225,6 @@ Config config()
225225

226226
abstract boolean handleWriteFailure( Throwable error, C context );
227227

228-
abstract void assertExpectedReadQueryDistribution( C context );
229-
230228
abstract <A extends C> void printStats( A context );
231229

232230
private List<Future<?>> launchBlockingWorkerThreads( C context )
@@ -437,7 +435,6 @@ private void verifyResults( C context, ResourcesInfo resourcesInfo )
437435
assertNoFileDescriptorLeak( resourcesInfo.openFileDescriptorCount );
438436
assertNoLoggersLeak( resourcesInfo.acquiredLoggerNames );
439437
assertExpectedNumberOfNodesCreated( context.getCreatedNodesCount() );
440-
assertExpectedReadQueryDistribution( context );
441438
}
442439

443440
private void assertNoFileDescriptorLeak( long previousOpenFileDescriptors )

driver/src/test/java/org/neo4j/driver/stress/CausalClusteringStressIT.java

Lines changed: 0 additions & 165 deletions
Original file line numberDiff line numberDiff line change
@@ -22,33 +22,14 @@
2222

2323
import java.net.URI;
2424
import java.util.Arrays;
25-
import java.util.HashMap;
26-
import java.util.HashSet;
2725
import java.util.List;
28-
import java.util.Map;
29-
import java.util.Set;
30-
import java.util.concurrent.ConcurrentHashMap;
31-
import java.util.concurrent.ConcurrentMap;
3226
import java.util.concurrent.atomic.AtomicInteger;
33-
import java.util.concurrent.atomic.AtomicLong;
3427

3528
import org.neo4j.driver.AuthToken;
3629
import org.neo4j.driver.Config;
37-
import org.neo4j.driver.Driver;
3830
import org.neo4j.driver.exceptions.SessionExpiredException;
39-
import org.neo4j.driver.internal.BoltServerAddress;
40-
import org.neo4j.driver.internal.util.ServerVersion;
41-
import org.neo4j.driver.summary.ResultSummary;
42-
import org.neo4j.driver.util.cc.ClusterMemberRole;
43-
import org.neo4j.driver.util.cc.ClusterMemberRoleDiscoveryFactory;
4431
import org.neo4j.driver.util.cc.LocalOrRemoteClusterExtension;
4532

46-
import static org.hamcrest.Matchers.both;
47-
import static org.hamcrest.Matchers.greaterThan;
48-
import static org.hamcrest.Matchers.greaterThanOrEqualTo;
49-
import static org.hamcrest.Matchers.lessThanOrEqualTo;
50-
import static org.hamcrest.junit.MatcherAssert.assertThat;
51-
5233
class CausalClusteringStressIT extends AbstractStressTestBase<CausalClusteringStressIT.Context>
5334
{
5435
@RegisterExtension
@@ -104,27 +85,6 @@ boolean handleWriteFailure( Throwable error, Context context )
10485
return false;
10586
}
10687

107-
@Override
108-
void assertExpectedReadQueryDistribution( Context context )
109-
{
110-
Map<String,Long> readQueriesByServer = context.getReadQueriesByServer();
111-
ClusterAddresses clusterAddresses = fetchClusterAddresses( driver );
112-
113-
// expect all followers to serve more than zero read queries
114-
assertAllAddressesServedReadQueries( "Follower", clusterAddresses.followers, readQueriesByServer );
115-
116-
// expect all read replicas to serve more than zero read queries
117-
assertAllAddressesServedReadQueries( "Read replica", clusterAddresses.readReplicas, readQueriesByServer );
118-
119-
// expect all followers to serve same order of magnitude read queries
120-
assertAllAddressesServedSimilarAmountOfReadQueries( "Followers", clusterAddresses.followers,
121-
readQueriesByServer, clusterAddresses );
122-
123-
// expect all read replicas to serve same order of magnitude read queries
124-
assertAllAddressesServedSimilarAmountOfReadQueries( "Read replicas", clusterAddresses.readReplicas,
125-
readQueriesByServer, clusterAddresses );
126-
}
127-
12888
@Override
12989
void printStats( Context context )
13090
{
@@ -141,115 +101,10 @@ void dumpLogs()
141101
clusterRule.dumpClusterLogs();
142102
}
143103

144-
private static ClusterAddresses fetchClusterAddresses( Driver driver )
145-
{
146-
Set<String> followers = new HashSet<>();
147-
Set<String> readReplicas = new HashSet<>();
148-
149-
final ClusterMemberRoleDiscoveryFactory.ClusterMemberRoleDiscovery discovery =
150-
ClusterMemberRoleDiscoveryFactory.newInstance( ServerVersion.version( driver ) );
151-
final Map<BoltServerAddress,ClusterMemberRole> clusterOverview = discovery.findClusterOverview( driver );
152-
153-
for ( BoltServerAddress address : clusterOverview.keySet() )
154-
{
155-
String boltAddress = String.format( "%s:%s", address.host(), address.port() );
156-
ClusterMemberRole role = clusterOverview.get( address );
157-
if ( role == ClusterMemberRole.FOLLOWER )
158-
{
159-
followers.add( boltAddress );
160-
}
161-
else if ( role == ClusterMemberRole.READ_REPLICA )
162-
{
163-
readReplicas.add( boltAddress );
164-
}
165-
}
166-
167-
return new ClusterAddresses( followers, readReplicas );
168-
}
169-
170-
private static void assertAllAddressesServedReadQueries( String addressType, Set<String> addresses,
171-
Map<String,Long> readQueriesByServer )
172-
{
173-
for ( String address : addresses )
174-
{
175-
Long queries = readQueriesByServer.get( address );
176-
assertThat( addressType + " did not serve any read queries", queries, greaterThan( 0L ) );
177-
}
178-
}
179-
180-
private static void assertAllAddressesServedSimilarAmountOfReadQueries( String addressesType, Set<String> addresses,
181-
Map<String,Long> readQueriesByServer, ClusterAddresses allAddresses )
182-
{
183-
long expectedOrderOfMagnitude = -1;
184-
for ( String address : addresses )
185-
{
186-
long queries = readQueriesByServer.get( address );
187-
long orderOfMagnitude = orderOfMagnitude( queries );
188-
if ( expectedOrderOfMagnitude == -1 )
189-
{
190-
expectedOrderOfMagnitude = orderOfMagnitude;
191-
}
192-
else
193-
{
194-
assertThat( addressesType + " are expected to serve similar amount of queries. " +
195-
"Addresses: " + allAddresses + ", " +
196-
"read queries served: " + readQueriesByServer,
197-
orderOfMagnitude,
198-
both( greaterThanOrEqualTo( expectedOrderOfMagnitude - 1 ) )
199-
.and( lessThanOrEqualTo( expectedOrderOfMagnitude + 1 ) ) );
200-
}
201-
}
202-
}
203-
204-
private static long orderOfMagnitude( long number )
205-
{
206-
long result = 1;
207-
while ( number >= 10 )
208-
{
209-
number /= 10;
210-
result++;
211-
}
212-
return result;
213-
}
214-
215104
static class Context extends AbstractContext
216105
{
217-
final ConcurrentMap<String,AtomicLong> readQueriesByServer = new ConcurrentHashMap<>();
218106
final AtomicInteger leaderSwitches = new AtomicInteger();
219107

220-
@Override
221-
public void processSummary( ResultSummary summary )
222-
{
223-
if ( summary == null )
224-
{
225-
return;
226-
}
227-
228-
String serverAddress = summary.server().address();
229-
230-
AtomicLong count = readQueriesByServer.get( serverAddress );
231-
if ( count == null )
232-
{
233-
count = new AtomicLong();
234-
AtomicLong existingCounter = readQueriesByServer.putIfAbsent( serverAddress, count );
235-
if ( existingCounter != null )
236-
{
237-
count = existingCounter;
238-
}
239-
}
240-
count.incrementAndGet();
241-
}
242-
243-
Map<String,Long> getReadQueriesByServer()
244-
{
245-
Map<String,Long> result = new HashMap<>();
246-
for ( Map.Entry<String,AtomicLong> entry : readQueriesByServer.entrySet() )
247-
{
248-
result.put( entry.getKey(), entry.getValue().get() );
249-
}
250-
return result;
251-
}
252-
253108
void leaderSwitch()
254109
{
255110
leaderSwitches.incrementAndGet();
@@ -261,24 +116,4 @@ int getLeaderSwitchCount()
261116
}
262117
}
263118

264-
private static class ClusterAddresses
265-
{
266-
final Set<String> followers;
267-
final Set<String> readReplicas;
268-
269-
ClusterAddresses( Set<String> followers, Set<String> readReplicas )
270-
{
271-
this.followers = followers;
272-
this.readReplicas = readReplicas;
273-
}
274-
275-
@Override
276-
public String toString()
277-
{
278-
return "ClusterAddresses{" +
279-
"followers=" + followers +
280-
", readReplicas=" + readReplicas +
281-
'}';
282-
}
283-
}
284119
}

driver/src/test/java/org/neo4j/driver/stress/SingleInstanceStressIT.java

Lines changed: 1 addition & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -23,18 +23,12 @@
2323
import java.net.URI;
2424
import java.util.Collections;
2525
import java.util.List;
26-
import java.util.concurrent.atomic.AtomicLong;
2726

2827
import org.neo4j.driver.AuthToken;
2928
import org.neo4j.driver.Config;
30-
import org.neo4j.driver.summary.ResultSummary;
3129
import org.neo4j.driver.util.DatabaseExtension;
3230
import org.neo4j.driver.util.ParallelizableIT;
3331

34-
import static org.hamcrest.Matchers.greaterThan;
35-
import static org.hamcrest.junit.MatcherAssert.assertThat;
36-
import static org.junit.jupiter.api.Assertions.assertEquals;
37-
3832
@ParallelizableIT
3933
class SingleInstanceStressIT extends AbstractStressTestBase<SingleInstanceStressIT.Context>
4034
{
@@ -62,7 +56,7 @@ Config.ConfigBuilder config( Config.ConfigBuilder builder )
6256
@Override
6357
Context createContext()
6458
{
65-
return new Context( neo4j.address().toString() );
59+
return new Context();
6660
}
6761

6862
@Override
@@ -78,12 +72,6 @@ boolean handleWriteFailure( Throwable error, Context context )
7872
return false;
7973
}
8074

81-
@Override
82-
void assertExpectedReadQueryDistribution( Context context )
83-
{
84-
assertThat( context.getReadQueryCount(), greaterThan( 0L ) );
85-
}
86-
8775
@Override
8876
<A extends Context> void printStats( A context )
8977
{
@@ -95,31 +83,6 @@ <A extends Context> void printStats( A context )
9583

9684
static class Context extends AbstractContext
9785
{
98-
final String expectedAddress;
99-
final AtomicLong readQueries = new AtomicLong();
100-
101-
Context( String expectedAddress )
102-
{
103-
this.expectedAddress = expectedAddress;
104-
}
105-
106-
@Override
107-
public void processSummary( ResultSummary summary )
108-
{
109-
if ( summary == null )
110-
{
111-
return;
112-
}
113-
114-
String address = summary.server().address();
115-
assertEquals( expectedAddress, address );
116-
readQueries.incrementAndGet();
117-
}
118-
119-
long getReadQueryCount()
120-
{
121-
return readQueries.get();
122-
}
12386
}
12487

12588
@Override

driver/src/test/java/org/neo4j/driver/util/TemporalUtil.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -60,8 +60,9 @@ public final class TemporalUtil
6060
"Africa/Casablanca",
6161
"tzid",
6262
"Asia/Qostanay",
63-
"America/Santiago" // Can cause flakyness on windows, see https://stackoverflow.com/questions/37533796/java-calendar-returns-wrong-hour-in-ms-windows-for-america-santiago-zone.
64-
);
63+
"America/Santiago",// Can cause flakyness on windows, see https://stackoverflow.com/questions/37533796/java-calendar-returns-wrong-hour-in-ms-windows-for-america-santiago-zone.
64+
"Pacific/Easter"
65+
);
6566

6667
private TemporalUtil()
6768
{

0 commit comments

Comments
 (0)