Search in sources :

Example 1 with Member

use of io.atomix.primitive.partition.Member in project atomix by atomix.

the class PrimaryElectorService method enter.

/**
 * Applies an {@link PrimaryElectorOperations.Enter} commit.
 *
 * @param commit commit entry
 * @return topic leader. If no previous leader existed this is the node that just entered the race.
 */
protected PrimaryTerm enter(Commit<? extends PrimaryElectorOperations.Enter> commit) {
    try {
        PartitionId partitionId = commit.value().partitionId();
        PrimaryTerm oldTerm = term(partitionId);
        Registration registration = new Registration(commit.value().member(), commit.session().sessionId().id());
        PrimaryTerm newTerm = elections.compute(partitionId, (k, v) -> {
            if (v == null) {
                return new ElectionState(partitionId, registration, elections);
            } else {
                if (!v.isDuplicate(registration)) {
                    return new ElectionState(v).addRegistration(registration);
                } else {
                    return v;
                }
            }
        }).term();
        if (!Objects.equals(oldTerm, newTerm)) {
            notifyTermChange(partitionId, newTerm);
            scheduleRebalance();
        }
        return newTerm;
    } catch (Exception e) {
        getLogger().error("State machine operation failed", e);
        throw Throwables.propagate(e);
    }
}
Also used : ServiceExecutor(io.atomix.primitive.service.ServiceExecutor) Arrays(java.util.Arrays) BufferInput(io.atomix.storage.buffer.BufferInput) CHANGE(io.atomix.primitive.partition.impl.PrimaryElectorEvents.CHANGE) PrimaryElectionEvent(io.atomix.primitive.partition.PrimaryElectionEvent) HashMap(java.util.HashMap) PartitionId(io.atomix.primitive.partition.PartitionId) LinkedHashMap(java.util.LinkedHashMap) Lists(com.google.common.collect.Lists) Duration(java.time.Duration) Map(java.util.Map) PrimaryTerm(io.atomix.primitive.partition.PrimaryTerm) KryoNamespace(io.atomix.utils.serializer.KryoNamespace) Session(io.atomix.primitive.session.Session) Scheduled(io.atomix.utils.concurrent.Scheduled) LinkedList(java.util.LinkedList) Commit(io.atomix.primitive.service.Commit) MoreObjects(com.google.common.base.MoreObjects) Throwables(com.google.common.base.Throwables) Set(java.util.Set) Collectors(java.util.stream.Collectors) Sets(com.google.common.collect.Sets) Member(io.atomix.primitive.partition.Member) BufferOutput(io.atomix.storage.buffer.BufferOutput) Objects(java.util.Objects) List(java.util.List) AbstractPrimitiveService(io.atomix.primitive.service.AbstractPrimitiveService) Optional(java.util.Optional) Serializer(io.atomix.utils.serializer.Serializer) PartitionId(io.atomix.primitive.partition.PartitionId) PrimaryTerm(io.atomix.primitive.partition.PrimaryTerm)

Example 2 with Member

use of io.atomix.primitive.partition.Member in project atomix by atomix.

the class PrimaryBackupClient method getPrimitives.

@Override
public CompletableFuture<Set<String>> getPrimitives(PrimitiveType primitiveType) {
    CompletableFuture<Set<String>> future = new CompletableFuture<>();
    MetadataRequest request = MetadataRequest.request(primitiveType.id());
    threadContext.execute(() -> {
        Member primary = primaryElection.getTerm().join().primary();
        if (primary == null) {
            future.completeExceptionally(new Unavailable());
            return;
        }
        protocol.metadata(primary.nodeId(), request).whenCompleteAsync((response, error) -> {
            if (error == null) {
                if (response.status() == Status.OK) {
                    future.complete(response.primitiveNames());
                } else {
                    future.completeExceptionally(new PrimitiveException.Unavailable());
                }
            } else {
                future.completeExceptionally(new PrimitiveException.Unavailable());
            }
        }, threadContext);
    });
    return future;
}
Also used : CompletableFuture(java.util.concurrent.CompletableFuture) Set(java.util.Set) MetadataRequest(io.atomix.protocols.backup.protocol.MetadataRequest) Member(io.atomix.primitive.partition.Member) PrimitiveException(io.atomix.primitive.PrimitiveException) Unavailable(io.atomix.primitive.PrimitiveException.Unavailable) Unavailable(io.atomix.primitive.PrimitiveException.Unavailable)

