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%2Fmessages%2FAppendEntries.java;h=896f3048bc83909512ef7d1493404c7352c00ab1;hb=15f11d24306fe2796411e8078a84fc82213bacf6;hp=9bb5029548a7b98cc66305e005beb0f213970320;hpb=8d9f9990edc7fb165795b8f50b4715f8e719fa75;p=controller.git diff --git a/opendaylight/md-sal/sal-akka-raft/src/main/java/org/opendaylight/controller/cluster/raft/messages/AppendEntries.java b/opendaylight/md-sal/sal-akka-raft/src/main/java/org/opendaylight/controller/cluster/raft/messages/AppendEntries.java index 9bb5029548..896f3048bc 100644 --- a/opendaylight/md-sal/sal-akka-raft/src/main/java/org/opendaylight/controller/cluster/raft/messages/AppendEntries.java +++ b/opendaylight/md-sal/sal-akka-raft/src/main/java/org/opendaylight/controller/cluster/raft/messages/AppendEntries.java @@ -8,15 +8,23 @@ package org.opendaylight.controller.cluster.raft.messages; -import org.opendaylight.controller.cluster.raft.ReplicatedLogEntry; - +import java.io.IOException; +import java.io.ObjectInputStream; +import java.io.ObjectOutputStream; +import java.util.ArrayList; import java.util.List; +import org.opendaylight.controller.cluster.raft.RaftVersions; +import org.opendaylight.controller.cluster.raft.ReplicatedLogEntry; /** * Invoked by leader to replicate log entries (§5.3); also used as * heartbeat (§5.2). */ public class AppendEntries extends AbstractRaftRPC { + private static final long serialVersionUID = 1L; + + private static final org.slf4j.Logger LOG = org.slf4j.LoggerFactory.getLogger(AppendEntries.class); + // So that follower can redirect clients private final String leaderId; @@ -28,19 +36,48 @@ public class AppendEntries extends AbstractRaftRPC { // log entries to store (empty for heartbeat; // may send more than one for efficiency) - private final List entries; + private transient List entries; // leader's commitIndex private final long leaderCommit; - public AppendEntries(long term, String leaderId, long prevLogIndex, - long prevLogTerm, List entries, long leaderCommit) { + // index which has been replicated successfully to all followers, -1 if none + private final long replicatedToAllIndex; + + private final short payloadVersion; + + public AppendEntries(long term, String leaderId, long prevLogIndex, long prevLogTerm, + List entries, long leaderCommit, long replicatedToAllIndex, short payloadVersion) { super(term); this.leaderId = leaderId; this.prevLogIndex = prevLogIndex; this.prevLogTerm = prevLogTerm; this.entries = entries; this.leaderCommit = leaderCommit; + this.replicatedToAllIndex = replicatedToAllIndex; + this.payloadVersion = payloadVersion; + } + + private void writeObject(ObjectOutputStream out) throws IOException { + out.writeShort(RaftVersions.CURRENT_VERSION); + out.defaultWriteObject(); + + out.writeInt(entries.size()); + for(ReplicatedLogEntry e: entries) { + out.writeObject(e); + } + } + + private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException { + in.readShort(); // raft version + + in.defaultReadObject(); + + int size = in.readInt(); + entries = new ArrayList<>(size); + for(int i = 0; i < size; i++) { + entries.add((ReplicatedLogEntry) in.readObject()); + } } public String getLeaderId() { @@ -63,13 +100,21 @@ public class AppendEntries extends AbstractRaftRPC { return leaderCommit; } - @Override public String toString() { - return "AppendEntries{" + - "leaderId='" + leaderId + '\'' + - ", prevLogIndex=" + prevLogIndex + - ", prevLogTerm=" + prevLogTerm + - ", entries=" + entries + - ", leaderCommit=" + leaderCommit + - '}'; + public long getReplicatedToAllIndex() { + return replicatedToAllIndex; + } + + public short getPayloadVersion() { + return payloadVersion; + } + + @Override + public String toString() { + StringBuilder builder = new StringBuilder(); + builder.append("AppendEntries [leaderId=").append(leaderId).append(", prevLogIndex=").append(prevLogIndex) + .append(", prevLogTerm=").append(prevLogTerm).append(", leaderCommit=").append(leaderCommit) + .append(", replicatedToAllIndex=").append(replicatedToAllIndex).append(", payloadVersion=") + .append(payloadVersion).append(", entries=").append(entries).append("]"); + return builder.toString(); } }