Skip to content

Commit 0812fab

Browse files
author
Zhen Li
committed
Added a stub test to verify that after a leader in a cluster is removed, the driver should be able to retry the tx on 1) writer no longer available error and 2) no writer available error.
1 parent 2b2181b commit 0812fab

File tree

2 files changed

+49
-0
lines changed

2 files changed

+49
-0
lines changed

driver/src/test/java/org/neo4j/driver/internal/RoutingDriverBoltKitTest.java

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -726,6 +726,35 @@ void shouldRetryWriteTransactionUntilSuccess() throws Exception
726726
}
727727
}
728728

729+
@Test
730+
void shouldRetryWriteTransactionUntilSuccessWithWhenLeaderIsRemoved() throws Exception
731+
{
732+
// This test simulates a router in a cluster that a leader is removed.
733+
// The router first returns a RT with a writer inside.
734+
// However this writer is killed while the driver is running a tx with it.
735+
// As a result, the writer server is removed from RT in the router's second reply.
736+
// Finally, the router will return a RT with a reachable writer.
737+
StubServer router = StubServer.start( "acquire_endpoints_v3_leader_killed.script", 9001 );
738+
StubServer brokenWriter = StubServer.start( "dead_write_server.script", 9004 );
739+
StubServer writer = StubServer.start( "write_server.script", 9008 );
740+
741+
try ( Driver driver = newDriverWithSleeplessClock( "bolt+routing://127.0.0.1:9001" );
742+
Session session = driver.session() )
743+
{
744+
AtomicInteger invocations = new AtomicInteger();
745+
List<Record> records = session.writeTransaction( queryWork( "CREATE (n {name:'Bob'})", invocations ) );
746+
747+
assertEquals( 0, records.size() );
748+
assertEquals( 2, invocations.get() );
749+
}
750+
finally
751+
{
752+
assertEquals( 0, router.exitStatus() );
753+
assertEquals( 0, brokenWriter.exitStatus() );
754+
assertEquals( 0, writer.exitStatus() );
755+
}
756+
}
757+
729758
@Test
730759
void shouldRetryReadTransactionUntilFailure() throws Exception
731760
{
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
!: BOLT 3
2+
!: AUTO RESET
3+
4+
C: HELLO {"scheme": "none", "user_agent": "neo4j-java/dev"}
5+
S: SUCCESS {"server": "Neo4j/9.9.9", "connection_id": "bolt-123456789"}
6+
C: RUN "CALL dbms.cluster.routing.getRoutingTable({context})" {"context": {}} {}
7+
PULL_ALL
8+
S: SUCCESS {"fields": ["ttl", "servers"]}
9+
RECORD [9223372036854775807, [{"addresses": ["127.0.0.1:9004"],"role": "WRITE"}, {"addresses": ["127.0.0.1:9005","127.0.0.1:9006"], "role": "READ"},{"addresses": ["127.0.0.1:9001"], "role": "ROUTE"}]]
10+
SUCCESS {}
11+
C: RUN "CALL dbms.cluster.routing.getRoutingTable({context})" {"context": {}} {}
12+
PULL_ALL
13+
S: SUCCESS {"fields": ["ttl", "servers"]}
14+
RECORD [9223372036854775807, [{"addresses": [],"role": "WRITE"}, {"addresses": ["127.0.0.1:9005","127.0.0.1:9006"], "role": "READ"},{"addresses": ["127.0.0.1:9001"], "role": "ROUTE"}]]
15+
SUCCESS {}
16+
C: RUN "CALL dbms.cluster.routing.getRoutingTable({context})" {"context": {}} {}
17+
PULL_ALL
18+
S: SUCCESS {"fields": ["ttl", "servers"]}
19+
RECORD [9223372036854775807, [{"addresses": ["127.0.0.1:9008"],"role": "WRITE"}, {"addresses": ["127.0.0.1:9005","127.0.0.1:9006"], "role": "READ"},{"addresses": ["127.0.0.1:9001"], "role": "ROUTE"}]]
20+
SUCCESS {}

0 commit comments

Comments
 (0)