Class RaftActor
- java.lang.Object
-
- akka.actor.AbstractActor
-
- akka.persistence.AbstractPersistentActor
-
- org.opendaylight.controller.cluster.common.actor.AbstractUntypedPersistentActor
-
- org.opendaylight.controller.cluster.raft.RaftActor
-
- All Implemented Interfaces:
Actor
,Stash
,StashFactory
,StashSupport
,UnrestrictedStash
,RequiresMessageQueue<DequeBasedMessageQueueSemantics>
,AbstractPersistentActorLike
,Eventsourced
,PersistenceIdentity
,PersistenceRecovery
,PersistenceStash
,Snapshotter
,ExecuteInSelfActor
- Direct Known Subclasses:
Shard
public abstract class RaftActor extends AbstractUntypedPersistentActor
RaftActor encapsulates a state machine that needs to be kept synchronized in a cluster. It implements the RAFT algorithm as described in the paper In Search of an Understandable Consensus AlgorithmRaftActor has 3 states and each state has a certain behavior associated with it. A Raft actor can behave as,
- A Leader
- A Follower (or)
- A Candidate
A RaftActor MUST be a Leader in order to accept requests from clients to change the state of it's encapsulated state machine. Once a RaftActor becomes a Leader it is also responsible for ensuring that all followers ultimately have the same log and therefore the same state machine as itself.
The current behavior of a RaftActor determines how election for leadership is initiated and how peer RaftActors react to request for votes.
Each RaftActor also needs to know the current election term. It uses this information for a couple of things. One is to simply figure out who it voted for in the last election. Another is to figure out if the message it received to update it's state is stale.
The RaftActor uses akka-persistence to store it's replicated log. Furthermore through it's behaviors a Raft Actor determines
- when a log entry should be persisted
- when a log entry should be applied to the state machine (and)
- when a snapshot should be saved
-
-
Nested Class Summary
-
Nested classes/interfaces inherited from class akka.actor.AbstractActor
AbstractActor.ActorContext, AbstractActor.Receive
-
Nested classes/interfaces inherited from interface akka.actor.Actor
Actor.emptyBehavior$, Actor.ignoringBehavior$
-
Nested classes/interfaces inherited from interface akka.persistence.Eventsourced
Eventsourced.AsyncHandlerInvocation, Eventsourced.AsyncHandlerInvocation$, Eventsourced.PendingHandlerInvocation, Eventsourced.ProcessingState, Eventsourced.RecoveryTick, Eventsourced.RecoveryTick$, Eventsourced.StashingHandlerInvocation, Eventsourced.StashingHandlerInvocation$, Eventsourced.State
-
-
Field Summary
-
Fields inherited from class org.opendaylight.controller.cluster.common.actor.AbstractUntypedPersistentActor
LOG
-
-
Method Summary
All Methods Instance Methods Abstract Methods Concrete Methods Deprecated Methods Modifier and Type Method Description protected abstract void
applyState(ActorRef clientActor, Identifier identifier, Object data)
The applyState method will be called by the RaftActor when some data needs to be applied to the actor's state.protected void
changeCurrentBehavior(RaftActorBehavior newBehavior)
protected RaftActorBehavior
getCurrentBehavior()
protected Long
getCurrentTerm()
protected String
getId()
ActorSelection
getLeader()
Derived actor can call getLeader if they need a reference to the Leader.protected String
getLeaderId()
Returns the id of the current leader.protected RaftActorContext
getRaftActorContext()
protected abstract @NonNull RaftActorRecoveryCohort
getRaftActorRecoveryCohort()
Returns the RaftActorRecoveryCohort to participate in persistence recovery.protected abstract @NonNull RaftActorSnapshotCohort
getRaftActorSnapshotCohort()
Returns the RaftActorSnapshotCohort to participate in snapshot captures.protected RaftState
getRaftState()
protected abstract Optional<ActorRef>
getRoleChangeNotifier()
Notifier Actor for this RaftActor to notify when a role change happens.protected void
handleCommand(Object message)
Deprecated.This method is not final for testing purposes.protected void
handleNonRaftCommand(Object message)
Method exposed for subclasses to plug-in their logic.protected void
handleRecover(Object message)
protected boolean
hasFollowers()
protected boolean
isLeader()
Derived actors can call the isLeader method to check if the current RaftActor is the Leader or not.protected boolean
isLeaderActive()
protected boolean
isLeadershipTransferInProgress()
protected LeaderStateChanged
newLeaderStateChanged(String memberId, String leaderId, short leaderPayloadVersion)
protected OnDemandRaftState.AbstractBuilder<?,?>
newOnDemandRaftStateBuilder()
protected org.opendaylight.controller.cluster.raft.RaftActorRecoverySupport
newRaftActorRecoverySupport()
protected void
onLeaderChanged(String oldLeader, String newLeader)
protected abstract void
onRecoveryComplete()
This method is called when recovery is complete.protected abstract void
onStateChanged()
This method will be called by the RaftActor when the state of the RaftActor changes.protected void
onVotingStateChangeComplete()
This method is called on the leader when a voting change operation completes.protected void
pauseLeader(Runnable operation)
This method is called prior to operations such as leadership transfer and actor shutdown when the leader must pause or stop its duties.protected void
persistData(ActorRef clientActor, Identifier identifier, Payload data, boolean batchHint)
Persists the given Payload in the journal and replicates to any followers.DataPersistenceProvider
persistence()
void
postStop()
void
preStart()
protected void
setPeerAddress(String peerId, String peerAddress)
setPeerAddress sets the address of a known peer at a later time.protected void
setPersistence(boolean persistent)
void
setPersistence(DataPersistenceProvider provider)
long
snapshotSequenceNr()
protected void
unpauseLeader()
This method is invoked when the actions hooked to the leader becoming paused failed to execute and the leader should resume normal operations.protected void
updateConfigParams(ConfigParams configParams)
-
Methods inherited from class org.opendaylight.controller.cluster.common.actor.AbstractUntypedPersistentActor
createReceive, createReceiveRecover, executeInSelf, ignoreMessage, unknownMessage
-
Methods inherited from class akka.persistence.AbstractPersistentActor
akka$actor$StashSupport$_setter_$akka$actor$StashSupport$$capacity_$eq, akka$actor$StashSupport$_setter_$mailbox_$eq, akka$actor$StashSupport$$capacity, akka$actor$StashSupport$$theStash, akka$actor$StashSupport$$theStash_$eq, akka$persistence$Eventsourced$_setter_$akka$persistence$Eventsourced$$extension_$eq, akka$persistence$Eventsourced$_setter_$akka$persistence$Eventsourced$$instanceId_$eq, akka$persistence$Eventsourced$_setter_$akka$persistence$Eventsourced$$internalStash_$eq, akka$persistence$Eventsourced$_setter_$akka$persistence$Eventsourced$$maxMessageBatchSize_$eq, akka$persistence$Eventsourced$_setter_$akka$persistence$Eventsourced$$pendingInvocations_$eq, akka$persistence$Eventsourced$_setter_$akka$persistence$Eventsourced$$persistingEvents_$eq, akka$persistence$Eventsourced$_setter_$akka$persistence$Eventsourced$$processingCommands_$eq, akka$persistence$Eventsourced$_setter_$akka$persistence$Eventsourced$$unstashFilterPredicate_$eq, akka$persistence$Eventsourced$_setter_$akka$persistence$Eventsourced$$writerUuid_$eq, akka$persistence$Eventsourced$$_lastSequenceNr, akka$persistence$Eventsourced$$_lastSequenceNr_$eq, akka$persistence$Eventsourced$$currentState, akka$persistence$Eventsourced$$currentState_$eq, akka$persistence$Eventsourced$$eventBatch, akka$persistence$Eventsourced$$eventBatch_$eq, akka$persistence$Eventsourced$$extension, akka$persistence$Eventsourced$$instanceId, akka$persistence$Eventsourced$$internalStash, akka$persistence$Eventsourced$$journalBatch, akka$persistence$Eventsourced$$journalBatch_$eq, akka$persistence$Eventsourced$$maxMessageBatchSize, akka$persistence$Eventsourced$$pendingInvocations, akka$persistence$Eventsourced$$pendingStashingPersistInvocations, akka$persistence$Eventsourced$$pendingStashingPersistInvocations_$eq, akka$persistence$Eventsourced$$persistingEvents, akka$persistence$Eventsourced$$processingCommands, akka$persistence$Eventsourced$$sequenceNr, akka$persistence$Eventsourced$$sequenceNr_$eq, akka$persistence$Eventsourced$$unstashFilterPredicate, akka$persistence$Eventsourced$$writeInProgress, akka$persistence$Eventsourced$$writeInProgress_$eq, akka$persistence$Eventsourced$$writerUuid, aroundPostRestart, aroundPostStop, aroundPreRestart, aroundPreStart, aroundReceive, clearStash, createStash, defer, deferAsync, deleteMessages, deleteSnapshot, deleteSnapshots, internalDefer, internalDeferAsync, internalDeleteMessagesBeforeSnapshot, internalPersist, internalPersistAll, internalPersistAllAsync, internalPersistAsync, internalStashOverflowStrategy, journal, journalPluginId, lastSequenceNr, loadSnapshot, mailbox, onPersistFailure, onPersistRejected, onRecoveryFailure, onReplaySuccess, persist, persistAll, persistAllAsync, persistAsync, prepend, preRestart, receiveCommand, receiveRecover, recovery, recoveryFinished, recoveryRunning, saveSnapshot, snapshotPluginId, snapshotStore, snapshotterId, stash, unhandled, unstash, unstashAll, unstashAll
-
Methods inherited from class akka.actor.AbstractActor
akka$actor$Actor$_setter_$context_$eq, akka$actor$Actor$_setter_$self_$eq, context, emptyBehavior, getContext, getSelf, getSender, postRestart, preRestart, receive, receiveBuilder, self, sender, supervisorStrategy
-
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
-
Methods inherited from interface akka.actor.Actor
akka$actor$Actor$_setter_$context_$eq, akka$actor$Actor$_setter_$self_$eq, context, postRestart, receive, self, sender, supervisorStrategy
-
Methods inherited from interface akka.persistence.Eventsourced
akka$persistence$Eventsourced$$changeState, akka$persistence$Eventsourced$$flushBatch, akka$persistence$Eventsourced$$flushJournalBatch, akka$persistence$Eventsourced$$peekApplyHandler, akka$persistence$Eventsourced$$recovering, akka$persistence$Eventsourced$$setLastSequenceNr, akka$persistence$Eventsourced$$startRecovery, akka$persistence$Eventsourced$$stashInternally, akka$persistence$Eventsourced$$unstashInternally, akka$persistence$Eventsourced$$updateLastSequenceNr, akka$persistence$Eventsourced$$writeEventFailed, akka$persistence$Eventsourced$$writeEventRejected, akka$persistence$Eventsourced$$writeEventSucceeded
-
Methods inherited from interface akka.persistence.PersistenceIdentity
persistenceId
-
Methods inherited from interface akka.actor.StashSupport
context, self
-
-
-
-
Method Detail
-
preStart
public void preStart() throws Exception
- Specified by:
preStart
in interfaceActor
- Overrides:
preStart
in classAbstractActor
- Throws:
Exception
-
postStop
public void postStop() throws Exception
- Specified by:
postStop
in interfaceActor
- Specified by:
postStop
in interfaceUnrestrictedStash
- Overrides:
postStop
in classAbstractPersistentActor
- Throws:
Exception
-
handleRecover
protected void handleRecover(Object message)
- Specified by:
handleRecover
in classAbstractUntypedPersistentActor
-
newRaftActorRecoverySupport
protected org.opendaylight.controller.cluster.raft.RaftActorRecoverySupport newRaftActorRecoverySupport()
-
changeCurrentBehavior
protected void changeCurrentBehavior(RaftActorBehavior newBehavior)
-
handleNonRaftCommand
protected void handleNonRaftCommand(Object message)
Method exposed for subclasses to plug-in their logic. This method is invoked byhandleCommand(Object)
for messages which are not handled by this class. Subclasses overriding this class should fall back to this implementation for messages which they do not handle- Parameters:
message
- Incoming command message
-
handleCommand
@Deprecated protected void handleCommand(Object message)
Deprecated.This method is not final for testing purposes. DO NOT OVERRIDE IT, overridehandleNonRaftCommand(Object)
instead.Handles a message.- Specified by:
handleCommand
in classAbstractUntypedPersistentActor
-
newOnDemandRaftStateBuilder
protected OnDemandRaftState.AbstractBuilder<?,?> newOnDemandRaftStateBuilder()
-
newLeaderStateChanged
protected LeaderStateChanged newLeaderStateChanged(String memberId, String leaderId, short leaderPayloadVersion)
-
snapshotSequenceNr
public long snapshotSequenceNr()
- Specified by:
snapshotSequenceNr
in interfaceEventsourced
- Specified by:
snapshotSequenceNr
in interfaceSnapshotter
- Overrides:
snapshotSequenceNr
in classAbstractPersistentActor
-
persistData
protected final void persistData(ActorRef clientActor, Identifier identifier, Payload data, boolean batchHint)
Persists the given Payload in the journal and replicates to any followers. After successful completion,applyState(ActorRef, Identifier, Object)
is notified.- Parameters:
clientActor
- optional ActorRef that is provided via the applyState callbackidentifier
- the payload identifierdata
- the payload data to persistbatchHint
- if true, an attempt is made to delay immediate replication and batch the payload with subsequent payloads for efficiency. Otherwise the payload is immediately replicated.
-
getId
protected String getId()
-
getCurrentBehavior
protected RaftActorBehavior getCurrentBehavior()
-
isLeader
protected boolean isLeader()
Derived actors can call the isLeader method to check if the current RaftActor is the Leader or not.- Returns:
- true it this RaftActor is a Leader false otherwise
-
isLeaderActive
protected final boolean isLeaderActive()
-
isLeadershipTransferInProgress
protected boolean isLeadershipTransferInProgress()
-
getLeader
public ActorSelection getLeader()
Derived actor can call getLeader if they need a reference to the Leader. This would be useful for example in forwarding a request to an actor which is the leader- Returns:
- A reference to the leader if known, null otherwise
-
getLeaderId
protected final String getLeaderId()
Returns the id of the current leader.- Returns:
- the current leader's id
-
getRaftState
protected final RaftState getRaftState()
-
getCurrentTerm
protected Long getCurrentTerm()
-
getRaftActorContext
protected RaftActorContext getRaftActorContext()
-
updateConfigParams
protected void updateConfigParams(ConfigParams configParams)
-
persistence
public final DataPersistenceProvider persistence()
-
setPersistence
public void setPersistence(DataPersistenceProvider provider)
-
setPersistence
protected void setPersistence(boolean persistent)
-
setPeerAddress
protected void setPeerAddress(String peerId, String peerAddress)
setPeerAddress sets the address of a known peer at a later time.This is to account for situations where a we know that a peer exists but we do not know an address up-front. This may also be used in situations where a known peer starts off in a different location and we need to change it's address
Note that if the peerId does not match the list of peers passed to this actor during construction an IllegalStateException will be thrown.
-
applyState
protected abstract void applyState(ActorRef clientActor, Identifier identifier, Object data)
The applyState method will be called by the RaftActor when some data needs to be applied to the actor's state.- Parameters:
clientActor
- A reference to the client who sent this message. This is the same reference that was passed to persistData by the derived actor. clientActor may be null when the RaftActor is behaving as a follower or during recovery.identifier
- The identifier of the persisted data. This is also the same identifier that was passed to persistData by the derived actor. identifier may be null when the RaftActor is behaving as a follower or during recoverydata
- A piece of data that was persisted by the persistData call. This should NEVER be null.
-
getRaftActorRecoveryCohort
protected abstract @NonNull RaftActorRecoveryCohort getRaftActorRecoveryCohort()
Returns the RaftActorRecoveryCohort to participate in persistence recovery.
-
onRecoveryComplete
protected abstract void onRecoveryComplete()
This method is called when recovery is complete.
-
getRaftActorSnapshotCohort
protected abstract @NonNull RaftActorSnapshotCohort getRaftActorSnapshotCohort()
Returns the RaftActorSnapshotCohort to participate in snapshot captures.
-
onStateChanged
protected abstract void onStateChanged()
This method will be called by the RaftActor when the state of the RaftActor changes. The derived actor can then use methods like isLeader or getLeader to do something useful
-
getRoleChangeNotifier
protected abstract Optional<ActorRef> getRoleChangeNotifier()
Notifier Actor for this RaftActor to notify when a role change happens.- Returns:
- ActorRef - ActorRef of the notifier or Optional.absent if none.
-
onVotingStateChangeComplete
protected void onVotingStateChangeComplete()
This method is called on the leader when a voting change operation completes.
-
pauseLeader
protected void pauseLeader(Runnable operation)
This method is called prior to operations such as leadership transfer and actor shutdown when the leader must pause or stop its duties. This method allows derived classes to gracefully pause or finish current work prior to performing the operation. On completion of any work, the run method must be called on the given Runnable to proceed with the given operation. Important: the run method must be called on this actor's thread dispatcher as as it modifies internal state.The default implementation immediately runs the operation.
- Parameters:
operation
- the operation to run
-
unpauseLeader
protected void unpauseLeader()
This method is invoked when the actions hooked to the leader becoming paused failed to execute and the leader should resume normal operations.Note this method can be invoked even before the operation supplied to
pauseLeader(Runnable)
is invoked.
-
hasFollowers
protected boolean hasFollowers()
-
-