+ RequestVoteReply requestVoteReply);
+
+ /**
+ * Creates a random election duration
+ *
+ * @return
+ */
+ protected FiniteDuration electionDuration() {
+ long variance = new Random().nextInt(context.getConfigParams().getElectionTimeVariance());
+ return context.getConfigParams().getElectionTimeOutInterval().$plus(
+ new FiniteDuration(variance, TimeUnit.MILLISECONDS));
+ }
+
+ /**
+ * stop the scheduled election
+ */
+ protected void stopElection() {
+ if (electionCancel != null && !electionCancel.isCancelled()) {
+ electionCancel.cancel();
+ }
+ }
+
+ /**
+ * schedule a new election
+ *
+ * @param interval
+ */
+ protected void scheduleElection(FiniteDuration interval) {
+ stopElection();
+
+ // Schedule an election. When the scheduler triggers an ElectionTimeout
+ // message is sent to itself
+ electionCancel =
+ context.getActorSystem().scheduler().scheduleOnce(interval,
+ context.getActor(), new ElectionTimeout(),
+ context.getActorSystem().dispatcher(), context.getActor());
+ }
+
+ /**
+ * Get the current term
+ * @return
+ */
+ protected long currentTerm() {
+ return context.getTermInformation().getCurrentTerm();
+ }
+
+ /**
+ * Get the candidate for whom we voted in the current term
+ * @return
+ */
+ protected String votedFor() {
+ return context.getTermInformation().getVotedFor();
+ }
+
+ /**
+ * Get the actor associated with this behavior
+ * @return
+ */
+ protected ActorRef actor() {
+ return context.getActor();
+ }
+
+ /**
+ * Get the term from the last entry in the log
+ *
+ * @return
+ */
+ protected long lastTerm() {
+ return context.getReplicatedLog().lastTerm();
+ }
+
+ /**
+ * Get the index from the last entry in the log
+ *
+ * @return
+ */
+ protected long lastIndex() {
+ return context.getReplicatedLog().lastIndex();
+ }
+
+ /**
+ * Find the client request tracker for a specific logIndex
+ *
+ * @param logIndex
+ * @return
+ */
+ protected ClientRequestTracker findClientRequestTracker(long logIndex) {
+ return null;
+ }