+ } else if (message instanceof FindLeader) {
+ getSender().tell(
+ new FindLeaderReply(getLeaderAddress()),
+ getSelf()
+ );
+ } else if (message instanceof GetOnDemandRaftState) {
+ onGetOnDemandRaftStats();
+ } else if (message instanceof InitiateCaptureSnapshot) {
+ captureSnapshot();
+ } else if (message instanceof SwitchBehavior) {
+ switchBehavior((SwitchBehavior) message);
+ } else if (message instanceof LeaderTransitioning) {
+ onLeaderTransitioning((LeaderTransitioning)message);
+ } else if (message instanceof Shutdown) {
+ onShutDown();
+ } else if (message instanceof Runnable) {
+ ((Runnable)message).run();
+ } else if (message instanceof NoopPayload) {
+ persistData(null, null, (NoopPayload) message, false);
+ } else if (message instanceof RequestLeadership) {
+ onRequestLeadership((RequestLeadership) message);
+ } else if (!possiblyHandleBehaviorMessage(message)) {
+ handleNonRaftCommand(message);
+ }
+ }
+
+ private void onRequestLeadership(final RequestLeadership message) {
+ LOG.debug("{}: onRequestLeadership {}", persistenceId(), message);
+ if (!isLeader()) {
+ // non-leader cannot satisfy leadership request
+ LOG.warn("{}: onRequestLeadership {} was sent to non-leader."
+ + " Current behavior: {}. Sending failure response",
+ persistenceId(), getCurrentBehavior().state());
+ message.getReplyTo().tell(new LeadershipTransferFailedException("Cannot transfer leader to "
+ + message.getRequestedFollowerId()
+ + ". RequestLeadership message was sent to non-leader " + persistenceId()), getSelf());
+ return;
+ }
+
+ final String requestedFollowerId = message.getRequestedFollowerId();
+ final ActorRef replyTo = message.getReplyTo();
+ initiateLeadershipTransfer(new RaftActorLeadershipTransferCohort.OnComplete() {
+ @Override
+ public void onSuccess(final ActorRef raftActorRef) {
+ // sanity check
+ if (!requestedFollowerId.equals(getLeaderId())) {
+ onFailure(raftActorRef);
+ }