36
36
37
37
import org .neo4j .driver .internal .logging .ConsoleLogging ;
38
38
import org .neo4j .driver .internal .net .BoltServerAddress ;
39
+ import org .neo4j .driver .internal .spi .Connection ;
39
40
import org .neo4j .driver .v1 .AccessMode ;
40
41
import org .neo4j .driver .v1 .Config ;
41
42
import org .neo4j .driver .v1 .GraphDatabase ;
46
47
import org .neo4j .driver .v1 .util .Function ;
47
48
import org .neo4j .driver .v1 .util .StubServer ;
48
49
50
+ import static org .hamcrest .Matchers .contains ;
49
51
import static org .hamcrest .Matchers .containsInAnyOrder ;
50
52
import static org .hamcrest .Matchers .hasItem ;
51
53
import static org .hamcrest .Matchers .hasSize ;
@@ -338,7 +340,7 @@ public void shouldRediscoverIfNecessaryOnSessionAcquisition()
338
340
339
341
URI uri = URI .create ( "bolt+routing://127.0.0.1:9001" );
340
342
//START a read server
341
- StubServer .start ( resource ( "read_server .script" ), 9005 );
343
+ StubServer read = StubServer .start ( resource ( "empty .script" ), 9005 );
342
344
343
345
//On creation we only find ourselves
344
346
ClusterDriver driver = (ClusterDriver ) GraphDatabase .driver ( uri , config );
@@ -356,6 +358,7 @@ public void shouldRediscoverIfNecessaryOnSessionAcquisition()
356
358
357
359
// Finally
358
360
assertThat ( server .exitStatus (), equalTo ( 0 ) );
361
+ assertThat ( read .exitStatus (), equalTo ( 0 ) );
359
362
}
360
363
361
364
@ Test
@@ -366,7 +369,7 @@ public void shouldOnlyGetServersOnce() throws IOException, InterruptedException,
366
369
367
370
URI uri = URI .create ( "bolt+routing://127.0.0.1:9001" );
368
371
//START a read server
369
- StubServer .start ( resource ( "read_server .script" ), 9005 );
372
+ StubServer read = StubServer .start ( resource ( "empty .script" ), 9005 );
370
373
371
374
//On creation we only find ourselves
372
375
final ClusterDriver driver = (ClusterDriver ) GraphDatabase .driver ( uri , config );
@@ -397,6 +400,7 @@ public void run()
397
400
398
401
// Finally
399
402
assertThat ( server .exitStatus (), equalTo ( 0 ) );
403
+ assertThat ( read .exitStatus (), equalTo ( 0 ) );
400
404
}
401
405
402
406
@ Test
@@ -455,6 +459,90 @@ public void shouldHandleLeaderSwitchWhenWriting()
455
459
assertThat ( server .exitStatus (), equalTo ( 0 ) );
456
460
}
457
461
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
+
458
546
String resource ( String fileName )
459
547
{
460
548
URL resource = ClusterDriverStubTest .class .getClassLoader ().getResource ( fileName );
0 commit comments