Search in sources :

Example 1 with RoutingNetworkSession

use of org.neo4j.driver.internal.RoutingNetworkSession in project neo4j by neo4j.

the class BoltCausalClusteringIT method shouldSendRequestsToNewlyAddedReadReplicas.

@Test
public void shouldSendRequestsToNewlyAddedReadReplicas() throws Throwable {
    // given
    cluster = clusterRule.withNumberOfReadReplicas(1).withSharedCoreParams(stringMap(CausalClusteringSettings.cluster_routing_ttl.name(), "1s")).startCluster();
    CoreClusterMember leader = cluster.awaitLeader();
    Driver driver = GraphDatabase.driver(leader.routingURI(), AuthTokens.basic("neo4j", "neo4j"));
    String bookmark = inExpirableSession(driver, (d) -> d.session(AccessMode.WRITE), (session) -> {
        try (Transaction tx = session.beginTransaction()) {
            tx.run("CREATE (p:Person {name: {name} })", Values.parameters("name", "Jim"));
            tx.success();
        }
        return session.lastBookmark();
    });
    // when
    Set<String> readReplicas = new HashSet<>();
    for (ReadReplica readReplica : cluster.readReplicas()) {
        readReplicas.add(readReplica.boltAdvertisedAddress());
    }
    for (int i = 10; i <= 13; i++) {
        ReadReplica newReadReplica = cluster.addReadReplicaWithId(i);
        readReplicas.add(newReadReplica.boltAdvertisedAddress());
        newReadReplica.start();
    }
    assertEventually("Failed to send requests to all servers", () -> {
        for (// don't care about cores
        int i = 0; // don't care about cores
        i < cluster.readReplicas().size(); // don't care about cores
        i++) {
            try (Session session = driver.session(AccessMode.READ)) {
                BoltServerAddress boltServerAddress = ((RoutingNetworkSession) session).address();
                executeReadQuery(bookmark, session);
                readReplicas.remove(boltServerAddress.toString());
            } catch (Throwable throwable) {
                return false;
            }
        }
        // have sent something to all replicas
        return readReplicas.size() == 0;
    }, is(true), 30, SECONDS);
}
Also used : ReadReplica(org.neo4j.causalclustering.discovery.ReadReplica) Transaction(org.neo4j.driver.v1.Transaction) CoreClusterMember(org.neo4j.causalclustering.discovery.CoreClusterMember) Driver(org.neo4j.driver.v1.Driver) CoreMatchers.containsString(org.hamcrest.CoreMatchers.containsString) RoutingNetworkSession(org.neo4j.driver.internal.RoutingNetworkSession) HashSet(java.util.HashSet) Session(org.neo4j.driver.v1.Session) RoutingNetworkSession(org.neo4j.driver.internal.RoutingNetworkSession) BoltServerAddress(org.neo4j.driver.internal.net.BoltServerAddress) Test(org.junit.Test)

Example 2 with RoutingNetworkSession

use of org.neo4j.driver.internal.RoutingNetworkSession in project neo4j by neo4j.

the class BoltCausalClusteringIT method shouldPickANewServerToWriteToOnLeaderSwitch.

@Test
public void shouldPickANewServerToWriteToOnLeaderSwitch() throws Throwable {
    // given
    cluster = clusterRule.withNumberOfReadReplicas(0).startCluster();
    CoreClusterMember leader = cluster.awaitLeader();
    LeaderSwitcher leaderSwitcher = new LeaderSwitcher(cluster);
    Config config = Config.build().withLogging(new JULogging(Level.OFF)).toConfig();
    Set<BoltServerAddress> seenAddresses = new HashSet<>();
    try (Driver driver = GraphDatabase.driver(leader.routingURI(), AuthTokens.basic("neo4j", "neo4j"), config)) {
        boolean success = false;
        long deadline = System.currentTimeMillis() + (30 * 1000);
        while (!success) {
            if (System.currentTimeMillis() > deadline) {
                fail("Failed to write to the new leader in time. Addresses seen: " + seenAddresses);
            }
            try (Session session = driver.session(AccessMode.WRITE)) {
                BoltServerAddress boltServerAddress = ((RoutingNetworkSession) session).address();
                session.run("CREATE (p:Person)");
                seenAddresses.add(boltServerAddress);
                success = seenAddresses.size() >= 2;
            } catch (Exception e) {
                Thread.sleep(100);
            }
            /*
                 * Having the latch release here ensures that we've done at least one pass through the loop, which means
                 * we've completed a connection before the forced master switch.
                 */
            if (seenAddresses.size() >= 1) {
                leaderSwitcher.start();
            }
        }
    } finally {
        leaderSwitcher.stop();
        assertTrue(leaderSwitcher.hadLeaderSwitch());
        assertThat(seenAddresses.size(), greaterThanOrEqualTo(2));
    }
}
Also used : CoreClusterMember(org.neo4j.causalclustering.discovery.CoreClusterMember) Config(org.neo4j.driver.v1.Config) Driver(org.neo4j.driver.v1.Driver) TimeoutException(java.util.concurrent.TimeoutException) SessionExpiredException(org.neo4j.driver.v1.exceptions.SessionExpiredException) ServiceUnavailableException(org.neo4j.driver.v1.exceptions.ServiceUnavailableException) IOException(java.io.IOException) ClientException(org.neo4j.driver.v1.exceptions.ClientException) BoltServerAddress(org.neo4j.driver.internal.net.BoltServerAddress) RoutingNetworkSession(org.neo4j.driver.internal.RoutingNetworkSession) JULogging(org.neo4j.driver.internal.logging.JULogging) HashSet(java.util.HashSet) Session(org.neo4j.driver.v1.Session) RoutingNetworkSession(org.neo4j.driver.internal.RoutingNetworkSession) Test(org.junit.Test)

Aggregations

HashSet (java.util.HashSet)2 Test (org.junit.Test)2 CoreClusterMember (org.neo4j.causalclustering.discovery.CoreClusterMember)2 RoutingNetworkSession (org.neo4j.driver.internal.RoutingNetworkSession)2 BoltServerAddress (org.neo4j.driver.internal.net.BoltServerAddress)2 Driver (org.neo4j.driver.v1.Driver)2 Session (org.neo4j.driver.v1.Session)2 IOException (java.io.IOException)1 TimeoutException (java.util.concurrent.TimeoutException)1 CoreMatchers.containsString (org.hamcrest.CoreMatchers.containsString)1 ReadReplica (org.neo4j.causalclustering.discovery.ReadReplica)1 JULogging (org.neo4j.driver.internal.logging.JULogging)1 Config (org.neo4j.driver.v1.Config)1 Transaction (org.neo4j.driver.v1.Transaction)1 ClientException (org.neo4j.driver.v1.exceptions.ClientException)1 ServiceUnavailableException (org.neo4j.driver.v1.exceptions.ServiceUnavailableException)1 SessionExpiredException (org.neo4j.driver.v1.exceptions.SessionExpiredException)1