BUG 2185 : Make the Custom Raft Policy externally configurable
[controller.git] / opendaylight / md-sal / sal-akka-raft / src / main / java / org / opendaylight / controller / cluster / raft / RaftActorContextImpl.java
1 /*
2  * Copyright (c) 2014 Cisco Systems, Inc. and others.  All rights reserved.
3  *
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
7  */
8
9 package org.opendaylight.controller.cluster.raft;
10
11 import static com.google.common.base.Preconditions.checkState;
12 import akka.actor.ActorRef;
13 import akka.actor.ActorSelection;
14 import akka.actor.ActorSystem;
15 import akka.actor.Props;
16 import akka.actor.UntypedActorContext;
17 import com.google.common.annotations.VisibleForTesting;
18 import com.google.common.base.Supplier;
19 import java.util.Map;
20 import org.opendaylight.controller.cluster.DataPersistenceProvider;
21 import org.opendaylight.controller.cluster.raft.policy.RaftPolicy;
22 import org.slf4j.Logger;
23
24 public class RaftActorContextImpl implements RaftActorContext {
25
26     private final ActorRef actor;
27
28     private final UntypedActorContext context;
29
30     private final String id;
31
32     private final ElectionTerm termInformation;
33
34     private long commitIndex;
35
36     private long lastApplied;
37
38     private ReplicatedLog replicatedLog;
39
40     private final Map<String, String> peerAddresses;
41
42     private final Logger LOG;
43
44     private ConfigParams configParams;
45
46     @VisibleForTesting
47     private Supplier<Long> totalMemoryRetriever;
48
49     // Snapshot manager will need to be created on demand as it needs raft actor context which cannot
50     // be passed to it in the constructor
51     private SnapshotManager snapshotManager;
52
53     private final DataPersistenceProvider persistenceProvider;
54
55     private short payloadVersion;
56
57     public RaftActorContextImpl(ActorRef actor, UntypedActorContext context, String id,
58             ElectionTerm termInformation, long commitIndex, long lastApplied, Map<String, String> peerAddresses,
59             ConfigParams configParams, DataPersistenceProvider persistenceProvider, Logger logger) {
60         this.actor = actor;
61         this.context = context;
62         this.id = id;
63         this.termInformation = termInformation;
64         this.commitIndex = commitIndex;
65         this.lastApplied = lastApplied;
66         this.peerAddresses = peerAddresses;
67         this.configParams = configParams;
68         this.persistenceProvider = persistenceProvider;
69         this.LOG = logger;
70     }
71
72     void setPayloadVersion(short payloadVersion) {
73         this.payloadVersion = payloadVersion;
74     }
75
76     @Override
77     public short getPayloadVersion() {
78         return payloadVersion;
79     }
80
81     void setConfigParams(ConfigParams configParams) {
82         this.configParams = configParams;
83     }
84
85     @Override
86     public ActorRef actorOf(Props props){
87         return context.actorOf(props);
88     }
89
90     @Override
91     public ActorSelection actorSelection(String path){
92         return context.actorSelection(path);
93     }
94
95     @Override
96     public String getId() {
97         return id;
98     }
99
100     @Override
101     public ActorRef getActor() {
102         return actor;
103     }
104
105     @Override
106     public ElectionTerm getTermInformation() {
107         return termInformation;
108     }
109
110     @Override
111     public long getCommitIndex() {
112         return commitIndex;
113     }
114
115     @Override public void setCommitIndex(long commitIndex) {
116         this.commitIndex = commitIndex;
117     }
118
119     @Override
120     public long getLastApplied() {
121         return lastApplied;
122     }
123
124     @Override public void setLastApplied(long lastApplied) {
125         this.lastApplied = lastApplied;
126     }
127
128     @Override public void setReplicatedLog(ReplicatedLog replicatedLog) {
129         this.replicatedLog = replicatedLog;
130     }
131
132     @Override public ReplicatedLog getReplicatedLog() {
133         return replicatedLog;
134     }
135
136     @Override public ActorSystem getActorSystem() {
137         return context.system();
138     }
139
140     @Override public Logger getLogger() {
141         return this.LOG;
142     }
143
144     @Override public Map<String, String> getPeerAddresses() {
145         return peerAddresses;
146     }
147
148     @Override public String getPeerAddress(String peerId) {
149         return peerAddresses.get(peerId);
150     }
151
152     @Override public ConfigParams getConfigParams() {
153         return configParams;
154     }
155
156     @Override public void addToPeers(String name, String address) {
157         peerAddresses.put(name, address);
158     }
159
160     @Override public void removePeer(String name) {
161         peerAddresses.remove(name);
162     }
163
164     @Override public ActorSelection getPeerActorSelection(String peerId) {
165         String peerAddress = getPeerAddress(peerId);
166         if(peerAddress != null){
167             return actorSelection(peerAddress);
168         }
169         return null;
170     }
171
172     @Override public void setPeerAddress(String peerId, String peerAddress) {
173         LOG.info("Peer address for peer {} set to {}", peerId, peerAddress);
174         checkState(peerAddresses.containsKey(peerId), peerId + " is unknown");
175
176         peerAddresses.put(peerId, peerAddress);
177     }
178
179     @Override
180     public SnapshotManager getSnapshotManager() {
181         if(snapshotManager == null){
182             snapshotManager = new SnapshotManager(this, LOG);
183         }
184         return snapshotManager;
185     }
186
187     @Override
188     public long getTotalMemory() {
189         return totalMemoryRetriever != null ? totalMemoryRetriever.get() : Runtime.getRuntime().totalMemory();
190     }
191
192     @Override
193     public void setTotalMemoryRetriever(Supplier<Long> retriever) {
194         totalMemoryRetriever = retriever;
195     }
196
197     @Override
198     public boolean hasFollowers() {
199         return getPeerAddresses().keySet().size() > 0;
200     }
201
202     @Override
203     public DataPersistenceProvider getPersistenceProvider() {
204         return persistenceProvider;
205     }
206
207
208     @Override
209     public RaftPolicy getRaftPolicy() {
210         return configParams.getRaftPolicy();
211     }
212 }