Search in sources :

Example 1 with AccessMode

use of org.neo4j.driver.v1.AccessMode in project neo4j by neo4j.

the class BoltCausalClusteringIT method shouldReadAndWriteToANewSessionCreatedAfterALeaderSwitch.

/*
       Create a session with empty arg list (no AccessMode arg), in a driver that was initialized with a bolt+routing
       URI, and ensure that it
       a) works against the Leader for reads and writes before a leader switch, and
       b) receives a SESSION EXPIRED after a leader switch, and
       c) keeps working if a new session is created after that exception, again with no access mode specified.
     */
@Test
public void shouldReadAndWriteToANewSessionCreatedAfterALeaderSwitch() throws Exception {
    // given
    cluster = clusterRule.withNumberOfReadReplicas(1).startCluster();
    CoreClusterMember leader = cluster.awaitLeader();
    try (Driver driver = GraphDatabase.driver(leader.routingURI(), AuthTokens.basic("neo4j", "neo4j"))) {
        inExpirableSession(driver, Driver::session, (session) -> {
            // execute a write/read query
            session.run("CREATE (p:Person {name: {name} })", Values.parameters("name", "Jim"));
            Record record = session.run("MATCH (n:Person) RETURN COUNT(*) AS count").next();
            assertEquals(1, record.get("count").asInt());
            try {
                switchLeader(leader);
                session.run("CREATE (p:Person {name: {name} })").consume();
                fail("Should have thrown an exception as the leader went away mid session");
            } catch (SessionExpiredException sep) {
                // then
                assertEquals(String.format("Server at %s no longer accepts writes", leader.boltAdvertisedAddress()), sep.getMessage());
            } catch (InterruptedException e) {
            // ignored
            }
            return null;
        });
        inExpirableSession(driver, Driver::session, (session) -> {
            // execute a write/read query
            session.run("CREATE (p:Person {name: {name} })", Values.parameters("name", "Jim"));
            Record record = session.run("MATCH (n:Person) RETURN COUNT(*) AS count").next();
            assertEquals(2, record.get("count").asInt());
            return null;
        });
    }
}
Also used : CoreClusterMember(org.neo4j.causalclustering.discovery.CoreClusterMember) Driver(org.neo4j.driver.v1.Driver) Record(org.neo4j.driver.v1.Record) SessionExpiredException(org.neo4j.driver.v1.exceptions.SessionExpiredException) Test(org.junit.Test)

Aggregations

Test (org.junit.Test)1 CoreClusterMember (org.neo4j.causalclustering.discovery.CoreClusterMember)1 Driver (org.neo4j.driver.v1.Driver)1 Record (org.neo4j.driver.v1.Record)1 SessionExpiredException (org.neo4j.driver.v1.exceptions.SessionExpiredException)1