3636
3737import org .neo4j .driver .internal .logging .ConsoleLogging ;
3838import org .neo4j .driver .internal .net .BoltServerAddress ;
39+ import org .neo4j .driver .internal .spi .Connection ;
3940import org .neo4j .driver .v1 .AccessMode ;
4041import org .neo4j .driver .v1 .Config ;
4142import org .neo4j .driver .v1 .GraphDatabase ;
4647import org .neo4j .driver .v1 .util .Function ;
4748import org .neo4j .driver .v1 .util .StubServer ;
4849
50+ import static org .hamcrest .Matchers .contains ;
4951import static org .hamcrest .Matchers .containsInAnyOrder ;
5052import static org .hamcrest .Matchers .hasItem ;
5153import static org .hamcrest .Matchers .hasSize ;
@@ -338,7 +340,7 @@ public void shouldRediscoverIfNecessaryOnSessionAcquisition()
338340
339341 URI uri = URI .create ( "bolt+routing://127.0.0.1:9001" );
340342 //START a read server
341- StubServer .start ( resource ( "read_server .script" ), 9005 );
343+ StubServer read = StubServer .start ( resource ( "empty .script" ), 9005 );
342344
343345 //On creation we only find ourselves
344346 ClusterDriver driver = (ClusterDriver ) GraphDatabase .driver ( uri , config );
@@ -356,6 +358,7 @@ public void shouldRediscoverIfNecessaryOnSessionAcquisition()
356358
357359 // Finally
358360 assertThat ( server .exitStatus (), equalTo ( 0 ) );
361+ assertThat ( read .exitStatus (), equalTo ( 0 ) );
359362 }
360363
361364 @ Test
@@ -366,7 +369,7 @@ public void shouldOnlyGetServersOnce() throws IOException, InterruptedException,
366369
367370 URI uri = URI .create ( "bolt+routing://127.0.0.1:9001" );
368371 //START a read server
369- StubServer .start ( resource ( "read_server .script" ), 9005 );
372+ StubServer read = StubServer .start ( resource ( "empty .script" ), 9005 );
370373
371374 //On creation we only find ourselves
372375 final ClusterDriver driver = (ClusterDriver ) GraphDatabase .driver ( uri , config );
@@ -397,6 +400,7 @@ public void run()
397400
398401 // Finally
399402 assertThat ( server .exitStatus (), equalTo ( 0 ) );
403+ assertThat ( read .exitStatus (), equalTo ( 0 ) );
400404 }
401405
402406 @ Test
@@ -455,6 +459,90 @@ public void shouldHandleLeaderSwitchWhenWriting()
455459 assertThat ( server .exitStatus (), equalTo ( 0 ) );
456460 }
457461
462+ @ Test
463+ public void shouldRediscoverOnExpiry () throws IOException , InterruptedException , StubServer .ForceKilled
464+ {
465+ // Given
466+ StubServer server = StubServer .start ( resource ( "expire.script" ), 9001 );
467+
468+ //START a read server
469+ StubServer readServer = StubServer .start ( resource ( "empty.script" ), 9005 );
470+ URI uri = URI .create ( "bolt+routing://127.0.0.1:9001" );
471+ ClusterDriver driver = (ClusterDriver ) GraphDatabase .driver ( uri , config );
472+ assertThat (driver .routingServers (), contains (address ( 9001 )));
473+ assertThat (driver .readServers (), contains (address ( 9002 )));
474+ assertThat (driver .writeServers (), contains (address ( 9003 )));
475+
476+ //On acquisition we should update our view
477+ Session session = driver .session ( AccessMode .READ );
478+ assertThat (driver .routingServers (), contains (address ( 9004 )));
479+ assertThat (driver .readServers (), contains (address ( 9005 )));
480+ assertThat (driver .writeServers (), contains (address ( 9006 )));
481+ session .close ();
482+ driver .close ();
483+ // Finally
484+ assertThat ( server .exitStatus (), equalTo ( 0 ) );
485+ assertThat ( readServer .exitStatus (), equalTo ( 0 ) );
486+ }
487+
488+ @ Test
489+ public void shouldNotPutBackPurgedConnection () throws IOException , InterruptedException , StubServer .ForceKilled
490+ {
491+ // Given
492+ StubServer server = StubServer .start ( resource ( "not_reuse_connection.script" ), 9001 );
493+
494+ //START servers
495+ StubServer readServer = StubServer .start ( resource ( "empty.script" ), 9002 );
496+ StubServer writeServer1 = StubServer .start ( resource ( "dead_server.script" ), 9003 );
497+ StubServer writeServer2 = StubServer .start ( resource ( "empty.script" ), 9006 );
498+ URI uri = URI .create ( "bolt+routing://127.0.0.1:9001" );
499+
500+ ClusterDriver driver = (ClusterDriver ) GraphDatabase .driver ( uri , config );
501+
502+
503+ //Open both a read and a write session
504+ Session readSession = driver .session ( AccessMode .READ );
505+ Session writeSession = driver .session ( AccessMode .WRITE );
506+
507+ try
508+ {
509+ writeSession .run ( "MATCH (n) RETURN n.name" );
510+ writeSession .close ();
511+ fail ();
512+ }
513+ catch (SessionExpiredException e )
514+ {
515+ //ignore
516+ }
517+ //We now lost all write servers
518+ assertThat (driver .writeServers (), hasSize ( 0 ));
519+
520+ //reacquiring will trow out the current read server at 9002
521+ writeSession = driver .session ( AccessMode .WRITE );
522+
523+ assertThat (driver .routingServers (), contains (address ( 9004 )));
524+ assertThat (driver .readServers (), contains (address ( 9005 )));
525+ assertThat (driver .writeServers (), contains (address ( 9006 )));
526+ assertFalse (driver .connectionPool ().hasAddress (address ( 9002 ) ));
527+
528+ // now we close the read session and the connection should not be put
529+ // back to the pool
530+ Connection connection = ((ClusteredNetworkSession ) readSession ).connection ;
531+ assertTrue ( connection .isOpen () );
532+ readSession .close ();
533+ assertFalse ( connection .isOpen () );
534+ assertFalse (driver .connectionPool ().hasAddress (address ( 9002 ) ));
535+ writeSession .close ();
536+
537+ driver .close ();
538+
539+ // Finally
540+ assertThat ( server .exitStatus (), equalTo ( 0 ) );
541+ assertThat ( readServer .exitStatus (), equalTo ( 0 ) );
542+ assertThat ( writeServer1 .exitStatus (), equalTo ( 0 ) );
543+ assertThat ( writeServer2 .exitStatus (), equalTo ( 0 ) );
544+ }
545+
458546 String resource ( String fileName )
459547 {
460548 URL resource = ClusterDriverStubTest .class .getClassLoader ().getResource ( fileName );
0 commit comments