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
9 package org.opendaylight.controller.cluster.datastore.jmx.mbeans.shard;
11 import java.text.SimpleDateFormat;
12 import java.util.Date;
13 import java.util.List;
14 import java.util.concurrent.atomic.AtomicLong;
15 import org.opendaylight.controller.md.sal.common.util.jmx.AbstractMXBean;
16 import org.opendaylight.controller.md.sal.common.util.jmx.QueuedNotificationManagerMXBeanImpl;
17 import org.opendaylight.controller.md.sal.common.util.jmx.ThreadExecutorStats;
18 import org.opendaylight.controller.md.sal.common.util.jmx.ThreadExecutorStatsMXBeanImpl;
19 import org.opendaylight.controller.md.sal.dom.store.impl.InMemoryDOMDataStore;
20 import org.opendaylight.yangtools.util.concurrent.ListenerNotificationQueueStats;
21 import org.opendaylight.yangtools.util.concurrent.QueuedNotificationManager;
24 * Maintains statistics for a shard.
26 * @author Basheeruddin syedbahm@cisco.com
28 public class ShardStats extends AbstractMXBean implements ShardStatsMXBean {
29 public static String JMX_CATEGORY_SHARD = "Shards";
31 private final AtomicLong committedTransactionsCount = new AtomicLong();
33 private final AtomicLong readOnlyTransactionCount = new AtomicLong();
35 private final AtomicLong writeOnlyTransactionCount = new AtomicLong();
37 private final AtomicLong readWriteTransactionCount = new AtomicLong();
39 private String leader;
41 private String raftState;
43 private volatile long lastLogTerm = -1L;
45 private volatile long lastLogIndex = -1L;
47 private volatile long currentTerm = -1L;
49 private volatile long commitIndex = -1L;
51 private volatile long lastApplied = -1L;
53 private volatile long lastCommittedTransactionTime;
55 private final AtomicLong failedTransactionsCount = new AtomicLong();
57 private final AtomicLong failedReadTransactionsCount = new AtomicLong();
59 private final AtomicLong abortTransactionsCount = new AtomicLong();
61 private ThreadExecutorStatsMXBeanImpl notificationExecutorStatsBean;
63 private QueuedNotificationManagerMXBeanImpl notificationManagerStatsBean;
65 private volatile long dataSize = 0;
67 private final SimpleDateFormat sdf =
68 new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS");
70 private boolean followerInitialSyncStatus = false;
72 public ShardStats(final String shardName, final String mxBeanType) {
73 super(shardName, mxBeanType, JMX_CATEGORY_SHARD);
76 public void setNotificationManager(final QueuedNotificationManager<?, ?> manager) {
77 this.notificationManagerStatsBean = new QueuedNotificationManagerMXBeanImpl(manager,
78 "notification-manager", getMBeanType(), getMBeanCategory());
80 this.notificationExecutorStatsBean = ThreadExecutorStatsMXBeanImpl.create(manager.getExecutor());
84 public String getShardName() {
85 return getMBeanName();
89 public long getCommittedTransactionsCount() {
90 return committedTransactionsCount.get();
94 public String getLeader() {
99 public String getRaftState() {
104 public long getReadOnlyTransactionCount() {
105 return readOnlyTransactionCount.get();
109 public long getWriteOnlyTransactionCount() {
110 return writeOnlyTransactionCount.get();
114 public long getReadWriteTransactionCount() {
115 return readWriteTransactionCount.get();
119 public long getLastLogIndex() {
124 public long getLastLogTerm() {
129 public long getCurrentTerm() {
134 public long getCommitIndex() {
139 public long getLastApplied() {
144 public String getLastCommittedTransactionTime() {
146 return sdf.format(new Date(lastCommittedTransactionTime));
150 public long getFailedTransactionsCount() {
151 return failedTransactionsCount.get();
155 public long getFailedReadTransactionsCount() {
156 return failedReadTransactionsCount.get();
160 public long getAbortTransactionsCount() {
161 return abortTransactionsCount.get();
164 public long incrementCommittedTransactionCount() {
165 return committedTransactionsCount.incrementAndGet();
168 public long incrementReadOnlyTransactionCount() {
169 return readOnlyTransactionCount.incrementAndGet();
172 public long incrementWriteOnlyTransactionCount() {
173 return writeOnlyTransactionCount.incrementAndGet();
176 public long incrementReadWriteTransactionCount() {
177 return readWriteTransactionCount.incrementAndGet();
180 public long incrementFailedTransactionsCount() {
181 return failedTransactionsCount.incrementAndGet();
184 public long incrementFailedReadTransactionsCount() {
185 return failedReadTransactionsCount.incrementAndGet();
188 public long incrementAbortTransactionsCount ()
190 return abortTransactionsCount.incrementAndGet();
193 public void setLeader(final String leader) {
194 this.leader = leader;
197 public void setRaftState(final String raftState) {
198 this.raftState = raftState;
201 public void setLastLogTerm(final long lastLogTerm) {
202 this.lastLogTerm = lastLogTerm;
205 public void setLastLogIndex(final long lastLogIndex) {
206 this.lastLogIndex = lastLogIndex;
209 public void setCurrentTerm(final long currentTerm) {
210 this.currentTerm = currentTerm;
213 public void setCommitIndex(final long commitIndex) {
214 this.commitIndex = commitIndex;
217 public void setLastApplied(final long lastApplied) {
218 this.lastApplied = lastApplied;
221 public void setLastCommittedTransactionTime(final long lastCommittedTransactionTime) {
222 this.lastCommittedTransactionTime = lastCommittedTransactionTime;
225 public void setInMemoryJournalDataSize(long dataSize){
226 this.dataSize = dataSize;
230 public long getInMemoryJournalDataSize(){
235 public ThreadExecutorStats getDataStoreExecutorStats() {
236 // FIXME: this particular thing does not work, as it really is DS-specific
241 public ThreadExecutorStats getNotificationMgrExecutorStats() {
242 return notificationExecutorStatsBean.toThreadExecutorStats();
246 public List<ListenerNotificationQueueStats> getCurrentNotificationMgrListenerQueueStats() {
247 return notificationManagerStatsBean.getCurrentListenerQueueStats();
251 public int getMaxNotificationMgrListenerQueueSize() {
252 return notificationManagerStatsBean.getMaxListenerQueueSize();
256 * resets the counters related to transactions
259 public void resetTransactionCounters(){
260 committedTransactionsCount.set(0);
262 readOnlyTransactionCount.set(0);
264 writeOnlyTransactionCount.set(0);
266 readWriteTransactionCount.set(0);
268 lastCommittedTransactionTime = 0;
270 failedTransactionsCount.set(0);
272 failedReadTransactionsCount.set(0);
274 abortTransactionsCount.set(0);
278 public void setDataStore(final InMemoryDOMDataStore store) {
279 setNotificationManager(store.getDataChangeListenerNotificationManager());
282 public void setFollowerInitialSyncStatus(boolean followerInitialSyncStatus) {
283 this.followerInitialSyncStatus = followerInitialSyncStatus;
287 public boolean getFollowerInitialSyncStatus() {
288 return followerInitialSyncStatus;