* terms of the Eclipse Public License v1.0 which accompanies this distribution,
* and is available at http://www.eclipse.org/legal/epl-v10.html
*/
-
package org.opendaylight.controller.cluster.raft;
-import java.util.concurrent.atomic.AtomicLong;
+import com.google.common.annotations.VisibleForTesting;
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+import org.opendaylight.controller.cluster.raft.behaviors.LeaderInstallSnapshotState;
/**
- * The state of the followers log as known by the Leader
+ * The state of the followers log as known by the Leader.
*/
public interface FollowerLogInformation {
+ long NO_INDEX = -1;
+
+ /**
+ * Increments the value of the follower's next index.
+ *
+ * @return the new value of nextIndex.
+ */
+ long incrNextIndex();
+
+ /**
+ * Decrements the value of the follower's next index.
+ *
+ * @return true if the next index was decremented, ie it was previously >= 0, false otherwise.
+ */
+ boolean decrNextIndex();
+
+ /**
+ * Sets the index of the follower's next log entry.
+ *
+ * @param nextIndex the new index.
+ * @return true if the new index differed from the current index and the current index was updated, false
+ * otherwise.
+ */
+ boolean setNextIndex(long nextIndex);
+
+ /**
+ * Increments the value of the follower's match index.
+ *
+ * @return the new value of matchIndex.
+ */
+ long incrMatchIndex();
+
+ /**
+ * Sets the index of the follower's highest log entry.
+ *
+ * @param matchIndex the new index.
+ * @return true if the new index differed from the current index and the current index was updated, false
+ * otherwise.
+ */
+ boolean setMatchIndex(long matchIndex);
+
+ /**
+ * Returns the identifier of the follower.
+ *
+ * @return the identifier of the follower.
+ */
+ String getId();
+
+ /**
+ * Returns the index of the next log entry to send to the follower.
+ *
+ * @return index of the follower's next log entry.
+ */
+ long getNextIndex();
+
+ /**
+ * Returns the index of highest log entry known to be replicated on the follower.
+ *
+ * @return the index of highest log entry.
+ */
+ long getMatchIndex();
+
+ /**
+ * Checks if the follower is active by comparing the time of the last activity with the election time out. The
+ * follower is active if some activity has occurred for the follower within the election time out interval.
+ *
+ * @return true if follower is active, false otherwise.
+ */
+ boolean isFollowerActive();
/**
- * Increment the value of the nextIndex
- * @return
+ * Marks the follower as active. This should be called when some activity has occurred for the follower.
*/
- public long incrNextIndex();
+ void markFollowerActive();
/**
- * Decrement the value of the nextIndex
- * @return
+ * Marks the follower as inactive. This should only be called from unit tests.
*/
- public long decrNextIndex();
+ @VisibleForTesting
+ void markFollowerInActive();
+
/**
+ * Returns the time since the last activity occurred for the follower.
*
- * @param nextIndex
+ * @return time in milliseconds since the last activity from the follower.
*/
- void setNextIndex(long nextIndex);
+ long timeSinceLastActivity();
/**
- * Increment the value of the matchIndex
- * @return
+ * This method checks if the next replicate message can be sent to the follower. This is an optimization to avoid
+ * sending duplicate message too frequently if the last replicate message was sent and no reply has been received
+ * yet within the current heart beat interval
+ *
+ * @return true if it is ok to replicate, false otherwise
*/
- public long incrMatchIndex();
+ boolean okToReplicate();
- public void setMatchIndex(long matchIndex);
+ /**
+ * Returns the log entry payload data version of the follower.
+ *
+ * @return the payload data version.
+ */
+ short getPayloadVersion();
/**
- * The identifier of the follower
- * This could simply be the url of the remote actor
+ * Sets the payload data version of the follower.
+ *
+ * @param payloadVersion the payload data version.
*/
- public String getId();
+ void setPayloadVersion(short payloadVersion);
/**
- * for each server, index of the next log entry
- * to send to that server (initialized to leader
- * last log index + 1)
+ * Returns the the raft version of the follower.
+ *
+ * @return the raft version of the follower.
*/
- public AtomicLong getNextIndex();
+ short getRaftVersion();
/**
- * for each server, index of highest log entry
- * known to be replicated on server
- * (initialized to 0, increases monotonically)
+ * Sets the raft version of the follower.
+ *
+ * @param raftVersion the raft version.
*/
- public AtomicLong getMatchIndex();
+ void setRaftVersion(short raftVersion);
+ /**
+ * Returns the LeaderInstallSnapshotState for the in progress install snapshot.
+ *
+ * @return the LeaderInstallSnapshotState if a snapshot install is in progress, null otherwise.
+ */
+ @Nullable
+ LeaderInstallSnapshotState getInstallSnapshotState();
+
+ /**
+ * Sets the LeaderInstallSnapshotState when an install snapshot is initiated.
+ *
+ * @param state the LeaderInstallSnapshotState
+ */
+ void setLeaderInstallSnapshotState(@Nonnull LeaderInstallSnapshotState state);
+
+ /**
+ * Clears the LeaderInstallSnapshotState when an install snapshot is complete.
+ */
+ void clearLeaderInstallSnapshotState();
+ /**
+ * Sets the index of the log entry whose payload size exceeds the maximum size for a single message and thus
+ * needs to be sliced into smaller chunks.
+ *
+ * @param index the log entry index or NO_INDEX to clear it
+ */
+ void setSlicedLogEntryIndex(long index);
+
+ /**
+ * Return whether or not log entry slicing is currently in progress.
+ *
+ * @return true if slicing is currently in progress, false otherwise
+ */
+ boolean isLogEntrySlicingInProgress();
}