X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?p=controller.git;a=blobdiff_plain;f=opendaylight%2Fmd-sal%2Fsal-distributed-datastore%2Fsrc%2Fmain%2Fjava%2Forg%2Fopendaylight%2Fcontroller%2Fcluster%2Fdatastore%2Fjmx%2Fmbeans%2Fshard%2FShardStats.java;h=5a4cc98011d146ca47b34b5dd361353b2b5c4ea3;hp=0a1964b0533bfc7ead91025e5792f5edda85b844;hb=27b168d3ca3807123b4877f1ad0662b2610f393d;hpb=c33b2b55b2eae406df001619885a0610800cb951 diff --git a/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/jmx/mbeans/shard/ShardStats.java b/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/jmx/mbeans/shard/ShardStats.java index 0a1964b053..5a4cc98011 100644 --- a/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/jmx/mbeans/shard/ShardStats.java +++ b/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/jmx/mbeans/shard/ShardStats.java @@ -8,19 +8,20 @@ package org.opendaylight.controller.cluster.datastore.jmx.mbeans.shard; +import akka.actor.ActorRef; +import com.google.common.base.Joiner; +import com.google.common.base.Joiner.MapJoiner; +import java.text.SimpleDateFormat; +import java.util.Date; import java.util.List; -import java.util.concurrent.ExecutorService; import java.util.concurrent.atomic.AtomicLong; - +import javax.annotation.Nullable; +import javax.annotation.concurrent.GuardedBy; +import org.opendaylight.controller.cluster.datastore.Shard; +import org.opendaylight.controller.cluster.raft.base.messages.InitiateCaptureSnapshot; +import org.opendaylight.controller.cluster.raft.client.messages.FollowerInfo; +import org.opendaylight.controller.cluster.raft.client.messages.OnDemandRaftState; import org.opendaylight.controller.md.sal.common.util.jmx.AbstractMXBean; -import org.opendaylight.controller.md.sal.common.util.jmx.QueuedNotificationManagerMXBeanImpl; -import org.opendaylight.controller.md.sal.common.util.jmx.ThreadExecutorStats; -import org.opendaylight.controller.md.sal.common.util.jmx.ThreadExecutorStatsMXBeanImpl; -import org.opendaylight.yangtools.util.concurrent.ListenerNotificationQueueStats; -import org.opendaylight.yangtools.util.concurrent.QueuedNotificationManager; - -import java.text.SimpleDateFormat; -import java.util.Date; /** * Maintains statistics for a shard. @@ -28,62 +29,63 @@ import java.util.Date; * @author Basheeruddin syedbahm@cisco.com */ public class ShardStats extends AbstractMXBean implements ShardStatsMXBean { - public static String JMX_CATEGORY_SHARD = "Shards"; - - private final AtomicLong committedTransactionsCount = new AtomicLong(); - - private final AtomicLong readOnlyTransactionCount = new AtomicLong(); - - private final AtomicLong writeOnlyTransactionCount = new AtomicLong(); + public static final String JMX_CATEGORY_SHARD = "Shards"; - private final AtomicLong readWriteTransactionCount = new AtomicLong(); + @GuardedBy("DATE_FORMAT") + private static final SimpleDateFormat DATE_FORMAT = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS"); - private String leader; + private static final MapJoiner MAP_JOINER = Joiner.on(", ").withKeyValueSeparator(": "); - private String raftState; + private final Shard shard; - private volatile long lastLogTerm = -1L; + private final OnDemandShardStateCache stateCache; - private volatile long lastLogIndex = -1L; + private long committedTransactionsCount; - private volatile long currentTerm = -1L; + private long readOnlyTransactionCount; - private volatile long commitIndex = -1L; + private long writeOnlyTransactionCount; - private volatile long lastApplied = -1L; + private long readWriteTransactionCount; - private volatile long lastCommittedTransactionTime; + private long lastCommittedTransactionTime; - private final AtomicLong failedTransactionsCount = new AtomicLong(); + private long failedTransactionsCount; private final AtomicLong failedReadTransactionsCount = new AtomicLong(); - private final AtomicLong abortTransactionsCount = new AtomicLong(); + private long abortTransactionsCount; - private ThreadExecutorStatsMXBeanImpl notificationExecutorStatsBean; + private boolean followerInitialSyncStatus = false; - private ThreadExecutorStatsMXBeanImpl dataStoreExecutorStatsBean; + private String statRetrievalError; - private QueuedNotificationManagerMXBeanImpl notificationManagerStatsBean; + private long leadershipChangeCount; - private final SimpleDateFormat sdf = - new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS"); + private long lastLeadershipChangeTime; - public ShardStats(String shardName, String mxBeanType) { + public ShardStats(final String shardName, final String mxBeanType, @Nullable final Shard shard) { super(shardName, mxBeanType, JMX_CATEGORY_SHARD); + this.shard = shard; + stateCache = new OnDemandShardStateCache(shardName, shard != null ? shard.self() : null); } - public void setDataStoreExecutor(ExecutorService dsExecutor) { - this.dataStoreExecutorStatsBean = new ThreadExecutorStatsMXBeanImpl(dsExecutor, - "notification-executor", getMBeanType(), getMBeanCategory()); + @SuppressWarnings("checkstyle:IllegalCatch") + private OnDemandRaftState getOnDemandRaftState() { + try { + final OnDemandRaftState state = stateCache.get(); + statRetrievalError = null; + return state; + } catch (Exception e) { + statRetrievalError = e.getCause().toString(); + return OnDemandRaftState.builder().build(); + } } - public void setNotificationManager(QueuedNotificationManager manager) { - this.notificationManagerStatsBean = new QueuedNotificationManagerMXBeanImpl(manager, - "notification-manager", getMBeanType(), getMBeanCategory()); - - this.notificationExecutorStatsBean = new ThreadExecutorStatsMXBeanImpl(manager.getExecutor(), - "data-store-executor", getMBeanType(), getMBeanCategory()); + private static String formatMillis(final long timeMillis) { + synchronized (DATE_FORMAT) { + return DATE_FORMAT.format(new Date(timeMillis)); + } } @Override @@ -93,68 +95,112 @@ public class ShardStats extends AbstractMXBean implements ShardStatsMXBean { @Override public long getCommittedTransactionsCount() { - return committedTransactionsCount.get(); + return committedTransactionsCount; } @Override public String getLeader() { - return leader; + return getOnDemandRaftState().getLeader(); } @Override public String getRaftState() { - return raftState; + return getOnDemandRaftState().getRaftState(); } @Override public long getReadOnlyTransactionCount() { - return readOnlyTransactionCount.get(); + return readOnlyTransactionCount; } @Override public long getWriteOnlyTransactionCount() { - return writeOnlyTransactionCount.get(); + return writeOnlyTransactionCount; } @Override public long getReadWriteTransactionCount() { - return readWriteTransactionCount.get(); + return readWriteTransactionCount; } @Override public long getLastLogIndex() { - return lastLogIndex; + return getOnDemandRaftState().getLastLogIndex(); } @Override public long getLastLogTerm() { - return lastLogTerm; + return getOnDemandRaftState().getLastLogTerm(); } @Override public long getCurrentTerm() { - return currentTerm; + return getOnDemandRaftState().getCurrentTerm(); } @Override public long getCommitIndex() { - return commitIndex; + return getOnDemandRaftState().getCommitIndex(); } @Override public long getLastApplied() { - return lastApplied; + return getOnDemandRaftState().getLastApplied(); } @Override - public String getLastCommittedTransactionTime() { + public long getLastIndex() { + return getOnDemandRaftState().getLastIndex(); + } + + @Override + public long getLastTerm() { + return getOnDemandRaftState().getLastTerm(); + } + + @Override + public long getSnapshotIndex() { + return getOnDemandRaftState().getSnapshotIndex(); + } + + @Override + public long getSnapshotTerm() { + return getOnDemandRaftState().getSnapshotTerm(); + } + + @Override + public long getReplicatedToAllIndex() { + return getOnDemandRaftState().getReplicatedToAllIndex(); + } + + @Override + public String getVotedFor() { + return getOnDemandRaftState().getVotedFor(); + } + + @Override + public boolean isVoting() { + return getOnDemandRaftState().isVoting(); + } + + @Override + public String getPeerVotingStates() { + return MAP_JOINER.join(getOnDemandRaftState().getPeerVotingStates()); + } + + @Override + public boolean isSnapshotCaptureInitiated() { + return getOnDemandRaftState().isSnapshotCaptureInitiated(); + } - return sdf.format(new Date(lastCommittedTransactionTime)); + @Override + public String getLastCommittedTransactionTime() { + return formatMillis(lastCommittedTransactionTime); } @Override public long getFailedTransactionsCount() { - return failedTransactionsCount.get(); + return failedTransactionsCount; } @Override @@ -164,110 +210,134 @@ public class ShardStats extends AbstractMXBean implements ShardStatsMXBean { @Override public long getAbortTransactionsCount() { - return abortTransactionsCount.get(); + return abortTransactionsCount; } public long incrementCommittedTransactionCount() { - return committedTransactionsCount.incrementAndGet(); + return ++committedTransactionsCount; } public long incrementReadOnlyTransactionCount() { - return readOnlyTransactionCount.incrementAndGet(); + return ++readOnlyTransactionCount; } public long incrementWriteOnlyTransactionCount() { - return writeOnlyTransactionCount.incrementAndGet(); + return ++writeOnlyTransactionCount; } public long incrementReadWriteTransactionCount() { - return readWriteTransactionCount.incrementAndGet(); + return ++readWriteTransactionCount; } public long incrementFailedTransactionsCount() { - return failedTransactionsCount.incrementAndGet(); + return ++failedTransactionsCount; } public long incrementFailedReadTransactionsCount() { return failedReadTransactionsCount.incrementAndGet(); } - public long incrementAbortTransactionsCount () - { - return abortTransactionsCount.incrementAndGet(); + public long incrementAbortTransactionsCount() { + return ++abortTransactionsCount; } - public void setLeader(String leader) { - this.leader = leader; + public void setLastCommittedTransactionTime(final long lastCommittedTransactionTime) { + this.lastCommittedTransactionTime = lastCommittedTransactionTime; } - public void setRaftState(String raftState) { - this.raftState = raftState; + @Override + public long getInMemoryJournalDataSize() { + return getOnDemandRaftState().getInMemoryJournalDataSize(); } - public void setLastLogTerm(long lastLogTerm) { - this.lastLogTerm = lastLogTerm; + @Override + public long getInMemoryJournalLogSize() { + return getOnDemandRaftState().getInMemoryJournalLogSize(); } - public void setLastLogIndex(long lastLogIndex) { - this.lastLogIndex = lastLogIndex; - } + /** + * Resets the counters related to transactions. + */ + @Override + public void resetTransactionCounters() { + committedTransactionsCount = 0; - public void setCurrentTerm(long currentTerm) { - this.currentTerm = currentTerm; - } + readOnlyTransactionCount = 0; - public void setCommitIndex(long commitIndex) { - this.commitIndex = commitIndex; - } + writeOnlyTransactionCount = 0; + + readWriteTransactionCount = 0; + + lastCommittedTransactionTime = 0; + + failedTransactionsCount = 0; + + failedReadTransactionsCount.set(0); + + abortTransactionsCount = 0; - public void setLastApplied(long lastApplied) { - this.lastApplied = lastApplied; } - public void setLastCommittedTransactionTime(long lastCommittedTransactionTime) { - this.lastCommittedTransactionTime = lastCommittedTransactionTime; + public void setFollowerInitialSyncStatus(final boolean followerInitialSyncStatus) { + this.followerInitialSyncStatus = followerInitialSyncStatus; } @Override - public ThreadExecutorStats getDataStoreExecutorStats() { - return dataStoreExecutorStatsBean.toThreadExecutorStats(); + public boolean getFollowerInitialSyncStatus() { + return followerInitialSyncStatus; } @Override - public ThreadExecutorStats getNotificationMgrExecutorStats() { - return notificationExecutorStatsBean.toThreadExecutorStats(); + public List getFollowerInfo() { + return getOnDemandRaftState().getFollowerInfoList(); } @Override - public List getCurrentNotificationMgrListenerQueueStats() { - return notificationManagerStatsBean.getCurrentListenerQueueStats(); + public String getPeerAddresses() { + return MAP_JOINER.join(getOnDemandRaftState().getPeerAddresses()); } @Override - public int getMaxNotificationMgrListenerQueueSize() { - return notificationManagerStatsBean.getMaxListenerQueueSize(); + public String getStatRetrievalTime() { + getOnDemandRaftState(); + return stateCache.getStatRetrievaelTime(); } - /** - * resets the counters related to transactions - */ @Override - public void resetTransactionCounters(){ - committedTransactionsCount.set(0); - - readOnlyTransactionCount.set(0); - - writeOnlyTransactionCount.set(0); + public String getStatRetrievalError() { + getOnDemandRaftState(); + return statRetrievalError; + } - readWriteTransactionCount.set(0); + @Override + public long getLeadershipChangeCount() { + return leadershipChangeCount; + } - lastCommittedTransactionTime = 0; + public void incrementLeadershipChangeCount() { + leadershipChangeCount++; + lastLeadershipChangeTime = System.currentTimeMillis(); + } - failedTransactionsCount.set(0); + @Override + public String getLastLeadershipChangeTime() { + return formatMillis(lastLeadershipChangeTime); + } - failedReadTransactionsCount.set(0); + @Override + public int getPendingTxCommitQueueSize() { + return shard != null ? shard.getPendingTxCommitQueueSize() : -1; + } - abortTransactionsCount.set(0); + @Override + public int getTxCohortCacheSize() { + return shard != null ? shard.getCohortCacheSize() : -1; + } + @Override + public void captureSnapshot() { + if (shard != null) { + shard.getSelf().tell(new InitiateCaptureSnapshot(), ActorRef.noSender()); + } } }