summary |
shortlog |
log |
commit | commitdiff |
review |
tree
raw |
patch |
inline | side by side (from parent 1:
e6922e3)
Introducing a leader target encapsulation allows us to
enfore state transitions (i.e. state is guaranteed to be
non-null when we need its bits).
This enables us to eliminate the need for a magic constant.
Change-Id: Iab7178694edc3c62032e32c4386c371630f67b6f
Signed-off-by: Robert Varga <robert.varga@pantheon.tech>
(cherry picked from commit
2c42c1d35a45fb7eced5a3ffd07b52bdc26f7e40)
* sync if it is behind by 'syncThreshold' commits.
*/
public class SyncStatusTracker {
* sync if it is behind by 'syncThreshold' commits.
*/
public class SyncStatusTracker {
+ private static final class LeaderInfo {
+ final long minimumCommitIndex;
+ final String leaderId;
+
+ LeaderInfo(final String leaderId, final long minimumCommitIndex) {
+ this.leaderId = Preconditions.checkNotNull(leaderId);
+ this.minimumCommitIndex = minimumCommitIndex;
+ }
+ }
+
private static final Logger LOG = LoggerFactory.getLogger(SyncStatusTracker.class);
private static final boolean IN_SYNC = true;
private static final Logger LOG = LoggerFactory.getLogger(SyncStatusTracker.class);
private static final boolean IN_SYNC = true;
private final ActorRef actor;
private final int syncThreshold;
private final ActorRef actor;
private final int syncThreshold;
- // FIXME: what is this magic constant?
- private long minimumExpectedIndex = -2L;
- private String syncedLeaderId = null;
- private boolean syncStatus = false;
+ private LeaderInfo syncTarget;
+ private boolean syncStatus;
public SyncStatusTracker(final ActorRef actor, final String id, final int syncThreshold) {
this.actor = Preconditions.checkNotNull(actor, "actor should not be null");
public SyncStatusTracker(final ActorRef actor, final String id, final int syncThreshold) {
this.actor = Preconditions.checkNotNull(actor, "actor should not be null");
public void update(final String leaderId, final long leaderCommit, final long commitIndex) {
Preconditions.checkNotNull(leaderId, "leaderId should not be null");
public void update(final String leaderId, final long leaderCommit, final long commitIndex) {
Preconditions.checkNotNull(leaderId, "leaderId should not be null");
- if (!leaderId.equals(syncedLeaderId)) {
- minimumExpectedIndex = leaderCommit;
- LOG.debug("Last sync leader {} does not match current leader {}, need to catch up to {}", syncedLeaderId,
+ if (syncTarget == null || !leaderId.equals(syncTarget.leaderId)) {
+ LOG.debug("Last sync leader does not match current leader {}, need to catch up to {}",
leaderId, leaderCommit);
changeSyncStatus(NOT_IN_SYNC, true);
leaderId, leaderCommit);
changeSyncStatus(NOT_IN_SYNC, true);
- syncedLeaderId = leaderId;
+ syncTarget = new LeaderInfo(leaderId, leaderCommit);
if (lag > syncThreshold) {
LOG.debug("Lagging {} entries behind leader {}", lag, leaderId);
changeSyncStatus(NOT_IN_SYNC, false);
if (lag > syncThreshold) {
LOG.debug("Lagging {} entries behind leader {}", lag, leaderId);
changeSyncStatus(NOT_IN_SYNC, false);
- } else if (commitIndex >= minimumExpectedIndex) {
+ } else if (commitIndex >= syncTarget.minimumCommitIndex) {
LOG.debug("Lagging {} entries behind leader and reached {} (of expected {})", lag, leaderId, commitIndex,
LOG.debug("Lagging {} entries behind leader and reached {} (of expected {})", lag, leaderId, commitIndex,
+ syncTarget.minimumCommitIndex);
changeSyncStatus(IN_SYNC, false);
}
}
changeSyncStatus(IN_SYNC, false);
}
}