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=fb59b7643f09f77ca19013a4cda3051bf4320bd8;hp=0959c2a95949a6332fd66859f0796e103746c5d8;hb=4349b034606957d3e876b82b14a292e6739a986a;hpb=e827871c85301a95279493a031e63a72756ac818 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 0959c2a959..fb59b7643f 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,31 @@ 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.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.concurrent.ExecutorService; +import java.util.Map; +import java.util.concurrent.TimeUnit; import java.util.concurrent.atomic.AtomicLong; - +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 java.text.SimpleDateFormat; -import java.util.Date; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import scala.concurrent.Await; /** * Maintains statistics for a shard. @@ -30,60 +42,84 @@ import java.util.Date; public class ShardStats extends AbstractMXBean implements ShardStatsMXBean { public static String JMX_CATEGORY_SHARD = "Shards"; - private final AtomicLong committedTransactionsCount = new AtomicLong(); + private static final Logger LOG = LoggerFactory.getLogger(ShardStats.class); - private final AtomicLong readOnlyTransactionCount = new AtomicLong(); + private static final SimpleDateFormat DATE_FORMAT = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS"); - private final AtomicLong writeOnlyTransactionCount = new AtomicLong(); + private static final Cache onDemandRaftStateCache = + CacheBuilder.newBuilder().expireAfterWrite(2, TimeUnit.SECONDS).build(); - private final AtomicLong readWriteTransactionCount = new AtomicLong(); + private long committedTransactionsCount; - private String leader; + private long readOnlyTransactionCount; - private String raftState; + private long writeOnlyTransactionCount; - private volatile long lastLogTerm = -1L; + private long readWriteTransactionCount; - private volatile long lastLogIndex = -1L; + private long lastCommittedTransactionTime; - private volatile long currentTerm = -1L; - - private volatile long commitIndex = -1L; - - private volatile long lastApplied = -1L; - - private volatile 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 ThreadExecutorStatsMXBeanImpl dataStoreExecutorStatsBean; - private QueuedNotificationManagerMXBeanImpl notificationManagerStatsBean; - private final SimpleDateFormat sdf = - new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS"); + private boolean followerInitialSyncStatus = false; - public ShardStats(String shardName, String mxBeanType) { - super(shardName, mxBeanType, JMX_CATEGORY_SHARD); - } + private ActorRef shardActor; + + private String statRetrievalError; - public void setDataStoreExecutor(ExecutorService dsExecutor) { - this.dataStoreExecutorStatsBean = ThreadExecutorStatsMXBeanImpl.create(dsExecutor); + private String statRetrievalTime; + + public ShardStats(final String shardName, final String mxBeanType) { + super(shardName, mxBeanType, JMX_CATEGORY_SHARD); } - public void setNotificationManager(QueuedNotificationManager manager) { + public void setNotificationManager(final QueuedNotificationManager manager) { this.notificationManagerStatsBean = new QueuedNotificationManagerMXBeanImpl(manager, "notification-manager", getMBeanType(), getMBeanCategory()); this.notificationExecutorStatsBean = ThreadExecutorStatsMXBeanImpl.create(manager.getExecutor()); } + public void setShardActor(ActorRef shardActor) { + this.shardActor = shardActor; + } + + private OnDemandRaftState getOnDemandRaftState() { + String name = getShardName(); + OnDemandRaftState state = onDemandRaftStateCache.getIfPresent(name); + if(state == null) { + statRetrievalError = null; + statRetrievalTime = null; + + if(shardActor != null) { + Timeout timeout = new Timeout(10, TimeUnit.SECONDS); + try { + Stopwatch timer = Stopwatch.createStarted(); + + state = (OnDemandRaftState) Await.result(Patterns.ask(shardActor, + GetOnDemandRaftState.INSTANCE, timeout), timeout.duration()); + + statRetrievalTime = timer.stop().toString(); + onDemandRaftStateCache.put(name, state); + } catch (Exception e) { + statRetrievalError = e.toString(); + } + } + + state = state != null ? state : OnDemandRaftState.builder().build(); + } + + return state; + } + @Override public String getShardName() { return getMBeanName(); @@ -91,68 +127,102 @@ 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 isSnapshotCaptureInitiated() { + return getOnDemandRaftState().isSnapshotCaptureInitiated(); + } - return sdf.format(new Date(lastCommittedTransactionTime)); + @Override + public String getLastCommittedTransactionTime() { + return DATE_FORMAT.format(new Date(lastCommittedTransactionTime)); } @Override public long getFailedTransactionsCount() { - return failedTransactionsCount.get(); + return failedTransactionsCount; } @Override @@ -162,27 +232,27 @@ 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() { @@ -191,45 +261,27 @@ public class ShardStats extends AbstractMXBean implements ShardStatsMXBean { public long incrementAbortTransactionsCount () { - return abortTransactionsCount.incrementAndGet(); + return ++abortTransactionsCount; } - public void setLeader(String leader) { - this.leader = leader; - } - - public void setRaftState(String raftState) { - this.raftState = raftState; - } - - public void setLastLogTerm(long lastLogTerm) { - this.lastLogTerm = lastLogTerm; - } - - public void setLastLogIndex(long lastLogIndex) { - this.lastLogIndex = lastLogIndex; - } - - public void setCurrentTerm(long currentTerm) { - this.currentTerm = currentTerm; - } - - public void setCommitIndex(long commitIndex) { - this.commitIndex = commitIndex; + public void setLastCommittedTransactionTime(final long lastCommittedTransactionTime) { + this.lastCommittedTransactionTime = lastCommittedTransactionTime; } - public void setLastApplied(long lastApplied) { - this.lastApplied = lastApplied; + @Override + public long getInMemoryJournalDataSize(){ + return getOnDemandRaftState().getInMemoryJournalDataSize(); } - public void setLastCommittedTransactionTime(long lastCommittedTransactionTime) { - this.lastCommittedTransactionTime = lastCommittedTransactionTime; + @Override + public long getInMemoryJournalLogSize() { + return getOnDemandRaftState().getInMemoryJournalLogSize(); } @Override public ThreadExecutorStats getDataStoreExecutorStats() { - return dataStoreExecutorStatsBean == null ? null : - dataStoreExecutorStatsBean.toThreadExecutorStats(); + // FIXME: this particular thing does not work, as it really is DS-specific + return null; } @Override @@ -252,21 +304,66 @@ public class ShardStats extends AbstractMXBean implements ShardStatsMXBean { */ @Override public void resetTransactionCounters(){ - committedTransactionsCount.set(0); + committedTransactionsCount = 0; - readOnlyTransactionCount.set(0); + readOnlyTransactionCount = 0; - writeOnlyTransactionCount.set(0); + writeOnlyTransactionCount = 0; - readWriteTransactionCount.set(0); + readWriteTransactionCount = 0; lastCommittedTransactionTime = 0; - failedTransactionsCount.set(0); + failedTransactionsCount = 0; failedReadTransactionsCount.set(0); - abortTransactionsCount.set(0); + abortTransactionsCount = 0; } + + public void setDataStore(final InMemoryDOMDataStore store) { + setNotificationManager(store.getDataChangeListenerNotificationManager()); + } + + public void setFollowerInitialSyncStatus(boolean followerInitialSyncStatus) { + this.followerInitialSyncStatus = followerInitialSyncStatus; + } + + @Override + public boolean getFollowerInitialSyncStatus() { + return followerInitialSyncStatus; + } + + @Override + public List getFollowerInfo() { + return getOnDemandRaftState().getFollowerInfoList(); + } + + @Override + public String getPeerAddresses() { + StringBuilder builder = new StringBuilder(); + int i = 0; + for(Map.Entry e: getOnDemandRaftState().getPeerAddresses().entrySet()) { + if(i++ > 0) { + builder.append(", "); + } + + builder.append(e.getKey()).append(": ").append(e.getValue()); + } + + return builder.toString(); + } + + @Override + public String getStatRetrievalTime() { + getOnDemandRaftState(); + return statRetrievalTime; + } + + @Override + public String getStatRetrievalError() { + getOnDemandRaftState(); + return statRetrievalError; + } }