use of com.trilead.ssh2.Session 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);
}
use of com.trilead.ssh2.Session in project neo4j by neo4j.
the class BoltCausalClusteringIT method shouldUseBookmarkFromAWriteSessionInAReadSession.
@Test
public void shouldUseBookmarkFromAWriteSessionInAReadSession() throws Throwable {
// given
cluster = clusterRule.withNumberOfReadReplicas(1).startCluster();
CoreClusterMember leader = cluster.awaitLeader();
ReadReplica readReplica = cluster.getReadReplicaById(0);
readReplica.txPollingClient().stop();
Driver driver = GraphDatabase.driver(leader.directURI(), 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.run("CREATE (p:Person {name: {name} })", Values.parameters("name", "Alistair"));
tx.run("CREATE (p:Person {name: {name} })", Values.parameters("name", "Mark"));
tx.run("CREATE (p:Person {name: {name} })", Values.parameters("name", "Chris"));
tx.success();
}
return session.lastBookmark();
});
assertNotNull(bookmark);
readReplica.txPollingClient().start();
driver = GraphDatabase.driver(readReplica.directURI(), AuthTokens.basic("neo4j", "neo4j"));
try (Session session = driver.session(AccessMode.READ)) {
try (Transaction tx = session.beginTransaction(bookmark)) {
Record record = tx.run("MATCH (n:Person) RETURN COUNT(*) AS count").next();
tx.success();
assertEquals(4, record.get("count").asInt());
}
}
}
use of com.trilead.ssh2.Session in project neo4j by neo4j.
the class BoltCausalClusteringIT method shouldHandleLeaderSwitch.
@Test
public void shouldHandleLeaderSwitch() throws Exception {
// given
cluster = clusterRule.startCluster();
CoreClusterMember leader = cluster.awaitLeader();
try (Driver driver = GraphDatabase.driver(leader.routingURI(), AuthTokens.basic("neo4j", "neo4j"))) {
// when
try (Session session = driver.session()) {
try (Transaction tx = session.beginTransaction()) {
switchLeader(leader);
tx.run("CREATE (person:Person {name: {name}, title: {title}})", parameters("name", "Webber", "title", "Mr"));
tx.success();
} catch (SessionExpiredException ignored) {
// expected
}
}
String bookmark = inExpirableSession(driver, Driver::session, s -> {
try (Transaction tx = s.beginTransaction()) {
tx.run("CREATE (person:Person {name: {name}, title: {title}})", parameters("name", "Webber", "title", "Mr"));
tx.success();
} catch (SessionExpiredException ignored) {
}
return s.lastBookmark();
});
// then
try (Session session = driver.session(AccessMode.READ)) {
try (Transaction tx = session.beginTransaction(bookmark)) {
Record record = tx.run("MATCH (n:Person) RETURN COUNT(*) AS count").next();
tx.success();
assertEquals(1, record.get("count").asInt());
}
}
}
}
use of com.trilead.ssh2.Session in project neo4j by neo4j.
the class BoltCausalClusteringIT method sessionShouldExpireOnFailingReadQuery.
@Test
public void sessionShouldExpireOnFailingReadQuery() throws Exception {
// given
cluster = clusterRule.withNumberOfReadReplicas(1).startCluster();
CoreClusterMember coreServer = cluster.getCoreMemberById(0);
Driver driver = GraphDatabase.driver(coreServer.routingURI(), AuthTokens.basic("neo4j", "neo4j"));
inExpirableSession(driver, Driver::session, (session) -> {
session.run("CREATE (p:Person {name: {name} })", Values.parameters("name", "Jim"));
return null;
});
try (Session readSession = driver.session(AccessMode.READ)) {
// when
connectedServer(readSession).shutdown();
// then
readSession.run("MATCH (n) RETURN n LIMIT 1").consume();
fail("Should have thrown an exception as the read replica went away mid query");
} catch (SessionExpiredException sep) {
// then
assertThat(sep.getMessage(), containsString("is no longer available"));
} finally {
driver.close();
}
}
use of com.trilead.ssh2.Session in project neo4j by neo4j.
the class BoltCausalClusteringIT method shouldNotBeAbleToWriteOnAReadSession.
@Test
public void shouldNotBeAbleToWriteOnAReadSession() throws Exception {
// given
cluster = clusterRule.withNumberOfReadReplicas(0).startCluster();
assertEventually("Failed to execute write query on read server", () -> {
switchLeader(cluster.awaitLeader());
CoreClusterMember leader = cluster.awaitLeader();
Driver driver = GraphDatabase.driver(leader.routingURI(), AuthTokens.basic("neo4j", "neo4j"));
try (Session session = driver.session(AccessMode.READ)) {
// when
session.run("CREATE (n:Person {name: 'Jim'})").consume();
return false;
} catch (ClientException ex) {
assertEquals("Write queries cannot be performed in READ access mode.", ex.getMessage());
return true;
} finally {
driver.close();
}
}, is(true), 30, SECONDS);
}
Aggregations