Fix warnings/javadocs in sal-distributed-datastore
[controller.git] / opendaylight / md-sal / sal-distributed-datastore / src / main / java / org / opendaylight / controller / cluster / datastore / jmx / mbeans / shard / ShardStats.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.datastore.jmx.mbeans.shard;
10
11 import akka.actor.ActorRef;
12 import akka.pattern.Patterns;
13 import akka.util.Timeout;
14 import com.google.common.base.Joiner;
15 import com.google.common.base.Stopwatch;
16 import com.google.common.cache.Cache;
17 import com.google.common.cache.CacheBuilder;
18 import java.text.SimpleDateFormat;
19 import java.util.Date;
20 import java.util.List;
21 import java.util.Map;
22 import java.util.concurrent.TimeUnit;
23 import java.util.concurrent.atomic.AtomicLong;
24 import org.opendaylight.controller.cluster.datastore.Shard;
25 import org.opendaylight.controller.cluster.raft.base.messages.InitiateCaptureSnapshot;
26 import org.opendaylight.controller.cluster.raft.client.messages.FollowerInfo;
27 import org.opendaylight.controller.cluster.raft.client.messages.GetOnDemandRaftState;
28 import org.opendaylight.controller.cluster.raft.client.messages.OnDemandRaftState;
29 import org.opendaylight.controller.md.sal.common.util.jmx.AbstractMXBean;
30 import scala.concurrent.Await;
31
32 /**
33  * Maintains statistics for a shard.
34  *
35  * @author  Basheeruddin syedbahm@cisco.com
36  */
37 public class ShardStats extends AbstractMXBean implements ShardStatsMXBean {
38     public static String JMX_CATEGORY_SHARD = "Shards";
39
40     private static final SimpleDateFormat DATE_FORMAT = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS");
41
42     private static final Cache<String, OnDemandRaftState> ONDEMAND_RAFT_STATE_CACHE =
43             CacheBuilder.newBuilder().expireAfterWrite(2, TimeUnit.SECONDS).build();
44
45     private long committedTransactionsCount;
46
47     private long readOnlyTransactionCount;
48
49     private long writeOnlyTransactionCount;
50
51     private long readWriteTransactionCount;
52
53     private long lastCommittedTransactionTime;
54
55     private long failedTransactionsCount;
56
57     private final AtomicLong failedReadTransactionsCount = new AtomicLong();
58
59     private long abortTransactionsCount;
60
61     private boolean followerInitialSyncStatus = false;
62
63     private Shard shard;
64
65     private String statRetrievalError;
66
67     private String statRetrievalTime;
68
69     private long leadershipChangeCount;
70
71     private long lastLeadershipChangeTime;
72
73     public ShardStats(final String shardName, final String mxBeanType) {
74         super(shardName, mxBeanType, JMX_CATEGORY_SHARD);
75     }
76
77     public void setShard(Shard shard) {
78         this.shard = shard;
79     }
80
81     @SuppressWarnings("checkstyle:IllegalCatch")
82     private OnDemandRaftState getOnDemandRaftState() {
83         String name = getShardName();
84         OnDemandRaftState state = ONDEMAND_RAFT_STATE_CACHE.getIfPresent(name);
85         if (state == null) {
86             statRetrievalError = null;
87             statRetrievalTime = null;
88
89             if (shard != null) {
90                 Timeout timeout = new Timeout(10, TimeUnit.SECONDS);
91                 try {
92                     Stopwatch timer = Stopwatch.createStarted();
93
94                     state = (OnDemandRaftState) Await.result(Patterns.ask(shard.getSelf(),
95                             GetOnDemandRaftState.INSTANCE, timeout), timeout.duration());
96
97                     statRetrievalTime = timer.stop().toString();
98                     ONDEMAND_RAFT_STATE_CACHE.put(name, state);
99                 } catch (Exception e) {
100                     statRetrievalError = e.toString();
101                 }
102             }
103
104             state = state != null ? state : OnDemandRaftState.builder().build();
105         }
106
107         return state;
108     }
109
110     @Override
111     public String getShardName() {
112         return getMBeanName();
113     }
114
115     @Override
116     public long getCommittedTransactionsCount() {
117         return committedTransactionsCount;
118     }
119
120     @Override
121     public String getLeader() {
122         return getOnDemandRaftState().getLeader();
123     }
124
125     @Override
126     public String getRaftState() {
127         return getOnDemandRaftState().getRaftState();
128     }
129
130     @Override
131     public long getReadOnlyTransactionCount() {
132         return readOnlyTransactionCount;
133     }
134
135     @Override
136     public long getWriteOnlyTransactionCount() {
137         return writeOnlyTransactionCount;
138     }
139
140     @Override
141     public long getReadWriteTransactionCount() {
142         return readWriteTransactionCount;
143     }
144
145     @Override
146     public long getLastLogIndex() {
147         return getOnDemandRaftState().getLastLogIndex();
148     }
149
150     @Override
151     public long getLastLogTerm() {
152         return getOnDemandRaftState().getLastLogTerm();
153     }
154
155     @Override
156     public long getCurrentTerm() {
157         return getOnDemandRaftState().getCurrentTerm();
158     }
159
160     @Override
161     public long getCommitIndex() {
162         return getOnDemandRaftState().getCommitIndex();
163     }
164
165     @Override
166     public long getLastApplied() {
167         return getOnDemandRaftState().getLastApplied();
168     }
169
170     @Override
171     public long getLastIndex() {
172         return getOnDemandRaftState().getLastIndex();
173     }
174
175     @Override
176     public long getLastTerm() {
177         return getOnDemandRaftState().getLastTerm();
178     }
179
180     @Override
181     public long getSnapshotIndex() {
182         return getOnDemandRaftState().getSnapshotIndex();
183     }
184
185     @Override
186     public long getSnapshotTerm() {
187         return getOnDemandRaftState().getSnapshotTerm();
188     }
189
190     @Override
191     public long getReplicatedToAllIndex() {
192         return getOnDemandRaftState().getReplicatedToAllIndex();
193     }
194
195     @Override
196     public String getVotedFor() {
197         return getOnDemandRaftState().getVotedFor();
198     }
199
200     @Override
201     public boolean isVoting() {
202         return getOnDemandRaftState().isVoting();
203     }
204
205     @Override
206     public String getPeerVotingStates() {
207         return toStringMap(getOnDemandRaftState().getPeerVotingStates());
208     }
209
210     @Override
211     public boolean isSnapshotCaptureInitiated() {
212         return getOnDemandRaftState().isSnapshotCaptureInitiated();
213     }
214
215     @Override
216     public String getLastCommittedTransactionTime() {
217         return DATE_FORMAT.format(new Date(lastCommittedTransactionTime));
218     }
219
220     @Override
221     public long getFailedTransactionsCount() {
222         return failedTransactionsCount;
223     }
224
225     @Override
226     public long getFailedReadTransactionsCount() {
227         return failedReadTransactionsCount.get();
228     }
229
230     @Override
231     public long getAbortTransactionsCount() {
232         return abortTransactionsCount;
233     }
234
235     public long incrementCommittedTransactionCount() {
236         return ++committedTransactionsCount;
237     }
238
239     public long incrementReadOnlyTransactionCount() {
240         return ++readOnlyTransactionCount;
241     }
242
243     public long incrementWriteOnlyTransactionCount() {
244         return ++writeOnlyTransactionCount;
245     }
246
247     public long incrementReadWriteTransactionCount() {
248         return ++readWriteTransactionCount;
249     }
250
251     public long incrementFailedTransactionsCount() {
252         return ++failedTransactionsCount;
253     }
254
255     public long incrementFailedReadTransactionsCount() {
256         return failedReadTransactionsCount.incrementAndGet();
257     }
258
259     public long incrementAbortTransactionsCount() {
260         return ++abortTransactionsCount;
261     }
262
263     public void setLastCommittedTransactionTime(final long lastCommittedTransactionTime) {
264         this.lastCommittedTransactionTime = lastCommittedTransactionTime;
265     }
266
267     @Override
268     public long getInMemoryJournalDataSize() {
269         return getOnDemandRaftState().getInMemoryJournalDataSize();
270     }
271
272     @Override
273     public long getInMemoryJournalLogSize() {
274         return getOnDemandRaftState().getInMemoryJournalLogSize();
275     }
276
277     /**
278      * Resets the counters related to transactions.
279      */
280     @Override
281     public void resetTransactionCounters() {
282         committedTransactionsCount = 0;
283
284         readOnlyTransactionCount = 0;
285
286         writeOnlyTransactionCount = 0;
287
288         readWriteTransactionCount = 0;
289
290         lastCommittedTransactionTime = 0;
291
292         failedTransactionsCount = 0;
293
294         failedReadTransactionsCount.set(0);
295
296         abortTransactionsCount = 0;
297
298     }
299
300     public void setFollowerInitialSyncStatus(boolean followerInitialSyncStatus) {
301         this.followerInitialSyncStatus = followerInitialSyncStatus;
302     }
303
304     @Override
305     public boolean getFollowerInitialSyncStatus() {
306         return followerInitialSyncStatus;
307     }
308
309     @Override
310     public List<FollowerInfo> getFollowerInfo() {
311         return getOnDemandRaftState().getFollowerInfoList();
312     }
313
314     @Override
315     public String getPeerAddresses() {
316         return toStringMap(getOnDemandRaftState().getPeerAddresses());
317     }
318
319     private static String toStringMap(Map<?, ?> map) {
320         return Joiner.on(", ").withKeyValueSeparator(": ").join(map);
321     }
322
323     @Override
324     public String getStatRetrievalTime() {
325         getOnDemandRaftState();
326         return statRetrievalTime;
327     }
328
329     @Override
330     public String getStatRetrievalError() {
331         getOnDemandRaftState();
332         return statRetrievalError;
333     }
334
335     @Override
336     public long getLeadershipChangeCount() {
337         return leadershipChangeCount;
338     }
339
340     public void incrementLeadershipChangeCount() {
341         leadershipChangeCount++;
342         lastLeadershipChangeTime = System.currentTimeMillis();
343     }
344
345     @Override
346     public String getLastLeadershipChangeTime() {
347         return DATE_FORMAT.format(new Date(lastLeadershipChangeTime));
348     }
349
350     @Override
351     public int getPendingTxCommitQueueSize() {
352         return shard.getPendingTxCommitQueueSize();
353     }
354
355     @Override
356     public int getTxCohortCacheSize() {
357         return shard.getCohortCacheSize();
358     }
359
360     @Override
361     public void captureSnapshot() {
362         if (shard != null) {
363             shard.getSelf().tell(new InitiateCaptureSnapshot(), ActorRef.noSender());
364         }
365     }
366 }