private synchronized void recordNewRound(PaxosValue round) { if (isLeading) { events.lostLeadershipFor(currentRound); leadershipObserver.ifPresent(LeadershipObserver::lostLeadership); } if (isLeaderFor(round)) { events.gainedLeadershipFor(round); leadershipObserver.ifPresent(LeadershipObserver::gainedLeadership); } currentRound = round; isLeading = isLeaderFor(round); }
@Override public void recordLeaderPingFailure(Throwable error) { events.leaderPingFailure(error); }
@Override public void recordLeaderPingReturnedFalse() { events.leaderPingReturnedFalse(); }
@Test public void recordsDuplicateNoQuorum() { recorder.recordRound(ROUND_1_LEADING); recorder.recordNoQuorum(ROUND_1_LEADING); recorder.recordNoQuorum(ROUND_1_LEADING); verify(events).gainedLeadershipFor(ROUND_1_LEADING); verify(events, times(2)).noQuorum(ROUND_1_LEADING); }
@Test public void recordsLeadershipGained() { recorder.recordRound(ROUND_1_LEADING); verify(events).gainedLeadershipFor(ROUND_1_LEADING); }
@Override public void recordLeaderPingTimeout() { events.leaderPingTimeout(); }
@Override public void recordProposalFailure(PaxosRoundFailureException paxosException) { events.proposalFailure(paxosException); }
@Override public void recordProposalAttempt(long round) { events.proposedLeadershipFor(round); }
@Override public synchronized void recordNotLeading(PaxosValue value) { if (isSameRound(value) && isLeading) { events.lostLeadershipFor(value); leadershipObserver.ifPresent(LeadershipObserver::lostLeadership); isLeading = false; } }
@Override public synchronized void recordNoQuorum(PaxosValue value) { if (isSameRound(value)) { events.noQuorum(value); } }
public static PaxosLeadershipEventRecorder create(MetricRegistry metrics, String leaderUuid, LeadershipObserver observer) { return new PaxosLeadershipEventRecorder( new LeadershipEvents(metrics), leaderUuid, Optional.ofNullable(observer)); }
@Test public void notifiesObserverIfGainedLeadership() { recorder.recordRound(ROUND_1_LEADING); verify(events).gainedLeadershipFor(ROUND_1_LEADING); verify(observer).gainedLeadership(); }
@Test public void recordsLeaderPingTimeout() { recorder.recordLeaderPingTimeout(); verify(events).leaderPingTimeout(); }
@Test public void recordsProposalFailure() { PaxosRoundFailureException ex = new PaxosRoundFailureException("foo"); recorder.recordProposalFailure(ex); verify(events).proposalFailure(ex); }
@Test public void recordsProposalAttempt() { recorder.recordProposalAttempt(5L); verify(events).proposedLeadershipFor(5L); }
@Override public synchronized void recordNotLeading(PaxosValue value) { if (isSameRound(value) && isLeading) { events.lostLeadershipFor(value); leadershipObserver.ifPresent(LeadershipObserver::lostLeadership); isLeading = false; } }
@Override public synchronized void recordNoQuorum(PaxosValue value) { if (isSameRound(value)) { events.noQuorum(value); } }
public static PaxosLeadershipEventRecorder create(MetricRegistry metrics, String leaderUuid, LeadershipObserver observer) { return new PaxosLeadershipEventRecorder( new LeadershipEvents(metrics), leaderUuid, Optional.ofNullable(observer)); }
@Test public void recordsLeadershipLostBetweenSequentialLeadershipGained() { recorder.recordRound(ROUND_1_LEADING); recorder.recordRound(ROUND_2_LEADING); verify(events).gainedLeadershipFor(ROUND_1_LEADING); verify(events).lostLeadershipFor(ROUND_1_LEADING); verify(events).gainedLeadershipFor(ROUND_2_LEADING); }
@Test public void doesNotRecordDuplicateLeadershipGained() { recorder.recordRound(ROUND_1_LEADING); recorder.recordRound(ROUND_1_LEADING); verify(events).gainedLeadershipFor(ROUND_1_LEADING); }