server.join(RaftJournalConfiguration.defaults(serviceType) .getClusterAddresses().stream() .map(addr -> new Address(addr.getHostName(), addr.getPort()))
return join(Arrays.asList(cluster));
return server.join(cluster).thenApply(v -> this);
return join(Arrays.asList(cluster));
public ClusterNode build() { CopycatServer server = createCopyCatServer(); if(mode == JOIN_MODE.BOOTSTRAP) { server.bootstrap().join(); } else { server.join(new Address(bootstrapNode, bootstrapPort)).join(); } return new CopyCatClusterNode(server, createClient()); }
if (remove) { System.out.println("Adding server: " + newServer.cluster().member().address()); joinFuture = newServer.join(members.get(members.size() - 1).address()); } else { System.out.println("Bootstrapping server: " + newServer.cluster().member().address());
/** * Tests a server joining the cluster. */ private void testServerJoin(Member.Type type) throws Throwable { createServers(3); CopycatServer server = createServer(nextMember(type)); server.join(members.stream().map(Member::serverAddress).collect(Collectors.toList())).thenRun(this::resume); await(10000); }
/** * Tests joining a server to an existing cluster. */ public void testCrashRecover() throws Throwable { List<CopycatServer> servers = createServers(3); CopycatClient client = createClient(); submit(client, 0, 1000); await(30000); servers.get(0).shutdown().get(10, TimeUnit.SECONDS); CopycatServer server = createServer(members.get(0)); server.join(members.stream().map(Member::serverAddress).collect(Collectors.toList())).thenRun(this::resume); await(30000); submit(client, 0, 1000); await(30000); }
/** * Tests joining and leaving the cluster, resizing the quorum. */ public void testResize() throws Throwable { CopycatServer server = createServers(1).get(0); CopycatServer joiner = createServer(nextMember(Member.Type.ACTIVE)); joiner.join(members.stream().map(Member::serverAddress).collect(Collectors.toList())).thenRun(this::resume); await(10000); server.leave().thenRun(this::resume); await(10000); joiner.leave().thenRun(this::resume); }
/** * Tests detecting an availability change of a passive member on a reserve member. */ public void testReservePassiveAvailabilityChange() throws Throwable { createServers(3); CopycatServer passive = createServer(nextMember(Member.Type.PASSIVE)); passive.join(members.stream().map(Member::serverAddress).collect(Collectors.toList())).thenRun(this::resume); CopycatServer reserve = createServer(nextMember(Member.Type.RESERVE)); reserve.join(members.stream().map(Member::serverAddress).collect(Collectors.toList())).thenRun(this::resume); await(10000, 2); reserve.cluster().member(passive.cluster().member().address()).onStatusChange(s -> { threadAssertEquals(s, Member.Status.UNAVAILABLE); resume(); }); passive.shutdown().thenRun(this::resume); await(10000, 2); }
/** * Tests joining a server after many entries have been committed. */ private void testServerJoinLate(Member.Type type, CopycatServer.State state) throws Throwable { createServers(3); CopycatClient client = createClient(); submit(client, 0, 1000); await(30000); CopycatServer joiner = createServer(nextMember(type)); joiner.onStateChange(s -> { if (s == state) resume(); }); joiner.join(members.stream().map(Member::serverAddress).collect(Collectors.toList())).thenRun(this::resume); await(30000, 2); }
/** * Tests a member join event. */ private void testJoinEvent(Member.Type type) throws Throwable { List<CopycatServer> servers = createServers(3); Member member = nextMember(type); CopycatServer server = servers.get(0); server.cluster().onJoin(m -> { threadAssertEquals(m.address(), member.address()); threadAssertEquals(m.type(), type); resume(); }); CopycatServer joiner = createServer(member); joiner.join(members.stream().map(Member::serverAddress).collect(Collectors.toList())).thenRun(this::resume); await(10000, 2); }
/** * Tests detecting an availability change of a reserve member on a passive member. */ public void testPassiveReserveAvailabilityChange() throws Throwable { createServers(3); CopycatServer passive = createServer(nextMember(Member.Type.PASSIVE)); passive.join(members.stream().map(Member::serverAddress).collect(Collectors.toList())).thenRun(this::resume); await(10000); Member reserveMember = nextMember(Member.Type.RESERVE); passive.cluster().onJoin(member -> { threadAssertEquals(member.address(), reserveMember.address()); member.onStatusChange(s -> { threadAssertEquals(s, Member.Status.UNAVAILABLE); resume(); }); }); CopycatServer reserve = createServer(reserveMember); reserve.join(members.stream().map(Member::serverAddress).collect(Collectors.toList())).thenRun(this::resume); await(10000); reserve.shutdown().thenRun(this::resume); await(10000, 2); }
/** * Tests a member availability change. */ private void testAvailabilityChange(Member.Type type) throws Throwable { List<CopycatServer> servers = createServers(3); CopycatServer server = servers.get(0); server.cluster().onJoin(m -> { m.onStatusChange(s -> { threadAssertEquals(s, Member.Status.UNAVAILABLE); resume(); }); }); Member member = nextMember(type); CopycatServer joiner = createServer(member); joiner.join(members.stream().map(Member::serverAddress).collect(Collectors.toList())).thenRun(this::resume); await(10000); joiner.shutdown().thenRun(this::resume); await(10000, 2); }
/** * Tests starting several members individually. */ public void testSingleMemberStart() throws Throwable { CopycatServer server = createServers(1).get(0); server.bootstrap().thenRun(this::resume); await(5000); CopycatServer joiner1 = createServer(nextMember(Member.Type.ACTIVE)); joiner1.join(server.cluster().member().address()).thenRun(this::resume); await(5000); CopycatServer joiner2 = createServer(nextMember(Member.Type.ACTIVE)); joiner2.join(server.cluster().member().address()).thenRun(this::resume); await(5000); }