f0236a1abfa9cf0c12a9e6384f76ab4dc2df1333
[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 import com.google.common.annotations.VisibleForTesting;
17 import com.google.common.base.Supplier;
18 import com.google.common.collect.Maps;
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 = Maps.newHashMap(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         String peerAddress = peerAddresses.get(peerId);
150         if(peerAddress == null) {
151             peerAddress = configParams.getPeerAddressResolver().resolve(peerId);
152             peerAddresses.put(peerId, peerAddress);
153         }
154
155         return peerAddress;
156     }
157
158     @Override public ConfigParams getConfigParams() {
159         return configParams;
160     }
161
162     @Override public void addToPeers(String name, String address) {
163         peerAddresses.put(name, address);
164     }
165
166     @Override public void removePeer(String name) {
167         peerAddresses.remove(name);
168     }
169
170     @Override public ActorSelection getPeerActorSelection(String peerId) {
171         String peerAddress = getPeerAddress(peerId);
172         if(peerAddress != null){
173             return actorSelection(peerAddress);
174         }
175         return null;
176     }
177
178     @Override
179     public void setPeerAddress(String peerId, String peerAddress) {
180         if(peerAddresses.containsKey(peerId)) {
181             LOG.info("Peer address for peer {} set to {}", peerId, peerAddress);
182             peerAddresses.put(peerId, peerAddress);
183         }
184     }
185
186     @Override
187     public SnapshotManager getSnapshotManager() {
188         if(snapshotManager == null){
189             snapshotManager = new SnapshotManager(this, LOG);
190         }
191         return snapshotManager;
192     }
193
194     @Override
195     public long getTotalMemory() {
196         return totalMemoryRetriever != null ? totalMemoryRetriever.get() : Runtime.getRuntime().totalMemory();
197     }
198
199     @Override
200     public void setTotalMemoryRetriever(Supplier<Long> retriever) {
201         totalMemoryRetriever = retriever;
202     }
203
204     @Override
205     public boolean hasFollowers() {
206         return getPeerAddresses().keySet().size() > 0;
207     }
208
209     @Override
210     public DataPersistenceProvider getPersistenceProvider() {
211         return persistenceProvider;
212     }
213
214
215     @Override
216     public RaftPolicy getRaftPolicy() {
217         return configParams.getRaftPolicy();
218     }
219 }