Example 3 with Member

use of io.atomix.primitive.partition.Member in project atomix by atomix.

the class PrimaryBackupServiceContext method changeRole.

/**
 * Changes the roles.
 */
private void changeRole(PrimaryTerm term) {
    if (term.term() > currentTerm) {
        log.debug("Term changed: {}", term);
        currentTerm = term.term();
        primary = term.primary() != null ? term.primary().nodeId() : null;
        backups = term.backups(descriptor.backups()).stream().map(Member::nodeId).collect(Collectors.toList());
        if (Objects.equals(primary, clusterService.getLocalNode().id())) {
            if (this.role == null) {
                this.role = new PrimaryRole(this);
                log.debug("{} transitioning to {}", clusterService.getLocalNode().id(), Role.PRIMARY);
            } else if (this.role.role() != Role.PRIMARY) {
                this.role.close();
                this.role = new PrimaryRole(this);
                log.debug("{} transitioning to {}", clusterService.getLocalNode().id(), Role.PRIMARY);
            }
        } else if (backups.contains(clusterService.getLocalNode().id())) {
            if (this.role == null) {
                this.role = new BackupRole(this);
                log.debug("{} transitioning to {}", clusterService.getLocalNode().id(), Role.BACKUP);
            } else if (this.role.role() != Role.BACKUP) {
                this.role.close();
                this.role = new BackupRole(this);
                log.debug("{} transitioning to {}", clusterService.getLocalNode().id(), Role.BACKUP);
            }
        } else {
            if (this.role == null) {
                this.role = new NoneRole(this);
                log.debug("{} transitioning to {}", clusterService.getLocalNode().id(), Role.NONE);
            } else if (this.role.role() != Role.NONE) {
                this.role.close();
                this.role = new NoneRole(this);
                log.debug("{} transitioning to {}", clusterService.getLocalNode().id(), Role.NONE);
            }
        }
    }
}
Also used : NoneRole(io.atomix.protocols.backup.roles.NoneRole) PrimaryRole(io.atomix.protocols.backup.roles.PrimaryRole) BackupRole(io.atomix.protocols.backup.roles.BackupRole) PrimaryBackupRole(io.atomix.protocols.backup.roles.PrimaryBackupRole) Member(io.atomix.primitive.partition.Member)

Aggregations

Member (io.atomix.primitive.partition.Member)3 Set (java.util.Set)2 MoreObjects (com.google.common.base.MoreObjects)1 Throwables (com.google.common.base.Throwables)1 Lists (com.google.common.collect.Lists)1 Sets (com.google.common.collect.Sets)1 PrimitiveException (io.atomix.primitive.PrimitiveException)1 Unavailable (io.atomix.primitive.PrimitiveException.Unavailable)1 PartitionId (io.atomix.primitive.partition.PartitionId)1 PrimaryElectionEvent (io.atomix.primitive.partition.PrimaryElectionEvent)1 PrimaryTerm (io.atomix.primitive.partition.PrimaryTerm)1 CHANGE (io.atomix.primitive.partition.impl.PrimaryElectorEvents.CHANGE)1 AbstractPrimitiveService (io.atomix.primitive.service.AbstractPrimitiveService)1 Commit (io.atomix.primitive.service.Commit)1 ServiceExecutor (io.atomix.primitive.service.ServiceExecutor)1 Session (io.atomix.primitive.session.Session)1 MetadataRequest (io.atomix.protocols.backup.protocol.MetadataRequest)1 BackupRole (io.atomix.protocols.backup.roles.BackupRole)1 NoneRole (io.atomix.protocols.backup.roles.NoneRole)1 PrimaryBackupRole (io.atomix.protocols.backup.roles.PrimaryBackupRole)1