@Override public Collection<MemberId> members() { return Futures.get(election.getTerm()) .candidates() .stream() .map(GroupMember::memberId) .collect(Collectors.toList()); }
@Override public Collection<MemberId> backups() { return Futures.get(election.getTerm()) .candidates() .stream() .map(GroupMember::memberId) .collect(Collectors.toList()); }
@Override public Collection<MemberId> backups() { return Futures.get(election.getTerm()) .candidates() .stream() .map(GroupMember::memberId) .collect(Collectors.toList()); }
@Override public Collection<MemberId> members() { return Futures.get(election.getTerm()) .candidates() .stream() .map(GroupMember::memberId) .collect(Collectors.toList()); }
/** * Opens the service context. * * @return a future to be completed once the service context has been opened */ public CompletableFuture<Void> open() { return primaryElection.getTerm() .thenAccept(this::changeRole) .thenRun(() -> service.init(this)); }
@Override public long term() { return Futures.get(election.getTerm()).term(); }
@Override public long term() { return Futures.get(election.getTerm()).term(); }
/** * Returns the current primary term. * * @return the current primary term */ private CompletableFuture<PrimaryTerm> term() { CompletableFuture<PrimaryTerm> future = new CompletableFuture<>(); threadContext.execute(() -> { if (term != null) { future.complete(term); } else { primaryElection.getTerm().whenCompleteAsync((term, error) -> { if (term != null) { this.term = term; future.complete(term); } else { future.completeExceptionally(new PrimitiveException.Unavailable()); } }); } }); return future; }
@Override public MemberId primary() { return Futures.get(election.getTerm()) .primary() .memberId(); }
@Override public MemberId primary() { return Futures.get(election.getTerm()) .primary() .memberId(); }
/** * Returns the current server role. * * @return the current server role */ public DistributedLogServer.Role getRole() { return Objects.equals(Futures.get(primaryElection.getTerm()).primary().memberId(), clusterMembershipService.getLocalMember().id()) ? DistributedLogServer.Role.LEADER : DistributedLogServer.Role.FOLLOWER; }
/** * Returns the current server role. * * @return the current server role */ public Role getRole() { return Objects.equals(Futures.get(primaryElection.getTerm()).primary().memberId(), clusterMembershipService.getLocalMember().id()) ? Role.PRIMARY : Role.BACKUP; }
/** * Recursively connects to the partition. */ private void connect(int attempt, CompletableFuture<SessionClient> future) { if (attempt > MAX_ATTEMPTS) { future.completeExceptionally(new PrimitiveException.Unavailable()); return; } primaryElection.getTerm().whenCompleteAsync((term, error) -> { if (error == null) { if (term.primary() == null) { future.completeExceptionally(new PrimitiveException.Unavailable()); } else { this.term = term; protocol.registerEventListener(sessionId, this::handleEvent, threadContext); future.complete(this); } } else { Throwable cause = Throwables.getRootCause(error); if (cause instanceof PrimitiveException.Unavailable || cause instanceof TimeoutException) { threadContext.schedule(Duration.ofMillis(RETRY_DELAY), () -> connect(attempt + 1, future)); } else { future.completeExceptionally(new PrimitiveException.Unavailable()); } } }, threadContext); }
execute(operation).whenComplete(future); } else { primaryElection.getTerm().whenComplete((newTerm, termError) -> { if (termError == null) { if (newTerm.term() > term.term() && newTerm.primary() != null) {
@Override public CompletableFuture<byte[]> execute(PrimitiveOperation operation) { ComposableFuture<byte[]> future = new ComposableFuture<>(); threadContext.execute(() -> { if (term.primary() == null) { primaryElection.getTerm().whenCompleteAsync((term, error) -> { if (error == null) { if (term.term() <= this.term.term() || term.primary() == null) { future.completeExceptionally(new PrimitiveException.Unavailable()); } else { this.term = term; execute(operation, 1, future); } } else { future.completeExceptionally(new PrimitiveException.Unavailable()); } }, threadContext); } else { execute(operation, 1, future); } }); return future; }
@Override public Collection<MemberId> members() { return Futures.get(election.getTerm()) .candidates() .stream() .map(GroupMember::memberId) .collect(Collectors.toList()); }
@Override public Collection<MemberId> backups() { return Futures.get(election.getTerm()) .candidates() .stream() .map(GroupMember::memberId) .collect(Collectors.toList()); }
@Override public long term() { return Futures.get(election.getTerm()).term(); }
@Override public MemberId primary() { return Futures.get(election.getTerm()) .primary() .memberId(); }
/** * Returns the current server role. * * @return the current server role */ public DistributedLogServer.Role getRole() { return Objects.equals(Futures.get(primaryElection.getTerm()).primary().memberId(), clusterMembershipService.getLocalMember().id()) ? DistributedLogServer.Role.LEADER : DistributedLogServer.Role.FOLLOWER; }