2 * Copyright (c) 2014 Cisco Systems, Inc. and others. All rights reserved.
4 * This program and the accompanying materials are made available under the
5 * terms of the Eclipse Public License v1.0 which accompanies this distribution,
6 * and is available at http://www.eclipse.org/legal/epl-v10.html
9 package org.opendaylight.controller.cluster.raft.messages;
11 import java.io.Externalizable;
12 import java.io.IOException;
13 import java.io.ObjectInput;
14 import java.io.ObjectOutput;
15 import org.opendaylight.controller.cluster.raft.RaftVersions;
18 * Reply for the AppendEntries message.
20 public class AppendEntriesReply extends AbstractRaftRPC {
21 private static final long serialVersionUID = -7487547356392536683L;
23 // true if follower contained entry matching
24 // prevLogIndex and prevLogTerm
25 private final boolean success;
27 // The index of the last entry in the followers log
28 // This will be used to set the matchIndex for the follower on the
30 private final long logLastIndex;
32 private final long logLastTerm;
34 // The followerId - this will be used to figure out which follower is
36 private final String followerId;
38 private final short payloadVersion;
40 private final short raftVersion;
42 private final boolean forceInstallSnapshot;
44 public AppendEntriesReply(String followerId, long term, boolean success, long logLastIndex, long logLastTerm,
45 short payloadVersion) {
46 this(followerId, term, success, logLastIndex, logLastTerm, payloadVersion, false);
49 public AppendEntriesReply(String followerId, long term, boolean success, long logLastIndex, long logLastTerm,
50 short payloadVersion, boolean forceInstallSnapshot) {
51 this(followerId, term, success, logLastIndex, logLastTerm, payloadVersion, forceInstallSnapshot,
52 RaftVersions.CURRENT_VERSION);
56 private AppendEntriesReply(String followerId, long term, boolean success, long logLastIndex, long logLastTerm,
57 short payloadVersion, boolean forceInstallSnapshot, short raftVersion) {
60 this.followerId = followerId;
61 this.success = success;
62 this.logLastIndex = logLastIndex;
63 this.logLastTerm = logLastTerm;
64 this.payloadVersion = payloadVersion;
65 this.forceInstallSnapshot = forceInstallSnapshot;
66 this.raftVersion = raftVersion;
69 public boolean isSuccess() {
73 public long getLogLastIndex() {
77 public long getLogLastTerm() {
81 public String getFollowerId() {
85 public short getPayloadVersion() {
86 return payloadVersion;
89 public short getRaftVersion() {
93 public boolean isForceInstallSnapshot() {
94 return forceInstallSnapshot;
98 public String toString() {
99 return "AppendEntriesReply [term=" + getTerm() + ", success=" + success + ", followerId=" + followerId
100 + ", logLastIndex=" + logLastIndex + ", logLastTerm=" + logLastTerm + ", forceInstallSnapshot="
101 + forceInstallSnapshot + ", payloadVersion=" + payloadVersion + ", raftVersion=" + raftVersion + "]";
104 private Object writeReplace() {
105 return new Proxy(this);
108 private static class Proxy implements Externalizable {
109 private static final long serialVersionUID = 1L;
111 private AppendEntriesReply appendEntriesReply;
113 // checkstyle flags the public modifier as redundant which really doesn't make sense since it clearly isn't
114 // redundant. It is explicitly needed for Java serialization to be able to create instances via reflection.
115 @SuppressWarnings("checkstyle:RedundantModifier")
119 Proxy(AppendEntriesReply appendEntriesReply) {
120 this.appendEntriesReply = appendEntriesReply;
124 public void writeExternal(ObjectOutput out) throws IOException {
125 out.writeShort(appendEntriesReply.raftVersion);
126 out.writeLong(appendEntriesReply.getTerm());
127 out.writeObject(appendEntriesReply.followerId);
128 out.writeBoolean(appendEntriesReply.success);
129 out.writeLong(appendEntriesReply.logLastIndex);
130 out.writeLong(appendEntriesReply.logLastTerm);
131 out.writeShort(appendEntriesReply.payloadVersion);
132 out.writeBoolean(appendEntriesReply.forceInstallSnapshot);
136 public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {
137 short raftVersion = in.readShort();
138 long term = in.readLong();
139 String followerId = (String) in.readObject();
140 boolean success = in.readBoolean();
141 long logLastIndex = in.readLong();
142 long logLastTerm = in.readLong();
143 short payloadVersion = in.readShort();
144 boolean forceInstallSnapshot = in.readBoolean();
146 appendEntriesReply = new AppendEntriesReply(followerId, term, success, logLastIndex, logLastTerm,
147 payloadVersion, forceInstallSnapshot, raftVersion);
150 private Object readResolve() {
151 return appendEntriesReply;