use of org.neo4j.cluster.protocol.cluster.Cluster in project neo4j by neo4j.
the class MultiPaxosTest method testFailure.
@Test
public void testFailure() throws Exception {
ScriptableNetworkFailureLatencyStrategy networkLatency = new ScriptableNetworkFailureLatencyStrategy();
NetworkMock network = new NetworkMock(NullLogService.getInstance(), new Monitors(), 50, new MultipleFailureLatencyStrategy(networkLatency), new MessageTimeoutStrategy(new FixedTimeoutStrategy(1000)));
List<TestProtocolServer> nodes = new ArrayList<TestProtocolServer>();
TestProtocolServer server = network.addServer(1, URI.create("cluster://server1"));
server.newClient(Cluster.class).create("default");
network.tickUntilDone();
nodes.add(server);
for (int i = 1; i < 3; i++) {
TestProtocolServer protocolServer = network.addServer(i + 1, new URI("cluster://server" + (i + 1)));
protocolServer.newClient(Cluster.class).join("default", new URI("cluster://server1"));
network.tick(10);
nodes.add(protocolServer);
}
final AtomicBroadcast atomicBroadcast = nodes.get(0).newClient(AtomicBroadcast.class);
ObjectStreamFactory objectStreamFactory = new ObjectStreamFactory();
final AtomicBroadcastSerializer serializer = new AtomicBroadcastSerializer(objectStreamFactory, objectStreamFactory);
atomicBroadcast.broadcast(serializer.broadcast(new DaPayload()));
networkLatency.nodeIsDown("cluster://server2");
networkLatency.nodeIsDown("cluster://server3");
atomicBroadcast.broadcast(serializer.broadcast(new DaPayload()));
network.tick(100);
networkLatency.nodeIsUp("cluster://server3");
network.tick(1000);
for (TestProtocolServer node : nodes) {
node.newClient(Cluster.class).leave();
network.tick(10);
}
}
use of org.neo4j.cluster.protocol.cluster.Cluster in project neo4j by neo4j.
the class MultiPaxosServerFactory method constructSupportingInfrastructureFor.
/**
* Sets up the supporting infrastructure and communication hooks for our state machines. This is here to support
* an external requirement for assembling protocol servers given an existing set of state machines (used to prove
* correctness).
*/
public ProtocolServer constructSupportingInfrastructureFor(InstanceId me, MessageSource input, MessageSender output, DelayedDirectExecutor executor, Timeouts timeouts, Executor stateMachineExecutor, final MultiPaxosContext context, StateMachine[] machines) {
StateMachines stateMachines = new StateMachines(logging, stateMachinesMonitor, input, output, timeouts, executor, stateMachineExecutor, me);
for (StateMachine machine : machines) {
stateMachines.addStateMachine(machine);
}
final ProtocolServer server = new ProtocolServer(me, stateMachines, logging);
server.addBindingListener(new BindingListener() {
@Override
public void listeningAt(URI me) {
context.getClusterContext().setBoundAt(me);
}
});
stateMachines.addMessageProcessor(new HeartbeatRefreshProcessor(stateMachines.getOutgoing(), context.getClusterContext()));
input.addMessageProcessor(new HeartbeatIAmAliveProcessor(stateMachines.getOutgoing(), context.getClusterContext()));
Cluster cluster = server.newClient(Cluster.class);
cluster.addClusterListener(new HeartbeatJoinListener(stateMachines.getOutgoing()));
cluster.addClusterListener(new HeartbeatLeftListener(context.getHeartbeatContext(), logging));
context.getHeartbeatContext().addHeartbeatListener(new HeartbeatReelectionListener(server.newClient(Election.class), logging));
context.getClusterContext().addClusterListener(new ClusterLeaveReelectionListener(server.newClient(Election.class), logging));
StateMachineRules rules = new StateMachineRules(stateMachines.getOutgoing()).rule(ClusterState.start, ClusterMessage.create, ClusterState.entered, internal(AtomicBroadcastMessage.entered), internal(ProposerMessage.join), internal(AcceptorMessage.join), internal(LearnerMessage.join), internal(HeartbeatMessage.join), internal(ElectionMessage.created), internal(SnapshotMessage.join)).rule(ClusterState.discovery, ClusterMessage.configurationResponse, ClusterState.joining, internal(AcceptorMessage.join), internal(LearnerMessage.join), internal(AtomicBroadcastMessage.join)).rule(ClusterState.discovery, ClusterMessage.configurationResponse, ClusterState.entered, internal(AtomicBroadcastMessage.entered), internal(ProposerMessage.join), internal(AcceptorMessage.join), internal(LearnerMessage.join), internal(HeartbeatMessage.join), internal(ElectionMessage.join), internal(SnapshotMessage.join)).rule(ClusterState.joining, ClusterMessage.configurationChanged, ClusterState.entered, internal(AtomicBroadcastMessage.entered), internal(ProposerMessage.join), internal(AcceptorMessage.join), internal(LearnerMessage.join), internal(HeartbeatMessage.join), internal(ElectionMessage.join), internal(SnapshotMessage.join)).rule(ClusterState.joining, ClusterMessage.joinFailure, ClusterState.start, internal(AtomicBroadcastMessage.leave), internal(AcceptorMessage.leave), internal(LearnerMessage.leave), internal(ProposerMessage.leave)).rule(ClusterState.entered, ClusterMessage.leave, ClusterState.start, internal(AtomicBroadcastMessage.leave), internal(AcceptorMessage.leave), internal(LearnerMessage.leave), internal(HeartbeatMessage.leave), internal(SnapshotMessage.leave), internal(ElectionMessage.leave), internal(ProposerMessage.leave)).rule(ClusterState.entered, ClusterMessage.leave, ClusterState.start, internal(AtomicBroadcastMessage.leave), internal(AcceptorMessage.leave), internal(LearnerMessage.leave), internal(HeartbeatMessage.leave), internal(ElectionMessage.leave), internal(SnapshotMessage.leave), internal(ProposerMessage.leave)).rule(ClusterState.leaving, ClusterMessage.configurationChanged, ClusterState.start, internal(AtomicBroadcastMessage.leave), internal(AcceptorMessage.leave), internal(LearnerMessage.leave), internal(HeartbeatMessage.leave), internal(ElectionMessage.leave), internal(SnapshotMessage.leave), internal(ProposerMessage.leave)).rule(ClusterState.leaving, ClusterMessage.leaveTimedout, ClusterState.start, internal(AtomicBroadcastMessage.leave), internal(AcceptorMessage.leave), internal(LearnerMessage.leave), internal(HeartbeatMessage.leave), internal(ElectionMessage.leave), internal(SnapshotMessage.leave), internal(ProposerMessage.leave));
stateMachines.addStateTransitionListener(rules);
return server;
}
use of org.neo4j.cluster.protocol.cluster.Cluster in project neo4j by neo4j.
the class HighAvailabilitySlavesTest method shouldRegisterItselfOnMonitors.
@Test
public void shouldRegisterItselfOnMonitors() {
// given
ClusterMembers clusterMembers = mock(ClusterMembers.class);
Cluster cluster = mock(Cluster.class);
SlaveFactory slaveFactory = mock(SlaveFactory.class);
// when
new HighAvailabilitySlaves(clusterMembers, cluster, slaveFactory, new HostnamePort(null, 0)).init();
// then
verify(cluster).addClusterListener(any(ClusterListener.class));
}
use of org.neo4j.cluster.protocol.cluster.Cluster in project neo4j by neo4j.
the class HighAvailabilitySlavesTest method shouldReturnAvailableAndAliveSlaves.
@Test
public void shouldReturnAvailableAndAliveSlaves() {
// given
Cluster cluster = mock(Cluster.class);
ClusterMembers clusterMembers = mock(ClusterMembers.class);
when(clusterMembers.getAliveMembers()).thenReturn(Iterables.option(new ClusterMember(INSTANCE_ID).availableAs(SLAVE, HA_URI, StoreId.DEFAULT)));
SlaveFactory slaveFactory = mock(SlaveFactory.class);
when(slaveFactory.newSlave(any(LifeSupport.class), any(ClusterMember.class), any(String.class), any(Integer.class))).thenReturn(mock(Slave.class));
HighAvailabilitySlaves slaves = new HighAvailabilitySlaves(clusterMembers, cluster, slaveFactory, new HostnamePort(null, 0));
slaves.init();
// when
Iterable<Slave> memberSlaves = slaves.getSlaves();
// then
assertThat(count(memberSlaves), equalTo(1L));
}
use of org.neo4j.cluster.protocol.cluster.Cluster in project neo4j by neo4j.
the class HighAvailabilitySlavesTest method shouldClearSlavesWhenNewMasterElected.
@Test
public void shouldClearSlavesWhenNewMasterElected() {
// given
Cluster cluster = mock(Cluster.class);
ClusterMembers clusterMembers = mock(ClusterMembers.class);
when(clusterMembers.getAliveMembers()).thenReturn(Iterables.option(new ClusterMember(INSTANCE_ID).availableAs(SLAVE, HA_URI, StoreId.DEFAULT)));
SlaveFactory slaveFactory = mock(SlaveFactory.class);
when(slaveFactory.newSlave(any(LifeSupport.class), any(ClusterMember.class), any(String.class), any(Integer.class))).thenReturn(mock(Slave.class), mock(Slave.class));
HighAvailabilitySlaves slaves = new HighAvailabilitySlaves(clusterMembers, cluster, slaveFactory, new HostnamePort(null, 0));
slaves.init();
ArgumentCaptor<ClusterListener> listener = ArgumentCaptor.forClass(ClusterListener.class);
verify(cluster).addClusterListener(listener.capture());
// when
Slave slave1 = slaves.getSlaves().iterator().next();
listener.getValue().elected(ClusterConfiguration.COORDINATOR, INSTANCE_ID, CLUSTER_URI);
Slave slave2 = slaves.getSlaves().iterator().next();
// then
assertThat(slave2, not(sameInstance(slave1)));
}
Aggregations