X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?p=controller.git;a=blobdiff_plain;f=opendaylight%2Fmd-sal%2Fsal-akka-raft%2Fsrc%2Fmain%2Fjava%2Forg%2Fopendaylight%2Fcontroller%2Fcluster%2Fraft%2FFollowerLogInformationImpl.java;h=90e128256132437c5f2acd4cb861e0e74a759d44;hp=94f9a53a850ae22537fe0607b5a16a1328b12532;hb=f78b7f15e24efdb5dd9f91b487bc63dad7517b1c;hpb=c231099ee1cf768de3002e8a290befa172150b7a diff --git a/opendaylight/md-sal/sal-akka-raft/src/main/java/org/opendaylight/controller/cluster/raft/FollowerLogInformationImpl.java b/opendaylight/md-sal/sal-akka-raft/src/main/java/org/opendaylight/controller/cluster/raft/FollowerLogInformationImpl.java index 94f9a53a85..90e1282561 100644 --- a/opendaylight/md-sal/sal-akka-raft/src/main/java/org/opendaylight/controller/cluster/raft/FollowerLogInformationImpl.java +++ b/opendaylight/md-sal/sal-akka-raft/src/main/java/org/opendaylight/controller/cluster/raft/FollowerLogInformationImpl.java @@ -8,53 +8,108 @@ package org.opendaylight.controller.cluster.raft; -import java.util.concurrent.atomic.AtomicLong; +import com.google.common.base.Stopwatch; +import java.util.concurrent.TimeUnit; +import java.util.concurrent.atomic.AtomicLongFieldUpdater; -public class FollowerLogInformationImpl implements FollowerLogInformation{ +public class FollowerLogInformationImpl implements FollowerLogInformation { + private static final AtomicLongFieldUpdater NEXT_INDEX_UPDATER = AtomicLongFieldUpdater.newUpdater(FollowerLogInformationImpl.class, "nextIndex"); + private static final AtomicLongFieldUpdater MATCH_INDEX_UPDATER = AtomicLongFieldUpdater.newUpdater(FollowerLogInformationImpl.class, "matchIndex"); private final String id; - private final AtomicLong nextIndex; + private final Stopwatch stopwatch = Stopwatch.createUnstarted(); - private final AtomicLong matchIndex; + private final RaftActorContext context; - public FollowerLogInformationImpl(String id, AtomicLong nextIndex, - AtomicLong matchIndex) { + private volatile long nextIndex; + + private volatile long matchIndex; + + public FollowerLogInformationImpl(String id, long matchIndex, RaftActorContext context) { this.id = id; - this.nextIndex = nextIndex; + this.nextIndex = context.getCommitIndex(); this.matchIndex = matchIndex; + this.context = context; } + @Override public long incrNextIndex(){ - return nextIndex.incrementAndGet(); + return NEXT_INDEX_UPDATER.incrementAndGet(this); } - @Override public long decrNextIndex() { - return nextIndex.decrementAndGet(); + @Override + public long decrNextIndex() { + return NEXT_INDEX_UPDATER.decrementAndGet(this); } - @Override public void setNextIndex(long nextIndex) { - this.nextIndex.set(nextIndex); + @Override + public void setNextIndex(long nextIndex) { + this.nextIndex = nextIndex; } + @Override public long incrMatchIndex(){ - return matchIndex.incrementAndGet(); + return MATCH_INDEX_UPDATER.incrementAndGet(this); } - @Override public void setMatchIndex(long matchIndex) { - this.matchIndex.set(matchIndex); + @Override + public void setMatchIndex(long matchIndex) { + this.matchIndex = matchIndex; } + @Override public String getId() { return id; } - public AtomicLong getNextIndex() { + @Override + public long getNextIndex() { return nextIndex; } - public AtomicLong getMatchIndex() { + @Override + public long getMatchIndex() { return matchIndex; } + @Override + public boolean isFollowerActive() { + long elapsed = stopwatch.elapsed(TimeUnit.MILLISECONDS); + return (stopwatch.isRunning()) && + (elapsed <= context.getConfigParams().getElectionTimeOutInterval().toMillis()); + } + + @Override + public void markFollowerActive() { + if (stopwatch.isRunning()) { + stopwatch.reset(); + } + stopwatch.start(); + } + + @Override + public void markFollowerInActive() { + if (stopwatch.isRunning()) { + stopwatch.stop(); + } + } + + @Override + public long timeSinceLastActivity() { + return stopwatch.elapsed(TimeUnit.MILLISECONDS); + } + + @Override + public String toString() { + StringBuilder builder = new StringBuilder(); + builder.append("FollowerLogInformationImpl [id=").append(id).append(", nextIndex=").append(nextIndex) + .append(", matchIndex=").append(matchIndex).append(", stopwatch=") + .append(stopwatch.elapsed(TimeUnit.MILLISECONDS)) + .append(", followerTimeoutMillis=") + .append(context.getConfigParams().getElectionTimeOutInterval().toMillis()).append("]"); + return builder.toString(); + } + + }