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
8 package org.opendaylight.controller.cluster.raft.persisted;
10 import java.io.Serializable;
11 import java.util.List;
12 import org.opendaylight.controller.cluster.raft.ReplicatedLogEntry;
15 * Represents a snapshot of the raft data.
17 * @author Thomas Pantelis
19 public final class Snapshot implements Serializable {
21 * Implementations of this interface are used as the state payload for a snapshot.
23 * @author Thomas Pantelis
25 public interface State extends Serializable {
27 * Indicate whether the snapshot requires migration, i.e. a new snapshot should be created after recovery.
28 * Default implementation returns false, i.e. do not re-snapshot.
30 * @return True if complete recovery based upon this snapshot should trigger a new snapshot.
32 default boolean needsMigration() {
38 private static final long serialVersionUID = 1L;
40 private final State state;
41 private final List<ReplicatedLogEntry> unAppliedEntries;
42 private final long lastIndex;
43 private final long lastTerm;
44 private final long lastAppliedIndex;
45 private final long lastAppliedTerm;
46 private final long electionTerm;
47 private final String electionVotedFor;
48 private final ServerConfigurationPayload serverConfig;
50 private Snapshot(final State state, final List<ReplicatedLogEntry> unAppliedEntries, final long lastIndex,
51 final long lastTerm, final long lastAppliedIndex, final long lastAppliedTerm, final long electionTerm,
52 final String electionVotedFor, final ServerConfigurationPayload serverConfig) {
54 this.unAppliedEntries = unAppliedEntries;
55 this.lastIndex = lastIndex;
56 this.lastTerm = lastTerm;
57 this.lastAppliedIndex = lastAppliedIndex;
58 this.lastAppliedTerm = lastAppliedTerm;
59 this.electionTerm = electionTerm;
60 this.electionVotedFor = electionVotedFor;
61 this.serverConfig = serverConfig;
64 public static Snapshot create(final State state, final List<ReplicatedLogEntry> entries, final long lastIndex,
65 final long lastTerm, final long lastAppliedIndex, final long lastAppliedTerm, final long electionTerm,
66 final String electionVotedFor, final ServerConfigurationPayload serverConfig) {
67 return new Snapshot(state, entries, lastIndex, lastTerm, lastAppliedIndex, lastAppliedTerm,
68 electionTerm, electionVotedFor, serverConfig);
71 public State getState() {
75 public List<ReplicatedLogEntry> getUnAppliedEntries() {
76 return unAppliedEntries;
79 public long getLastTerm() {
83 public long getLastAppliedIndex() {
84 return lastAppliedIndex;
87 public long getLastAppliedTerm() {
88 return lastAppliedTerm;
91 public long getLastIndex() {
95 public long getElectionTerm() {
99 public String getElectionVotedFor() {
100 return electionVotedFor;
103 public ServerConfigurationPayload getServerConfiguration() {
108 public String toString() {
109 return "Snapshot [lastIndex=" + lastIndex + ", lastTerm=" + lastTerm + ", lastAppliedIndex=" + lastAppliedIndex
110 + ", lastAppliedTerm=" + lastAppliedTerm + ", unAppliedEntries size=" + unAppliedEntries.size()
111 + ", state=" + state + ", electionTerm=" + electionTerm + ", electionVotedFor="
112 + electionVotedFor + ", ServerConfigPayload=" + serverConfig + "]";
116 private Object writeReplace() {