X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?a=blobdiff_plain;f=opendaylight%2Fmd-sal%2Fsal-akka-raft%2Fsrc%2Fmain%2Fjava%2Forg%2Fopendaylight%2Fcontroller%2Fcluster%2Fraft%2Fbehaviors%2FLeader.java;h=fb8be8b891a315b420c6778f1691ba4712a069d7;hb=83140d53722ad77dd804f7b4d761a673110b83b3;hp=a647e17a201e2db6467895d68dbc0826b7772cb1;hpb=00570ac6512cdeea8d3c1da85e4a2e118a6f925c;p=controller.git diff --git a/opendaylight/md-sal/sal-akka-raft/src/main/java/org/opendaylight/controller/cluster/raft/behaviors/Leader.java b/opendaylight/md-sal/sal-akka-raft/src/main/java/org/opendaylight/controller/cluster/raft/behaviors/Leader.java index a647e17a20..fb8be8b891 100644 --- a/opendaylight/md-sal/sal-akka-raft/src/main/java/org/opendaylight/controller/cluster/raft/behaviors/Leader.java +++ b/opendaylight/md-sal/sal-akka-raft/src/main/java/org/opendaylight/controller/cluster/raft/behaviors/Leader.java @@ -137,6 +137,13 @@ public class Leader extends AbstractRaftActorBehavior { followerLogInformation .setNextIndex(appendEntriesReply.getLogLastIndex() + 1); } else { + + // TODO: When we find that the follower is out of sync with the + // Leader we simply decrement that followers next index by 1. + // Would it be possible to do better than this? The RAFT spec + // does not explicitly deal with it but may be something for us to + // think about + followerLogInformation.decrNextIndex(); } @@ -202,7 +209,7 @@ public class Leader extends AbstractRaftActorBehavior { // set currentTerm = T, convert to follower (§5.1) // This applies to all RPC messages and responses if (rpc.getTerm() > context.getTermInformation().getCurrentTerm()) { - context.getTermInformation().update(rpc.getTerm(), null); + context.getTermInformation().updateAndPersist(rpc.getTerm(), null); return RaftState.Follower; } } @@ -215,7 +222,6 @@ public class Leader extends AbstractRaftActorBehavior { } else if (message instanceof Replicate) { replicate((Replicate) message); } else if (message instanceof InstallSnapshotReply){ - // FIXME : Should I be checking the term here too? handleInstallSnapshotReply( (InstallSnapshotReply) message); } @@ -281,6 +287,12 @@ public class Leader extends AbstractRaftActorBehavior { List entries = Collections.emptyList(); if(context.getReplicatedLog().isPresent(nextIndex)){ + // TODO: Instead of sending all entries from nextIndex + // only send a fixed number of entries to each follower + // This is to avoid the situation where there are a lot of + // entries to install for a fresh follower or to a follower + // that has fallen too far behind with the log but yet is not + // eligible to receive a snapshot entries = context.getReplicatedLog().getFrom(nextIndex); } @@ -295,6 +307,11 @@ public class Leader extends AbstractRaftActorBehavior { } } + /** + * An installSnapshot is scheduled at a interval that is a multiple of + * a HEARTBEAT_INTERVAL. This is to avoid the need to check for installing + * snapshots at every heartbeat. + */ private void installSnapshotIfNeeded(){ for (String followerId : followerToActor.keySet()) { ActorSelection followerActor =