package org.opendaylight.controller.cluster.raft.messages;
+import java.io.Externalizable;
import java.io.IOException;
-import java.io.ObjectInputStream;
-import java.io.ObjectOutputStream;
+import java.io.ObjectInput;
+import java.io.ObjectOutput;
import java.util.ArrayList;
import java.util.List;
-import org.opendaylight.controller.cluster.raft.RaftVersions;
import org.opendaylight.controller.cluster.raft.ReplicatedLogEntry;
+import org.opendaylight.controller.cluster.raft.ReplicatedLogImplEntry;
+import org.opendaylight.controller.cluster.raft.protobuff.client.messages.Payload;
/**
* Invoked by leader to replicate log entries (ยง5.3); also used as
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;
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() {
return leaderId;
}
.append(payloadVersion).append(", entries=").append(entries).append("]");
return builder.toString();
}
+
+ private Object writeReplace() {
+ return new Proxy(this);
+ }
+
+ private static class Proxy implements Externalizable {
+ private static final long serialVersionUID = 1L;
+
+ private AppendEntries appendEntries;
+
+ public Proxy() {
+ }
+
+ Proxy(AppendEntries appendEntries) {
+ this.appendEntries = appendEntries;
+ }
+
+ @Override
+ public void writeExternal(ObjectOutput out) throws IOException {
+ out.writeLong(appendEntries.getTerm());
+ out.writeObject(appendEntries.leaderId);
+ out.writeLong(appendEntries.prevLogTerm);
+ out.writeLong(appendEntries.prevLogIndex);
+ out.writeLong(appendEntries.leaderCommit);
+ out.writeLong(appendEntries.replicatedToAllIndex);
+ out.writeShort(appendEntries.payloadVersion);
+
+ out.writeInt(appendEntries.entries.size());
+ for(ReplicatedLogEntry e: appendEntries.entries) {
+ out.writeLong(e.getIndex());
+ out.writeLong(e.getTerm());
+ out.writeObject(e.getData());
+ }
+ }
+
+ @Override
+ public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {
+ long term = in.readLong();
+ String leaderId = (String) in.readObject();
+ long prevLogTerm = in.readLong();
+ long prevLogIndex = in.readLong();
+ long leaderCommit = in.readLong();
+ long replicatedToAllIndex = in.readLong();
+ short payloadVersion = in.readShort();
+
+ int size = in.readInt();
+ List<ReplicatedLogEntry> entries = new ArrayList<>(size);
+ for(int i = 0; i < size; i++) {
+ entries.add(new ReplicatedLogImplEntry(in.readLong(), in.readLong(), (Payload) in.readObject()));
+ }
+
+ appendEntries = new AppendEntries(term, leaderId, prevLogIndex, prevLogTerm, entries, leaderCommit,
+ replicatedToAllIndex, payloadVersion);
+ }
+
+ private Object readResolve() {
+ return appendEntries;
+ }
+ }
}
package org.opendaylight.controller.cluster.raft.messages;
+import java.io.Externalizable;
+import java.io.IOException;
+import java.io.ObjectInput;
+import java.io.ObjectOutput;
import org.opendaylight.controller.cluster.raft.RaftVersions;
/**
private final short payloadVersion;
- private final short raftVersion = RaftVersions.CURRENT_VERSION;
+ private final short raftVersion;
private final boolean forceInstallSnapshot;
}
public AppendEntriesReply(String followerId, long term, boolean success, long logLastIndex, long logLastTerm,
- short payloadVersion, boolean forceInstallSnapshot) {
+ short payloadVersion, boolean forceInstallSnapshot) {
+ this(followerId, term, success, logLastIndex, logLastTerm, payloadVersion, forceInstallSnapshot,
+ RaftVersions.CURRENT_VERSION);
+
+ }
+
+ private AppendEntriesReply(String followerId, long term, boolean success, long logLastIndex, long logLastTerm,
+ short payloadVersion, boolean forceInstallSnapshot, short raftVersion) {
super(term);
this.followerId = followerId;
this.logLastTerm = logLastTerm;
this.payloadVersion = payloadVersion;
this.forceInstallSnapshot = forceInstallSnapshot;
+ this.raftVersion = raftVersion;
}
public boolean isSuccess() {
+ ", logLastIndex=" + logLastIndex + ", logLastTerm=" + logLastTerm + ", forceInstallSnapshot="
+ forceInstallSnapshot + ", payloadVersion=" + payloadVersion + ", raftVersion=" + raftVersion + "]";
}
+
+ private Object writeReplace() {
+ return new Proxy(this);
+ }
+
+ private static class Proxy implements Externalizable {
+ private static final long serialVersionUID = 1L;
+
+ private AppendEntriesReply appendEntriesReply;
+
+ public Proxy() {
+ }
+
+ Proxy(AppendEntriesReply appendEntriesReply) {
+ this.appendEntriesReply = appendEntriesReply;
+ }
+
+ @Override
+ public void writeExternal(ObjectOutput out) throws IOException {
+ out.writeShort(appendEntriesReply.raftVersion);
+ out.writeLong(appendEntriesReply.getTerm());
+ out.writeObject(appendEntriesReply.followerId);
+ out.writeBoolean(appendEntriesReply.success);
+ out.writeLong(appendEntriesReply.logLastIndex);
+ out.writeLong(appendEntriesReply.logLastTerm);
+ out.writeShort(appendEntriesReply.payloadVersion);
+ out.writeBoolean(appendEntriesReply.forceInstallSnapshot);
+ }
+
+ @Override
+ public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {
+ short raftVersion = in.readShort();
+ long term = in.readLong();
+ String followerId = (String) in.readObject();
+ boolean success = in.readBoolean();
+ long logLastIndex = in.readLong();
+ long logLastTerm = in.readLong();
+ short payloadVersion = in.readShort();
+ boolean forceInstallSnapshot = in.readBoolean();
+
+ appendEntriesReply = new AppendEntriesReply(followerId, term, success, logLastIndex, logLastTerm,
+ payloadVersion, forceInstallSnapshot, raftVersion);
+ }
+
+ private Object readResolve() {
+ return appendEntriesReply;
+ }
+ }
}