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);
}
}
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;
}
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);
}
}
}
}
Aggregations