Skip to content

Commit ef1bce7

Browse files
authored
Remove cluster ITs that manipulate cluster state (#1090)
The following tests have been removed and superseded by Testkit tests: - `CausalClusteringIT.shouldNotServeWritesWhenMajorityOfCoresAreDead` -> `RoutingV4x4.test_should_fail_when_writing_without_writers_using_session_run` - `CausalClusteringIT.shouldServeReadsWhenMajorityOfCoresAreDead` -> `RoutingV4x4.test_should_serve_reads_and_fail_writes_when_no_writers_available` - `CausalClusteringIT.shouldHandleGracefulLeaderSwitch` -> `RoutingV4x4.test_should_write_successfully_after_leader_switch_using_tx_run`
1 parent e81c345 commit ef1bce7

File tree

3 files changed

+0
-203
lines changed

3 files changed

+0
-203
lines changed

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

-137
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,6 @@
2626
import java.net.URI;
2727
import java.util.ArrayList;
2828
import java.util.Arrays;
29-
import java.util.Collections;
3029
import java.util.List;
3130
import java.util.Map;
3231
import java.util.Set;
@@ -40,7 +39,6 @@
4039
import java.util.concurrent.TimeoutException;
4140
import java.util.concurrent.atomic.AtomicBoolean;
4241
import java.util.function.Function;
43-
import java.util.stream.Collectors;
4442

4543
import org.neo4j.driver.AccessMode;
4644
import org.neo4j.driver.AuthToken;
@@ -70,7 +68,6 @@
7068
import org.neo4j.driver.internal.util.ServerVersion;
7169
import org.neo4j.driver.internal.util.ThrowingMessageEncoder;
7270
import org.neo4j.driver.internal.util.io.ChannelTrackingDriverFactory;
73-
import org.neo4j.driver.net.ServerAddress;
7471
import org.neo4j.driver.summary.ResultSummary;
7572
import org.neo4j.driver.util.cc.Cluster;
7673
import org.neo4j.driver.util.cc.ClusterExtension;
@@ -329,140 +326,6 @@ void beginTransactionThrowsForInvalidBookmark()
329326
}
330327
}
331328

