use of org.neo4j.causalclustering.discovery.CoreServerInfo in project neo4j by neo4j.
the class GetServersProcedureV1RoutingTest method shouldReturnEndpointsInDifferentOrders.
@Test
public void shouldReturnEndpointsInDifferentOrders() throws Exception {
// given
final CoreTopologyService coreTopologyService = mock(CoreTopologyService.class);
LeaderLocator leaderLocator = mock(LeaderLocator.class);
when(leaderLocator.getLeader()).thenReturn(member(0));
Map<MemberId, CoreServerInfo> coreMembers = new HashMap<>();
coreMembers.put(member(0), adressesForCore(0));
coreMembers.put(member(1), adressesForCore(1));
coreMembers.put(member(2), adressesForCore(2));
final CoreTopology clusterTopology = new CoreTopology(clusterId, false, coreMembers);
when(coreTopologyService.coreServers()).thenReturn(clusterTopology);
when(coreTopologyService.readReplicas()).thenReturn(new ReadReplicaTopology(emptyMap()));
final LegacyGetServersProcedure proc = new LegacyGetServersProcedure(coreTopologyService, leaderLocator, config, getInstance());
// when
Object[] endpoints = getEndpoints(proc);
//then
Object[] endpointsInDifferentOrder = getEndpoints(proc);
for (int i = 0; i < 100; i++) {
if (Arrays.deepEquals(endpointsInDifferentOrder, endpoints)) {
endpointsInDifferentOrder = getEndpoints(proc);
} else {
//Different order of servers, no need to retry.
break;
}
}
assertFalse(Arrays.deepEquals(endpoints, endpointsInDifferentOrder));
}
use of org.neo4j.causalclustering.discovery.CoreServerInfo in project neo4j by neo4j.
the class GetServersProcedureV1Test method shouldReturnNoWriteEndpointsIfThereIsNoAddressForTheLeader.
@Test
public void shouldReturnNoWriteEndpointsIfThereIsNoAddressForTheLeader() throws Exception {
// given
final CoreTopologyService topologyService = mock(CoreTopologyService.class);
Map<MemberId, CoreServerInfo> coreMembers = new HashMap<>();
coreMembers.put(member(0), adressesForCore(0));
when(topologyService.coreServers()).thenReturn(new CoreTopology(clusterId, false, coreMembers));
when(topologyService.readReplicas()).thenReturn(new ReadReplicaTopology(emptyMap()));
LeaderLocator leaderLocator = mock(LeaderLocator.class);
when(leaderLocator.getLeader()).thenReturn(member(1));
LegacyGetServersProcedure procedure = new LegacyGetServersProcedure(topologyService, leaderLocator, config, getInstance());
// when
ClusterView clusterView = run(procedure);
// then
ClusterView.Builder builder = new ClusterView.Builder();
builder.readAddress(adressesForCore(0).connectors().boltAddress());
builder.routeAddress(adressesForCore(0).connectors().boltAddress());
assertEquals(builder.build(), clusterView);
}
use of org.neo4j.causalclustering.discovery.CoreServerInfo in project neo4j by neo4j.
the class GetServersProcedureV1Test method shouldReturnNoWriteEndpointsIfThereIsNoLeader.
@Test
public void shouldReturnNoWriteEndpointsIfThereIsNoLeader() throws Exception {
// given
final CoreTopologyService topologyService = mock(CoreTopologyService.class);
Map<MemberId, CoreServerInfo> coreMembers = new HashMap<>();
coreMembers.put(member(0), adressesForCore(0));
when(topologyService.coreServers()).thenReturn(new CoreTopology(clusterId, false, coreMembers));
when(topologyService.readReplicas()).thenReturn(new ReadReplicaTopology(emptyMap()));
LeaderLocator leaderLocator = mock(LeaderLocator.class);
when(leaderLocator.getLeader()).thenThrow(new NoLeaderFoundException());
LegacyGetServersProcedure procedure = new LegacyGetServersProcedure(topologyService, leaderLocator, config, getInstance());
// when
ClusterView clusterView = run(procedure);
// then
ClusterView.Builder builder = new ClusterView.Builder();
builder.readAddress(adressesForCore(0).connectors().boltAddress());
builder.routeAddress(adressesForCore(0).connectors().boltAddress());
assertEquals(builder.build(), clusterView);
}
use of org.neo4j.causalclustering.discovery.CoreServerInfo in project neo4j by neo4j.
the class ConnectToRandomCoreServerStrategyTest method fakeCoreTopology.
static CoreTopology fakeCoreTopology(MemberId... memberIds) {
assert memberIds.length > 0;
ClusterId clusterId = new ClusterId(UUID.randomUUID());
Map<MemberId, CoreServerInfo> coreMembers = new HashMap<>();
int offset = 0;
for (MemberId memberId : memberIds) {
coreMembers.put(memberId, new CoreServerInfo(new AdvertisedSocketAddress("localhost", 5000 + offset), new AdvertisedSocketAddress("localhost", 6000 + offset), new ClientConnectorAddresses(singletonList(new ClientConnectorAddresses.ConnectorUri(ClientConnectorAddresses.Scheme.bolt, new AdvertisedSocketAddress("localhost", 7000 + offset)))), asSet("core")));
offset++;
}
return new CoreTopology(clusterId, false, coreMembers);
}
use of org.neo4j.causalclustering.discovery.CoreServerInfo in project neo4j by neo4j.
the class ServerPoliciesPlugin method readEndpoints.
private List<Endpoint> readEndpoints(CoreTopology coreTopology, ReadReplicaTopology rrTopology, Policy policy) {
Set<ServerInfo> possibleReaders = rrTopology.members().entrySet().stream().map(entry -> new ServerInfo(entry.getValue().connectors().boltAddress(), entry.getKey(), entry.getValue().groups())).collect(Collectors.toSet());
if (allowReadsOnFollowers || possibleReaders.size() == 0) {
Set<MemberId> validCores = coreTopology.members().keySet();
try {
MemberId leader = leaderLocator.getLeader();
validCores = validCores.stream().filter(memberId -> !memberId.equals(leader)).collect(Collectors.toSet());
} catch (NoLeaderFoundException ignored) {
// we might end up using the leader for reading during this ttl, should be fine in general
}
for (MemberId validCore : validCores) {
Optional<CoreServerInfo> coreServerInfo = coreTopology.find(validCore);
if (coreServerInfo.isPresent()) {
CoreServerInfo serverInfo = coreServerInfo.get();
possibleReaders.add(new ServerInfo(serverInfo.connectors().boltAddress(), validCore, serverInfo.groups()));
}
}
}
Set<ServerInfo> readers = policy.apply(possibleReaders);
return readers.stream().map(r -> Endpoint.read(r.boltAddress())).collect(Collectors.toList());
}
Aggregations