import com.google.common.base.Stopwatch;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicLongFieldUpdater;
-import scala.concurrent.duration.FiniteDuration;
public class FollowerLogInformationImpl implements FollowerLogInformation {
private static final AtomicLongFieldUpdater<FollowerLogInformationImpl> NEXT_INDEX_UPDATER = AtomicLongFieldUpdater.newUpdater(FollowerLogInformationImpl.class, "nextIndex");
private final String id;
- private final Stopwatch stopwatch = new Stopwatch();
+ private final Stopwatch stopwatch = Stopwatch.createUnstarted();
- private final long followerTimeoutMillis;
+ private final RaftActorContext context;
private volatile long nextIndex;
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 = nextIndex;
+ this.nextIndex = context.getCommitIndex();
this.matchIndex = matchIndex;
- this.followerTimeoutMillis = followerTimeoutDuration.toMillis();
+ this.context = context;
}
@Override
}
@Override
- public void setNextIndex(long nextIndex) {
- this.nextIndex = nextIndex;
+ public boolean setNextIndex(long nextIndex) {
+ if(this.nextIndex != nextIndex) {
+ this.nextIndex = nextIndex;
+ return true;
+ }
+
+ return false;
}
@Override
}
@Override
- public void setMatchIndex(long matchIndex) {
- this.matchIndex = matchIndex;
+ public boolean setMatchIndex(long matchIndex) {
+ if(this.matchIndex != matchIndex) {
+ this.matchIndex = matchIndex;
+ return true;
+ }
+
+ return false;
}
@Override
@Override
public boolean isFollowerActive() {
long elapsed = stopwatch.elapsed(TimeUnit.MILLISECONDS);
- return (stopwatch.isRunning()) && (elapsed <= followerTimeoutMillis);
+ return (stopwatch.isRunning()) &&
+ (elapsed <= context.getConfigParams().getElectionTimeOutInterval().toMillis());
}
@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();
+ }
+
+
}