332-
@Test
333-
void shouldHandleGracefulLeaderSwitch() throws Exception
334-
{
335-
Cluster cluster = clusterRule.getCluster();
336-
ClusterMember leader = cluster.leader();
337-
ServerAddress clusterAddress = ServerAddress.of( "cluster", 7687 );
338-
URI clusterUri = URI.create( String.format( "neo4j://%s:%d", clusterAddress.host(), clusterAddress.port() ) );
339-
Set<ServerAddress> coreAddresses = cluster.cores().stream()
340-
.map( ClusterMember::getBoltAddress )
341-
.collect( Collectors.toSet() );
342-
343-
Config config = Config.builder()
344-
.withLogging( none() )
345-
.withResolver( address -> address.equals( clusterAddress ) ? coreAddresses : Collections.singleton( address ) )
346-
.build();
347-
348-
try ( Driver driver = GraphDatabase.driver( clusterUri, clusterRule.getDefaultAuthToken(), config ) )
349-
{
350-
Session session1 = driver.session();
351-
Transaction tx1 = session1.beginTransaction();
352-
353-
// gracefully stop current leader to force re-election
354-
cluster.stop( leader );
355-
356-
assertThrows( (Class<? extends Exception>) SessionExpiredException.class,
357-
() -> tx1.run( "CREATE (person:Person {name: $name, title: $title})",
358-
parameters( "name", "Webber", "title", "Mr" ) ) );
359-
360-
session1.close();
361-
362-
Bookmark bookmark = inExpirableSession( driver, Driver::session, session ->
363-
{
364-
try ( Transaction tx = session.beginTransaction() )
365-
{
366-
tx.run( "CREATE (person:Person {name: $name, title: $title})",
367-
parameters( "name", "Webber", "title", "Mr" ) );
368-
tx.commit();
369-
}
370-
return session.lastBookmark();
371-
} );
372-
373-
try ( Session session2 = driver.session(
374-
builder().withDefaultAccessMode( AccessMode.READ ).withBookmarks( bookmark ).build() );
375-
Transaction tx2 = session2.beginTransaction() )
376-
{
377-
Record record = tx2.run( "MATCH (n:Person) RETURN COUNT(*) AS count" ).next();
378-
tx2.commit();
379-
assertEquals( 1, record.get( "count" ).asInt() );
380-
}
381-
}
382-
}
383-
384-
@Test
385-
void shouldNotServeWritesWhenMajorityOfCoresAreDead()
386-
{
387-
Cluster cluster = clusterRule.getCluster();
388-
ClusterMember leader = cluster.leader();
389-
390-
try ( Driver driver = createDriver( leader.getRoutingUri() ) )
391-
{
392-
Set<ClusterMember> cores = cluster.cores();
393-
for ( ClusterMember follower : cluster.followers() )
394-
{
395-
cluster.stop( follower );
396-
}
397-
awaitLeaderToStepDown( cores );
398-
399-
// now we should be unable to write because majority of cores is down
400-
for ( int i = 0; i < 10; i++ )
401-
{
402-
assertThrows( SessionExpiredException.class, () ->
403-
{
404-
try ( Session session = driver.session( builder().withDefaultAccessMode( AccessMode.WRITE ).build() ) )
405-
{
406-
session.run( "CREATE (p:Person {name: 'Gamora'})" ).consume();
407-
}
408-
} );
409-
}
410-
}
411-
}
412-
413-
@Test
414-
void shouldServeReadsWhenMajorityOfCoresAreDead()
415-
{
416-
Cluster cluster = clusterRule.getCluster();
417-
ClusterMember leader = cluster.leader();
418-
419-
try ( Driver driver = createDriver( leader.getRoutingUri() ) )
420-
{
421-
Bookmark bookmark;
422-
try ( Session session = driver.session() )
423-
{
424-
int writeResult = session.writeTransaction( tx ->
425-
{
426-
Result result = tx.run( "CREATE (:Person {name: 'Star Lord'}) RETURN 42" );
427-
return result.single().get( 0 ).asInt();
428-
} );
429-
430-
assertEquals( 42, writeResult );
431-
bookmark = session.lastBookmark();
432-
}
433-
434-
ensureNodeVisible( cluster, "Star Lord", bookmark );
435-
436-
Set<ClusterMember> cores = cluster.cores();
437-
for ( ClusterMember follower : cluster.followers() )
438-
{
439-
cluster.stop( follower );
440-
}
441-
awaitLeaderToStepDown( cores );
442-
443-
// now we should be unable to write because majority of cores is down
444-
assertThrows( SessionExpiredException.class, () ->
445-
{
446-
try ( Session session = driver.session( builder().withDefaultAccessMode( AccessMode.WRITE ).build() ) )
447-
{
448-
session.run( "CREATE (p:Person {name: 'Gamora'})" ).consume();
449-
}
450-
} );
451-
452-
// but we should be able to read from the remaining core or read replicas
453-
try ( Session session = driver.session() )
454-
{
455-
int count = session.readTransaction( tx ->
456-
{
457-
Result result = tx.run( "MATCH (:Person {name: 'Star Lord'}) RETURN COUNT(*)" );
458-
return result.single().get( 0 ).asInt();
459-
} );
460-
461-
assertEquals( 1, count );
462-
}
463-
}
464-
}
465-
466329
@Test
467330
void shouldAcceptMultipleBookmarks() throws Exception
468331
{

driver/src/test/java/org/neo4j/driver/util/cc/Cluster.java

-65
Original file line numberDiff line numberDiff line change
@@ -19,20 +19,15 @@
1919
package org.neo4j.driver.util.cc;
2020

2121
import java.io.FileNotFoundException;
22-
import java.net.InetAddress;
23-
import java.net.URI;
24-
import java.net.UnknownHostException;
2522
import java.nio.file.Path;
2623
import java.util.HashSet;
27-
import java.util.List;
2824
import java.util.Map;
2925
import java.util.Set;
3026
import java.util.concurrent.ThreadLocalRandom;
3127
import java.util.concurrent.TimeUnit;
3228

3329
import org.neo4j.driver.Bookmark;
3430
import org.neo4j.driver.Driver;
35-
import org.neo4j.driver.Record;
3631
import org.neo4j.driver.internal.BoltServerAddress;
3732
import org.neo4j.driver.util.TestUtil;
3833
import org.neo4j.driver.util.cc.ClusterMemberRoleDiscoveryFactory.ClusterMemberRoleDiscovery;
@@ -147,31 +142,6 @@ public void start( ClusterMember member )
147142
waitForMembersToBeOnline();
148143
}
149144

