X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?a=blobdiff_plain;f=opendaylight%2Fmd-sal%2Fsal-akka-raft%2Fsrc%2Fmain%2Fjava%2Forg%2Fopendaylight%2Fcontroller%2Fcluster%2Fraft%2FFollowerLogInformationImpl.java;h=288a540344bda27cab5276265ebcae6079c492fd;hb=d8d8f731bbe6c58fcbd0e616734e2e230aaf4ab4;hp=91a5dddb981b3f7b09e9a79dd44fa0c09d4448a2;hpb=ff957698c85aa1b57cdc6d7a8bca2c9dc96ba1ec;p=controller.git 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 91a5dddb98..288a540344 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 @@ -10,53 +10,62 @@ package org.opendaylight.controller.cluster.raft; import com.google.common.base.Stopwatch; import java.util.concurrent.TimeUnit; -import java.util.concurrent.atomic.AtomicLong; -import scala.concurrent.duration.FiniteDuration; +import java.util.concurrent.atomic.AtomicLongFieldUpdater; 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; - private final Stopwatch stopwatch; + private volatile long nextIndex; - private final long followerTimeoutMillis; + private volatile long matchIndex; - public FollowerLogInformationImpl(String id, long nextIndex, - long matchIndex, FiniteDuration followerTimeoutDuration) { + public FollowerLogInformationImpl(String id, long matchIndex, RaftActorContext context) { this.id = id; - this.nextIndex = new AtomicLong(nextIndex); - this.matchIndex = new AtomicLong(matchIndex); - this.stopwatch = new Stopwatch(); - this.followerTimeoutMillis = followerTimeoutDuration.toMillis(); + 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(); + return NEXT_INDEX_UPDATER.decrementAndGet(this); } @Override - public void setNextIndex(long nextIndex) { - this.nextIndex.set(nextIndex); + public boolean setNextIndex(long nextIndex) { + if(this.nextIndex != nextIndex) { + this.nextIndex = nextIndex; + return true; + } + + return false; } @Override public long incrMatchIndex(){ - return matchIndex.incrementAndGet(); + return MATCH_INDEX_UPDATER.incrementAndGet(this); } @Override - public void setMatchIndex(long matchIndex) { - this.matchIndex.set(matchIndex); + public boolean setMatchIndex(long matchIndex) { + if(this.matchIndex != matchIndex) { + this.matchIndex = matchIndex; + return true; + } + + return false; } @Override @@ -66,18 +75,19 @@ public class FollowerLogInformationImpl implements FollowerLogInformation { @Override public long getNextIndex() { - return nextIndex.get(); + return nextIndex; } @Override public long getMatchIndex() { - return matchIndex.get(); + return matchIndex; } @Override public boolean isFollowerActive() { long elapsed = stopwatch.elapsed(TimeUnit.MILLISECONDS); - return (stopwatch.isRunning()) && (elapsed <= followerTimeoutMillis); + return (stopwatch.isRunning()) && + (elapsed <= context.getConfigParams().getElectionTimeOutInterval().toMillis()); } @Override @@ -94,4 +104,22 @@ public class FollowerLogInformationImpl implements FollowerLogInformation { 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(); + } + + }