/*
* Copyright (c) 2014 Cisco Systems, Inc. and others. All rights reserved.
*
* This program and the accompanying materials are made available under the
* 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 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.
*/
public interface FollowerLogInformation {
/**
* 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();
/**
* Marks the follower as active. This should be called when some activity has occurred for the follower.
*/
void markFollowerActive();
/**
* Marks the follower as inactive. This should only be called from unit tests.
*/
@VisibleForTesting
void markFollowerInActive();
/**
* Returns the time since the last activity occurred for the follower.
*
* @return time in milliseconds since the last activity from the follower.
*/
long timeSinceLastActivity();
/**
* 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
*/
boolean okToReplicate();
/**
* Returns the log entry payload data version of the follower.
*
* @return the payload data version.
*/
short getPayloadVersion();
/**
* Sets the payload data version of the follower.
*
* @param payloadVersion the payload data version.
*/
void setPayloadVersion(short payloadVersion);
/**
* Returns the the raft version of the follower.
*
* @return the raft version of the follower.
*/
short getRaftVersion();
/**
* Sets the raft version of the follower.
*
* @param raftVersion the raft version.
*/
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();
}