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