use of io.atomix.cluster.NodeId in project atomix by atomix.
the class RaftClusterContext method join.
@Override
public synchronized CompletableFuture<Void> join(Collection<NodeId> cluster) {
if (joinFuture != null)
return joinFuture;
// If no configuration was loaded from disk, create a new configuration.
if (configuration == null) {
member.setType(RaftMember.Type.PROMOTABLE);
// Create a set of cluster members, excluding the local member which is joining a cluster.
Set<RaftMember> activeMembers = cluster.stream().filter(m -> !m.equals(member.nodeId())).map(m -> new DefaultRaftMember(m, RaftMember.Type.ACTIVE, member.getLastUpdated())).collect(Collectors.toSet());
// fail the join.
if (activeMembers.isEmpty()) {
return Futures.exceptionalFuture(new IllegalStateException("cannot join empty cluster"));
}
// Create a new configuration and configure the cluster. Once the cluster is configured, the configuration
// will be stored on disk to ensure the cluster can fall back to the provided configuration if necessary.
configure(new Configuration(0, 0, member.getLastUpdated().toEpochMilli(), activeMembers));
}
return join().thenCompose(v -> {
if (member.getType() == RaftMember.Type.ACTIVE) {
return CompletableFuture.completedFuture(null);
} else {
return member.promote(RaftMember.Type.ACTIVE);
}
});
}
use of io.atomix.cluster.NodeId in project atomix by atomix.
the class RaftClusterContext method bootstrap.
@Override
public CompletableFuture<Void> bootstrap(Collection<NodeId> cluster) {
if (joinFuture != null)
return joinFuture;
if (configuration == null) {
member.setType(RaftMember.Type.ACTIVE);
// Create a set of active members.
Set<RaftMember> activeMembers = cluster.stream().filter(m -> !m.equals(member.nodeId())).map(m -> new DefaultRaftMember(m, RaftMember.Type.ACTIVE, member.getLastUpdated())).collect(Collectors.toSet());
// Add the local member to the set of active members.
activeMembers.add(member);
// Create a new configuration and store it on disk to ensure the cluster can fall back to the configuration.
configure(new Configuration(0, 0, member.getLastUpdated().toEpochMilli(), activeMembers));
}
return join();
}
use of io.atomix.cluster.NodeId in project atomix by atomix.
the class RaftFuzzTest method createClient.
/**
* Creates a Raft client.
*/
private RaftClient createClient() throws Exception {
NodeId nodeId = nextNodeId();
RaftClientProtocol protocol;
if (USE_NETTY) {
Endpoint endpoint = new Endpoint(InetAddress.getLocalHost(), ++port);
MessagingService messagingManager = NettyMessagingService.builder().withEndpoint(endpoint).build().start().join();
endpointMap.put(nodeId, endpoint);
protocol = new RaftClientMessagingProtocol(messagingManager, protocolSerializer, endpointMap::get);
} else {
protocol = protocolFactory.newClientProtocol(nodeId);
}
RaftClient client = RaftClient.builder().withNodeId(nodeId).withProtocol(protocol).build();
client.connect(members.stream().map(RaftMember::nodeId).collect(Collectors.toList())).join();
clients.add(client);
return client;
}
use of io.atomix.cluster.NodeId in project atomix by atomix.
the class RaftClusterContext method listen.
@Override
public synchronized CompletableFuture<Void> listen(Collection<NodeId> cluster) {
if (joinFuture != null)
return joinFuture;
// If no configuration was loaded from disk, create a new configuration.
if (configuration == null) {
member.setType(RaftMember.Type.PASSIVE);
// Create a set of cluster members, excluding the local member which is joining a cluster.
Set<RaftMember> activeMembers = cluster.stream().filter(m -> !m.equals(member.nodeId())).map(m -> new DefaultRaftMember(m, RaftMember.Type.ACTIVE, member.getLastUpdated())).collect(Collectors.toSet());
// fail the join.
if (activeMembers.isEmpty()) {
return Futures.exceptionalFuture(new IllegalStateException("cannot join empty cluster"));
}
// Create a new configuration and configure the cluster. Once the cluster is configured, the configuration
// will be stored on disk to ensure the cluster can fall back to the provided configuration if necessary.
configure(new Configuration(0, 0, member.getLastUpdated().toEpochMilli(), activeMembers));
}
return join();
}
use of io.atomix.cluster.NodeId in project atomix by atomix.
the class SynchronousReplicator method replicate.
@Override
public CompletableFuture<Void> replicate(BackupOperation operation) {
if (context.descriptor().backups() == 0) {
return CompletableFuture.completedFuture(null);
}
CompletableFuture<Void> future = new CompletableFuture<>();
futures.put(operation.index(), future);
for (NodeId backup : context.backups()) {
queues.computeIfAbsent(backup, BackupQueue::new).add(operation);
}
return future;
}
Aggregations