use of io.atomix.cluster.protocol.HeartbeatMembershipProtocol in project atomix by atomix.
the class DefaultClusterMembershipServiceTest method testClusterService.
@Test
public void testClusterService() throws Exception {
TestMessagingServiceFactory messagingServiceFactory = new TestMessagingServiceFactory();
TestUnicastServiceFactory unicastServiceFactory = new TestUnicastServiceFactory();
TestBroadcastServiceFactory broadcastServiceFactory = new TestBroadcastServiceFactory();
Collection<Node> bootstrapLocations = buildBootstrapNodes(3);
Member localMember1 = buildMember(1);
BootstrapService bootstrapService1 = new TestBootstrapService(messagingServiceFactory.newMessagingService(localMember1.address()).start().join(), unicastServiceFactory.newUnicastService(localMember1.address()).start().join(), broadcastServiceFactory.newBroadcastService().start().join());
ManagedClusterMembershipService clusterService1 = new DefaultClusterMembershipService(localMember1, Version.from("1.0.0"), new DefaultNodeDiscoveryService(bootstrapService1, localMember1, new BootstrapDiscoveryProvider(bootstrapLocations)), bootstrapService1, new HeartbeatMembershipProtocol(new HeartbeatMembershipProtocolConfig().setFailureTimeout(Duration.ofSeconds(2))));
Member localMember2 = buildMember(2);
BootstrapService bootstrapService2 = new TestBootstrapService(messagingServiceFactory.newMessagingService(localMember2.address()).start().join(), unicastServiceFactory.newUnicastService(localMember2.address()).start().join(), broadcastServiceFactory.newBroadcastService().start().join());
ManagedClusterMembershipService clusterService2 = new DefaultClusterMembershipService(localMember2, Version.from("1.0.0"), new DefaultNodeDiscoveryService(bootstrapService2, localMember2, new BootstrapDiscoveryProvider(bootstrapLocations)), bootstrapService2, new HeartbeatMembershipProtocol(new HeartbeatMembershipProtocolConfig().setFailureTimeout(Duration.ofSeconds(2))));
Member localMember3 = buildMember(3);
BootstrapService bootstrapService3 = new TestBootstrapService(messagingServiceFactory.newMessagingService(localMember3.address()).start().join(), unicastServiceFactory.newUnicastService(localMember3.address()).start().join(), broadcastServiceFactory.newBroadcastService().start().join());
ManagedClusterMembershipService clusterService3 = new DefaultClusterMembershipService(localMember3, Version.from("1.0.1"), new DefaultNodeDiscoveryService(bootstrapService3, localMember3, new BootstrapDiscoveryProvider(bootstrapLocations)), bootstrapService3, new HeartbeatMembershipProtocol(new HeartbeatMembershipProtocolConfig().setFailureTimeout(Duration.ofSeconds(2))));
assertNull(clusterService1.getMember(MemberId.from("1")));
assertNull(clusterService1.getMember(MemberId.from("2")));
assertNull(clusterService1.getMember(MemberId.from("3")));
CompletableFuture.allOf(new CompletableFuture[] { clusterService1.start(), clusterService2.start(), clusterService3.start() }).join();
Thread.sleep(5000);
assertEquals(3, clusterService1.getMembers().size());
assertEquals(3, clusterService2.getMembers().size());
assertEquals(3, clusterService3.getMembers().size());
assertTrue(clusterService1.getLocalMember().isActive());
assertTrue(clusterService1.getMember(MemberId.from("1")).isActive());
assertTrue(clusterService1.getMember(MemberId.from("2")).isActive());
assertTrue(clusterService1.getMember(MemberId.from("3")).isActive());
assertEquals("1.0.0", clusterService1.getMember("1").version().toString());
assertEquals("1.0.0", clusterService1.getMember("2").version().toString());
assertEquals("1.0.1", clusterService1.getMember("3").version().toString());
Member anonymousMember = buildMember(4);
BootstrapService ephemeralBootstrapService = new TestBootstrapService(messagingServiceFactory.newMessagingService(anonymousMember.address()).start().join(), unicastServiceFactory.newUnicastService(anonymousMember.address()).start().join(), broadcastServiceFactory.newBroadcastService().start().join());
ManagedClusterMembershipService ephemeralClusterService = new DefaultClusterMembershipService(anonymousMember, Version.from("1.1.0"), new DefaultNodeDiscoveryService(ephemeralBootstrapService, anonymousMember, new BootstrapDiscoveryProvider(bootstrapLocations)), ephemeralBootstrapService, new HeartbeatMembershipProtocol(new HeartbeatMembershipProtocolConfig().setFailureTimeout(Duration.ofSeconds(2))));
assertFalse(ephemeralClusterService.getLocalMember().isActive());
assertNull(ephemeralClusterService.getMember(MemberId.from("1")));
assertNull(ephemeralClusterService.getMember(MemberId.from("2")));
assertNull(ephemeralClusterService.getMember(MemberId.from("3")));
assertNull(ephemeralClusterService.getMember(MemberId.from("4")));
assertNull(ephemeralClusterService.getMember(MemberId.from("5")));
ephemeralClusterService.start().join();
Thread.sleep(1000);
assertEquals(4, clusterService1.getMembers().size());
assertEquals(4, clusterService2.getMembers().size());
assertEquals(4, clusterService3.getMembers().size());
assertEquals(4, ephemeralClusterService.getMembers().size());
assertEquals("1.0.0", clusterService1.getMember("1").version().toString());
assertEquals("1.0.0", clusterService1.getMember("2").version().toString());
assertEquals("1.0.1", clusterService1.getMember("3").version().toString());
assertEquals("1.1.0", clusterService1.getMember("4").version().toString());
clusterService1.stop().join();
Thread.sleep(5000);
assertEquals(3, clusterService2.getMembers().size());
assertNull(clusterService2.getMember(MemberId.from("1")));
assertTrue(clusterService2.getMember(MemberId.from("2")).isActive());
assertTrue(clusterService2.getMember(MemberId.from("3")).isActive());
assertTrue(clusterService2.getMember(MemberId.from("4")).isActive());
ephemeralClusterService.stop().join();
Thread.sleep(5000);
assertEquals(2, clusterService2.getMembers().size());
assertNull(clusterService2.getMember(MemberId.from("1")));
assertTrue(clusterService2.getMember(MemberId.from("2")).isActive());
assertTrue(clusterService2.getMember(MemberId.from("3")).isActive());
assertNull(clusterService2.getMember(MemberId.from("4")));
Thread.sleep(2500);
assertEquals(2, clusterService2.getMembers().size());
assertNull(clusterService2.getMember(MemberId.from("1")));
assertTrue(clusterService2.getMember(MemberId.from("2")).isActive());
assertTrue(clusterService2.getMember(MemberId.from("3")).isActive());
assertNull(clusterService2.getMember(MemberId.from("4")));
TestClusterMembershipEventListener eventListener = new TestClusterMembershipEventListener();
clusterService2.addListener(eventListener);
ClusterMembershipEvent event;
clusterService3.getLocalMember().properties().put("foo", "bar");
event = eventListener.nextEvent();
assertEquals(ClusterMembershipEvent.Type.METADATA_CHANGED, event.type());
assertEquals("bar", event.subject().properties().get("foo"));
clusterService3.getLocalMember().properties().put("foo", "baz");
event = eventListener.nextEvent();
assertEquals(ClusterMembershipEvent.Type.METADATA_CHANGED, event.type());
assertEquals("baz", event.subject().properties().get("foo"));
CompletableFuture.allOf(new CompletableFuture[] { clusterService1.stop(), clusterService2.stop(), clusterService3.stop() }).join();
}
use of io.atomix.cluster.protocol.HeartbeatMembershipProtocol in project atomix by atomix.
the class RaftPerformanceTest method createServer.
/**
* Creates a Raft server.
*/
private RaftServer createServer(Member member, List<Node> members) {
RaftServerProtocol protocol;
ManagedMessagingService messagingService;
if (USE_NETTY) {
messagingService = (ManagedMessagingService) new NettyMessagingService("test", member.address(), new MessagingConfig()).start().join();
messagingServices.add(messagingService);
protocol = new RaftServerMessagingProtocol(messagingService, PROTOCOL_SERIALIZER, addressMap::get);
} else {
protocol = protocolFactory.newServerProtocol(member.id());
}
BootstrapService bootstrapService = new BootstrapService() {
@Override
public MessagingService getMessagingService() {
return messagingService;
}
@Override
public UnicastService getUnicastService() {
return new UnicastServiceAdapter();
}
@Override
public BroadcastService getBroadcastService() {
return new BroadcastServiceAdapter();
}
};
RaftServer.Builder builder = RaftServer.builder(member.id()).withProtocol(protocol).withThreadModel(ThreadModel.SHARED_THREAD_POOL).withMembershipService(new DefaultClusterMembershipService(member, Version.from("1.0.0"), new DefaultNodeDiscoveryService(bootstrapService, member, new BootstrapDiscoveryProvider(members)), bootstrapService, new HeartbeatMembershipProtocol(new HeartbeatMembershipProtocolConfig()))).withStorage(RaftStorage.builder().withStorageLevel(StorageLevel.DISK).withDirectory(new File(String.format("target/perf-logs/%s", member.id()))).withNamespace(STORAGE_NAMESPACE).withMaxSegmentSize(1024 * 1024 * 64).withDynamicCompaction().withFlushOnCommit(false).build());
RaftServer server = builder.build();
servers.add(server);
return server;
}
use of io.atomix.cluster.protocol.HeartbeatMembershipProtocol in project atomix by atomix.
the class DefaultClusterEventServiceTest method testClusterEventService.
@Test
public void testClusterEventService() throws Exception {
TestMessagingServiceFactory messagingServiceFactory = new TestMessagingServiceFactory();
TestUnicastServiceFactory unicastServiceFactory = new TestUnicastServiceFactory();
TestBroadcastServiceFactory broadcastServiceFactory = new TestBroadcastServiceFactory();
Collection<Node> bootstrapLocations = buildBootstrapNodes(3);
Member localMember1 = buildNode(1);
MessagingService messagingService1 = messagingServiceFactory.newMessagingService(localMember1.address()).start().join();
BootstrapService bootstrapService1 = new TestBootstrapService(messagingService1, unicastServiceFactory.newUnicastService(localMember1.address()).start().join(), broadcastServiceFactory.newBroadcastService().start().join());
ManagedClusterMembershipService clusterService1 = new DefaultClusterMembershipService(localMember1, Version.from("1.0.0"), new DefaultNodeDiscoveryService(bootstrapService1, localMember1, new BootstrapDiscoveryProvider(bootstrapLocations)), bootstrapService1, new HeartbeatMembershipProtocol(new HeartbeatMembershipProtocolConfig()));
ClusterMembershipService clusterMembershipService1 = clusterService1.start().join();
ManagedClusterEventService clusterEventingService1 = new DefaultClusterEventService(clusterMembershipService1, messagingService1);
ClusterEventService eventService1 = clusterEventingService1.start().join();
Member localMember2 = buildNode(2);
MessagingService messagingService2 = messagingServiceFactory.newMessagingService(localMember2.address()).start().join();
BootstrapService bootstrapService2 = new TestBootstrapService(messagingService2, unicastServiceFactory.newUnicastService(localMember2.address()).start().join(), broadcastServiceFactory.newBroadcastService().start().join());
ManagedClusterMembershipService clusterService2 = new DefaultClusterMembershipService(localMember2, Version.from("1.0.0"), new DefaultNodeDiscoveryService(bootstrapService2, localMember2, new BootstrapDiscoveryProvider(bootstrapLocations)), bootstrapService2, new HeartbeatMembershipProtocol(new HeartbeatMembershipProtocolConfig()));
ClusterMembershipService clusterMembershipService2 = clusterService2.start().join();
ManagedClusterEventService clusterEventingService2 = new DefaultClusterEventService(clusterMembershipService2, messagingService2);
ClusterEventService eventService2 = clusterEventingService2.start().join();
Member localMember3 = buildNode(3);
MessagingService messagingService3 = messagingServiceFactory.newMessagingService(localMember3.address()).start().join();
BootstrapService bootstrapService3 = new TestBootstrapService(messagingService3, unicastServiceFactory.newUnicastService(localMember1.address()).start().join(), broadcastServiceFactory.newBroadcastService().start().join());
ManagedClusterMembershipService clusterService3 = new DefaultClusterMembershipService(localMember3, Version.from("1.0.0"), new DefaultNodeDiscoveryService(bootstrapService3, localMember3, new BootstrapDiscoveryProvider(bootstrapLocations)), bootstrapService3, new HeartbeatMembershipProtocol(new HeartbeatMembershipProtocolConfig()));
ClusterMembershipService clusterMembershipService3 = clusterService3.start().join();
ManagedClusterEventService clusterEventingService3 = new DefaultClusterEventService(clusterMembershipService3, messagingService3);
ClusterEventService eventService3 = clusterEventingService3.start().join();
Thread.sleep(100);
Set<Integer> events = new CopyOnWriteArraySet<>();
eventService1.<String>subscribe("test1", SERIALIZER::decode, message -> {
assertEquals("Hello world!", message);
events.add(1);
}, MoreExecutors.directExecutor()).join();
eventService2.<String>subscribe("test1", SERIALIZER::decode, message -> {
assertEquals("Hello world!", message);
events.add(2);
}, MoreExecutors.directExecutor()).join();
eventService2.<String>subscribe("test1", SERIALIZER::decode, message -> {
assertEquals("Hello world!", message);
events.add(3);
}, MoreExecutors.directExecutor()).join();
eventService3.broadcast("test1", "Hello world!", SERIALIZER::encode);
Thread.sleep(100);
assertEquals(3, events.size());
events.clear();
eventService3.unicast("test1", "Hello world!");
Thread.sleep(100);
assertEquals(1, events.size());
assertTrue(events.contains(3));
events.clear();
eventService3.unicast("test1", "Hello world!");
Thread.sleep(100);
assertEquals(1, events.size());
assertTrue(events.contains(1));
events.clear();
eventService3.unicast("test1", "Hello world!");
Thread.sleep(100);
assertEquals(1, events.size());
assertTrue(events.contains(2));
events.clear();
eventService3.unicast("test1", "Hello world!");
Thread.sleep(100);
assertEquals(1, events.size());
assertTrue(events.contains(3));
events.clear();
eventService1.<String, String>subscribe("test2", SERIALIZER::decode, message -> {
events.add(1);
return message;
}, SERIALIZER::encode, MoreExecutors.directExecutor()).join();
eventService2.<String, String>subscribe("test2", SERIALIZER::decode, message -> {
events.add(2);
return message;
}, SERIALIZER::encode, MoreExecutors.directExecutor()).join();
assertEquals("Hello world!", eventService3.send("test2", "Hello world!").join());
assertEquals(1, events.size());
assertTrue(events.contains(1));
events.clear();
assertEquals("Hello world!", eventService3.send("test2", "Hello world!").join());
assertEquals(1, events.size());
assertTrue(events.contains(2));
events.clear();
assertEquals("Hello world!", eventService3.send("test2", "Hello world!").join());
assertEquals(1, events.size());
assertTrue(events.contains(1));
CompletableFuture.allOf(new CompletableFuture[] { clusterEventingService1.stop(), clusterEventingService2.stop(), clusterEventingService3.stop() }).join();
CompletableFuture.allOf(new CompletableFuture[] { clusterService1.stop(), clusterService2.stop(), clusterService3.stop() }).join();
}
Aggregations