150-
public void startOfflineMembers()
151-
{
152-
// copy offline members to avoid ConcurrentModificationException
153-
Set<ClusterMember> currentlyOfflineMembers = new HashSet<>( offlineMembers );
154-
for ( ClusterMember member : currentlyOfflineMembers )
155-
{
156-
startNoWait( member );
157-
}
158-
waitForMembersToBeOnline();
159-
}
160-
161-
public void stop( ClusterMember member )
162-
{
163-
removeOfflineMember( member );
164-
SharedCluster.stop( member );
165-
waitForMembersToBeOnline();
166-
}
167-
168-
public void kill( ClusterMember member )
169-
{
170-
removeOfflineMember( member );
171-
SharedCluster.kill( member );
172-
waitForMembersToBeOnline();
173-
}
174-
175145
public Driver getDirectDriver( ClusterMember member )
176146
{
177147
return clusterDrivers.getDriver( member );
@@ -219,15 +189,6 @@ private void addOfflineMember( ClusterMember member )
219189
members.add( member );
220190
}
221191

222-
private void removeOfflineMember( ClusterMember member )
223-
{
224-
if ( !members.remove( member ) )
225-
{
226-
throw new IllegalArgumentException( "Unknown cluster member " + member );
227-
}
228-
offlineMembers.add( member );
229-
}
230-
231192
private void startNoWait( ClusterMember member )
232193
{
233194
addOfflineMember( member );
@@ -389,32 +350,6 @@ private static Set<BoltServerAddress> extractBoltAddresses( Set<ClusterMember> m
389350
return addresses;
390351
}
391352

392-
private static BoltServerAddress extractBoltAddress( Record record )
393-
{
394-
List<Object> addresses = record.get( "addresses" ).asList();
395-
String boltUriString = (String) addresses.get( 0 );
396-
URI boltUri = URI.create( boltUriString );
397-
return newBoltServerAddress( boltUri );
398-
}
399-
400-
private static BoltServerAddress newBoltServerAddress( URI uri )
401-
{
402-
try
403-
{
404-
return new BoltServerAddress( InetAddress.getByName( uri.getHost() ).getHostAddress(), uri.getPort() );
405-
}
406-
catch ( UnknownHostException e )
407-
{
408-
throw new RuntimeException( "Unable to resolve host to IP in URI: '" + uri + "'" );
409-
}
410-
}
411-
412-
private static ClusterMemberRole extractRole( Record record )
413-
{
414-
String roleString = record.get( "role" ).asString();
415-
return ClusterMemberRole.valueOf( roleString.toUpperCase() );
416-
}
417-
418353
private static ClusterMember findByBoltAddress( BoltServerAddress boltAddress, Set<ClusterMember> members )
419354
{
420355
for ( ClusterMember member : members )

driver/src/test/java/org/neo4j/driver/util/cc/ClusterExtension.java

-1
Original file line numberDiff line numberDiff line change
@@ -100,7 +100,6 @@ public void beforeAll( ExtensionContext context ) throws Exception
100100
public void afterEach( ExtensionContext context )
101101
{
102102
Cluster cluster = getCluster();
103-
cluster.startOfflineMembers();
104103
cluster.deleteData();
105104
}
106105

0 commit comments

Comments
 (0)