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.IOException;
12 import java.io.ObjectInputStream;
13 import java.io.ObjectOutputStream;
14 import java.util.ArrayList;
15 import java.util.List;
16 import org.opendaylight.controller.cluster.raft.RaftVersions;
17 import org.opendaylight.controller.cluster.raft.ReplicatedLogEntry;
20 * Invoked by leader to replicate log entries (§5.3); also used as
23 public class AppendEntries extends AbstractRaftRPC {
24 private static final long serialVersionUID = 1L;
26 private static final org.slf4j.Logger LOG = org.slf4j.LoggerFactory.getLogger(AppendEntries.class);
28 // So that follower can redirect clients
29 private final String leaderId;
31 // Index of log entry immediately preceding new ones
32 private final long prevLogIndex;
34 // term of prevLogIndex entry
35 private final long prevLogTerm;
37 // log entries to store (empty for heartbeat;
38 // may send more than one for efficiency)
39 private transient List<ReplicatedLogEntry> entries;
41 // leader's commitIndex
42 private final long leaderCommit;
44 // index which has been replicated successfully to all followers, -1 if none
45 private final long replicatedToAllIndex;
47 private final short payloadVersion;
49 public AppendEntries(long term, String leaderId, long prevLogIndex, long prevLogTerm,
50 List<ReplicatedLogEntry> entries, long leaderCommit, long replicatedToAllIndex, short payloadVersion) {
52 this.leaderId = leaderId;
53 this.prevLogIndex = prevLogIndex;
54 this.prevLogTerm = prevLogTerm;
55 this.entries = entries;
56 this.leaderCommit = leaderCommit;
57 this.replicatedToAllIndex = replicatedToAllIndex;
58 this.payloadVersion = payloadVersion;
61 private void writeObject(ObjectOutputStream out) throws IOException {
62 out.writeShort(RaftVersions.CURRENT_VERSION);
63 out.defaultWriteObject();
65 out.writeInt(entries.size());
66 for(ReplicatedLogEntry e: entries) {
71 private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException {
72 in.readShort(); // raft version
74 in.defaultReadObject();
76 int size = in.readInt();
77 entries = new ArrayList<>(size);
78 for(int i = 0; i < size; i++) {
79 entries.add((ReplicatedLogEntry) in.readObject());
83 public String getLeaderId() {
87 public long getPrevLogIndex() {
91 public long getPrevLogTerm() {
95 public List<ReplicatedLogEntry> getEntries() {
99 public long getLeaderCommit() {
103 public long getReplicatedToAllIndex() {
104 return replicatedToAllIndex;
107 public short getPayloadVersion() {
108 return payloadVersion;
112 public String toString() {
113 StringBuilder builder = new StringBuilder();
114 builder.append("AppendEntries [leaderId=").append(leaderId).append(", prevLogIndex=").append(prevLogIndex)
115 .append(", prevLogTerm=").append(prevLogTerm).append(", leaderCommit=").append(leaderCommit)
116 .append(", replicatedToAllIndex=").append(replicatedToAllIndex).append(", payloadVersion=")
117 .append(payloadVersion).append(", entries=").append(entries).append("]");
118 return builder.toString();