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=b01eb099a5707975515c00d7c661725ff8f16400;hp=577a03c3a35ae018d4f33ecdc7bedb30022c474e;hb=a8000ee3b6071fa3b83500a39fc60ab3a9c5f085;hpb=06e889c9c78457590b6a0b62d89a6b9f44242a9f 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 577a03c3a3..b01eb099a5 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,17 +8,26 @@ package org.opendaylight.controller.cluster.datastore.jmx.mbeans.shard; +import akka.actor.ActorRef; +import akka.pattern.Patterns; +import akka.util.Timeout; +import com.google.common.base.Joiner; +import com.google.common.base.Stopwatch; +import com.google.common.cache.Cache; +import com.google.common.cache.CacheBuilder; import java.text.SimpleDateFormat; import java.util.Date; import java.util.List; +import java.util.Map; +import java.util.concurrent.TimeUnit; import java.util.concurrent.atomic.AtomicLong; +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.GetOnDemandRaftState; +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.controller.md.sal.dom.store.impl.InMemoryDOMDataStore; -import org.opendaylight.yangtools.util.concurrent.ListenerNotificationQueueStats; -import org.opendaylight.yangtools.util.concurrent.QueuedNotificationManager; +import scala.concurrent.Await; /** * Maintains statistics for a shard. @@ -28,6 +37,11 @@ import org.opendaylight.yangtools.util.concurrent.QueuedNotificationManager; public class ShardStats extends AbstractMXBean implements ShardStatsMXBean { public static String JMX_CATEGORY_SHARD = "Shards"; + private static final SimpleDateFormat DATE_FORMAT = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS"); + + private static final Cache onDemandRaftStateCache = + CacheBuilder.newBuilder().expireAfterWrite(2, TimeUnit.SECONDS).build(); + private long committedTransactionsCount; private long readOnlyTransactionCount; @@ -36,20 +50,6 @@ public class ShardStats extends AbstractMXBean implements ShardStatsMXBean { private long readWriteTransactionCount; - private String leader; - - private String raftState; - - private long lastLogTerm = -1L; - - private long lastLogIndex = -1L; - - private long currentTerm = -1L; - - private long commitIndex = -1L; - - private long lastApplied = -1L; - private long lastCommittedTransactionTime; private long failedTransactionsCount; @@ -58,26 +58,52 @@ public class ShardStats extends AbstractMXBean implements ShardStatsMXBean { private long abortTransactionsCount; - private ThreadExecutorStatsMXBeanImpl notificationExecutorStatsBean; + private boolean followerInitialSyncStatus = false; + + private Shard shard; - private QueuedNotificationManagerMXBeanImpl notificationManagerStatsBean; + private String statRetrievalError; - private long dataSize = 0; + private String statRetrievalTime; - private final SimpleDateFormat sdf = - new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS"); + private long leadershipChangeCount; - private boolean followerInitialSyncStatus = false; + private long lastLeadershipChangeTime; public ShardStats(final String shardName, final String mxBeanType) { super(shardName, mxBeanType, JMX_CATEGORY_SHARD); } - public void setNotificationManager(final QueuedNotificationManager manager) { - this.notificationManagerStatsBean = new QueuedNotificationManagerMXBeanImpl(manager, - "notification-manager", getMBeanType(), getMBeanCategory()); + public void setShard(Shard shard) { + this.shard = shard; + } + + private OnDemandRaftState getOnDemandRaftState() { + String name = getShardName(); + OnDemandRaftState state = onDemandRaftStateCache.getIfPresent(name); + if(state == null) { + statRetrievalError = null; + statRetrievalTime = null; + + if(shard != null) { + Timeout timeout = new Timeout(10, TimeUnit.SECONDS); + try { + Stopwatch timer = Stopwatch.createStarted(); + + state = (OnDemandRaftState) Await.result(Patterns.ask(shard.getSelf(), + GetOnDemandRaftState.INSTANCE, timeout), timeout.duration()); + + statRetrievalTime = timer.stop().toString(); + onDemandRaftStateCache.put(name, state); + } catch (Exception e) { + statRetrievalError = e.toString(); + } + } - this.notificationExecutorStatsBean = ThreadExecutorStatsMXBeanImpl.create(manager.getExecutor()); + state = state != null ? state : OnDemandRaftState.builder().build(); + } + + return state; } @Override @@ -92,12 +118,12 @@ public class ShardStats extends AbstractMXBean implements ShardStatsMXBean { @Override public String getLeader() { - return leader; + return getOnDemandRaftState().getLeader(); } @Override public String getRaftState() { - return raftState; + return getOnDemandRaftState().getRaftState(); } @Override @@ -117,33 +143,76 @@ public class ShardStats extends AbstractMXBean implements ShardStatsMXBean { @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(); + } - return sdf.format(new Date(lastCommittedTransactionTime)); + @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 toStringMap(getOnDemandRaftState().getPeerVotingStates()); + } + + @Override + public boolean isSnapshotCaptureInitiated() { + return getOnDemandRaftState().isSnapshotCaptureInitiated(); + } + + @Override + public String getLastCommittedTransactionTime() { + return DATE_FORMAT.format(new Date(lastCommittedTransactionTime)); } @Override @@ -190,66 +259,18 @@ public class ShardStats extends AbstractMXBean implements ShardStatsMXBean { return ++abortTransactionsCount; } - public void setLeader(final String leader) { - this.leader = leader; - } - - public void setRaftState(final String raftState) { - this.raftState = raftState; - } - - public void setLastLogTerm(final long lastLogTerm) { - this.lastLogTerm = lastLogTerm; - } - - public void setLastLogIndex(final long lastLogIndex) { - this.lastLogIndex = lastLogIndex; - } - - public void setCurrentTerm(final long currentTerm) { - this.currentTerm = currentTerm; - } - - public void setCommitIndex(final long commitIndex) { - this.commitIndex = commitIndex; - } - - public void setLastApplied(final long lastApplied) { - this.lastApplied = lastApplied; - } - public void setLastCommittedTransactionTime(final long lastCommittedTransactionTime) { this.lastCommittedTransactionTime = lastCommittedTransactionTime; } - public void setInMemoryJournalDataSize(long dataSize){ - this.dataSize = dataSize; - } - @Override public long getInMemoryJournalDataSize(){ - return dataSize; - } - - @Override - public ThreadExecutorStats getDataStoreExecutorStats() { - // FIXME: this particular thing does not work, as it really is DS-specific - return null; - } - - @Override - public ThreadExecutorStats getNotificationMgrExecutorStats() { - return notificationExecutorStatsBean.toThreadExecutorStats(); + return getOnDemandRaftState().getInMemoryJournalDataSize(); } @Override - public List getCurrentNotificationMgrListenerQueueStats() { - return notificationManagerStatsBean.getCurrentListenerQueueStats(); - } - - @Override - public int getMaxNotificationMgrListenerQueueSize() { - return notificationManagerStatsBean.getMaxListenerQueueSize(); + public long getInMemoryJournalLogSize() { + return getOnDemandRaftState().getInMemoryJournalLogSize(); } /** @@ -275,10 +296,6 @@ public class ShardStats extends AbstractMXBean implements ShardStatsMXBean { } - public void setDataStore(final InMemoryDOMDataStore store) { - setNotificationManager(store.getDataChangeListenerNotificationManager()); - } - public void setFollowerInitialSyncStatus(boolean followerInitialSyncStatus) { this.followerInitialSyncStatus = followerInitialSyncStatus; } @@ -287,4 +304,62 @@ public class ShardStats extends AbstractMXBean implements ShardStatsMXBean { public boolean getFollowerInitialSyncStatus() { return followerInitialSyncStatus; } + + @Override + public List getFollowerInfo() { + return getOnDemandRaftState().getFollowerInfoList(); + } + + @Override + public String getPeerAddresses() { + return toStringMap(getOnDemandRaftState().getPeerAddresses()); + } + + private static String toStringMap(Map map) { + return Joiner.on(", ").withKeyValueSeparator(": ").join(map); + } + + @Override + public String getStatRetrievalTime() { + getOnDemandRaftState(); + return statRetrievalTime; + } + + @Override + public String getStatRetrievalError() { + getOnDemandRaftState(); + return statRetrievalError; + } + + @Override + public long getLeadershipChangeCount() { + return leadershipChangeCount; + } + + public void incrementLeadershipChangeCount() { + leadershipChangeCount++; + lastLeadershipChangeTime = System.currentTimeMillis(); + } + + @Override + public String getLastLeadershipChangeTime() { + return DATE_FORMAT.format(new Date(lastLeadershipChangeTime)); + } + + @Override + public int getPendingTxCommitQueueSize() { + return shard.getPendingTxCommitQueueSize(); + } + + @Override + public int getTxCohortCacheSize() { + return shard.getCohortCacheSize(); + } + + @Override + public void captureSnapshot() { + if(shard != null) { + shard.getSelf().tell(new InitiateCaptureSnapshot(), ActorRef.noSender()); + } + } }