X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?a=blobdiff_plain;ds=sidebyside;f=opendaylight%2Fmd-sal%2Fsal-distributed-datastore%2Fsrc%2Fmain%2Fjava%2Forg%2Fopendaylight%2Fcontroller%2Fcluster%2Fdatastore%2Fjmx%2Fmbeans%2Fshard%2FShardStats.java;h=22ad8e7f5a3408ff7457876635ced85f19ad2842;hb=27b168d3ca3807123b4877f1ad0662b2610f393d;hp=c6c1579ce336dc78e64ecc6b79042c30eee28148;hpb=961b5b9260565194a863a25bd697f171ec2405af;p=controller.git 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 c6c1579ce3..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 @@ -1,178 +1,343 @@ -package org.opendaylight.controller.cluster.datastore.jmx.mbeans.shard; +/* + * Copyright (c) 2014 Cisco Systems, Inc. and others. All rights reserved. + * + * This program and the accompanying materials are made available under the + * terms of the Eclipse Public License v1.0 which accompanies this distribution, + * and is available at http://www.eclipse.org/legal/epl-v10.html + */ -import org.opendaylight.controller.cluster.datastore.jmx.mbeans.AbstractBaseMBean; +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.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; /** - * @author: syedbahm + * Maintains statistics for a shard. + * + * @author Basheeruddin syedbahm@cisco.com */ -public class ShardStats extends AbstractBaseMBean implements ShardStatsMBean { +public class ShardStats extends AbstractMXBean implements ShardStatsMXBean { + public static final String JMX_CATEGORY_SHARD = "Shards"; - private final String shardName; + @GuardedBy("DATE_FORMAT") + private static final SimpleDateFormat DATE_FORMAT = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS"); - private Long committedTransactionsCount = 0L; + private static final MapJoiner MAP_JOINER = Joiner.on(", ").withKeyValueSeparator(": "); - private Long readOnlyTransactionCount = 0L; + private final Shard shard; - private Long writeOnlyTransactionCount = 0L; + private final OnDemandShardStateCache stateCache; - private Long readWriteTransactionCount = 0L; + private long committedTransactionsCount; - private String leader; + private long readOnlyTransactionCount; - private String raftState; + private long writeOnlyTransactionCount; - private Long lastLogTerm = -1L; + private long readWriteTransactionCount; - private Long lastLogIndex = -1L; + private long lastCommittedTransactionTime; - private Long currentTerm = -1L; + private long failedTransactionsCount; - private Long commitIndex = -1L; + private final AtomicLong failedReadTransactionsCount = new AtomicLong(); - private Long lastApplied = -1L; + private long abortTransactionsCount; - private Date lastCommittedTransactionTime = new Date(0L); + private boolean followerInitialSyncStatus = false; - private Long failedTransactionsCount = 0L; + private String statRetrievalError; - private SimpleDateFormat sdf = - new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS"); + private long leadershipChangeCount; - ShardStats(String shardName) { - this.shardName = shardName; + private long lastLeadershipChangeTime; + + 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); } + @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(); + } + } + + private static String formatMillis(final long timeMillis) { + synchronized (DATE_FORMAT) { + return DATE_FORMAT.format(new Date(timeMillis)); + } + } @Override public String getShardName() { - return shardName; + return getMBeanName(); } @Override - public Long getCommittedTransactionsCount() { + public long getCommittedTransactionsCount() { return committedTransactionsCount; } - @Override public String getLeader() { - return leader; + @Override + public String getLeader() { + return getOnDemandRaftState().getLeader(); } - @Override public String getRaftState() { - return raftState; + @Override + public String getRaftState() { + return getOnDemandRaftState().getRaftState(); } - @Override public Long getReadOnlyTransactionCount() { + @Override + public long getReadOnlyTransactionCount() { return readOnlyTransactionCount; } - @Override public Long getWriteOnlyTransactionCount() { + @Override + public long getWriteOnlyTransactionCount() { return writeOnlyTransactionCount; } - @Override public Long getReadWriteTransactionCount() { + @Override + public long getReadWriteTransactionCount() { return readWriteTransactionCount; } - @Override public Long getLastLogIndex() { - return lastLogIndex; + @Override + public long getLastLogIndex() { + return getOnDemandRaftState().getLastLogIndex(); } - @Override public Long getLastLogTerm() { - return lastLogTerm; + @Override + public long getLastLogTerm() { + return getOnDemandRaftState().getLastLogTerm(); } - @Override public Long getCurrentTerm() { - return currentTerm; + @Override + public long getCurrentTerm() { + return getOnDemandRaftState().getCurrentTerm(); } - @Override public Long getCommitIndex() { - return commitIndex; + @Override + public long getCommitIndex() { + return getOnDemandRaftState().getCommitIndex(); } - @Override public Long getLastApplied() { - return lastApplied; + @Override + public long getLastApplied() { + return getOnDemandRaftState().getLastApplied(); } @Override - public String getLastCommittedTransactionTime() { + public long getLastIndex() { + return getOnDemandRaftState().getLastIndex(); + } - return sdf.format(lastCommittedTransactionTime); + @Override + public long getLastTerm() { + return getOnDemandRaftState().getLastTerm(); } - @Override public Long getFailedTransactionsCount() { - return failedTransactionsCount; + @Override + public long getSnapshotIndex() { + return getOnDemandRaftState().getSnapshotIndex(); + } + + @Override + public long getSnapshotTerm() { + return getOnDemandRaftState().getSnapshotTerm(); } - public Long incrementCommittedTransactionCount() { - return committedTransactionsCount++; + @Override + public long getReplicatedToAllIndex() { + return getOnDemandRaftState().getReplicatedToAllIndex(); } - public Long incrementReadOnlyTransactionCount() { - return readOnlyTransactionCount++; + @Override + public String getVotedFor() { + return getOnDemandRaftState().getVotedFor(); } - public Long incrementWriteOnlyTransactionCount() { - return writeOnlyTransactionCount++; + @Override + public boolean isVoting() { + return getOnDemandRaftState().isVoting(); + } + + @Override + public String getPeerVotingStates() { + return MAP_JOINER.join(getOnDemandRaftState().getPeerVotingStates()); + } + + @Override + public boolean isSnapshotCaptureInitiated() { + return getOnDemandRaftState().isSnapshotCaptureInitiated(); + } + + @Override + public String getLastCommittedTransactionTime() { + return formatMillis(lastCommittedTransactionTime); + } + + @Override + public long getFailedTransactionsCount() { + return failedTransactionsCount; } - public Long incrementReadWriteTransactionCount() { - return readWriteTransactionCount++; + @Override + public long getFailedReadTransactionsCount() { + return failedReadTransactionsCount.get(); } - public void setLeader(String leader) { - this.leader = leader; + @Override + public long getAbortTransactionsCount() { + return abortTransactionsCount; } - public void setRaftState(String raftState) { - this.raftState = raftState; + public long incrementCommittedTransactionCount() { + return ++committedTransactionsCount; } - public void setLastLogTerm(Long lastLogTerm) { - this.lastLogTerm = lastLogTerm; + public long incrementReadOnlyTransactionCount() { + return ++readOnlyTransactionCount; } - public void setLastLogIndex(Long lastLogIndex) { - this.lastLogIndex = lastLogIndex; + public long incrementWriteOnlyTransactionCount() { + return ++writeOnlyTransactionCount; } - public void setCurrentTerm(Long currentTerm) { - this.currentTerm = currentTerm; + public long incrementReadWriteTransactionCount() { + return ++readWriteTransactionCount; } - public void setCommitIndex(Long commitIndex) { - this.commitIndex = commitIndex; + public long incrementFailedTransactionsCount() { + return ++failedTransactionsCount; } - public void setLastApplied(Long lastApplied) { - this.lastApplied = lastApplied; + public long incrementFailedReadTransactionsCount() { + return failedReadTransactionsCount.incrementAndGet(); } + public long incrementAbortTransactionsCount() { + return ++abortTransactionsCount; + } - public void setLastCommittedTransactionTime( - Date lastCommittedTransactionTime) { + public void setLastCommittedTransactionTime(final long lastCommittedTransactionTime) { this.lastCommittedTransactionTime = lastCommittedTransactionTime; } @Override - protected String getMBeanName() { - return shardName; + public long getInMemoryJournalDataSize() { + return getOnDemandRaftState().getInMemoryJournalDataSize(); + } + + @Override + public long getInMemoryJournalLogSize() { + return getOnDemandRaftState().getInMemoryJournalLogSize(); + } + + /** + * Resets the counters related to transactions. + */ + @Override + public void resetTransactionCounters() { + committedTransactionsCount = 0; + + readOnlyTransactionCount = 0; + + writeOnlyTransactionCount = 0; + + readWriteTransactionCount = 0; + + lastCommittedTransactionTime = 0; + + failedTransactionsCount = 0; + + failedReadTransactionsCount.set(0); + + abortTransactionsCount = 0; + + } + + public void setFollowerInitialSyncStatus(final boolean followerInitialSyncStatus) { + this.followerInitialSyncStatus = followerInitialSyncStatus; + } + + @Override + public boolean getFollowerInitialSyncStatus() { + return followerInitialSyncStatus; + } + + @Override + public List getFollowerInfo() { + return getOnDemandRaftState().getFollowerInfoList(); } @Override - protected String getMBeanType() { - return JMX_TYPE_DISTRIBUTED_DATASTORE; + public String getPeerAddresses() { + return MAP_JOINER.join(getOnDemandRaftState().getPeerAddresses()); } @Override - protected String getMBeanCategory() { - return JMX_CATEGORY_SHARD; + public String getStatRetrievalTime() { + getOnDemandRaftState(); + return stateCache.getStatRetrievaelTime(); } + @Override + public String getStatRetrievalError() { + getOnDemandRaftState(); + return statRetrievalError; + } + + @Override + public long getLeadershipChangeCount() { + return leadershipChangeCount; + } + + public void incrementLeadershipChangeCount() { + leadershipChangeCount++; + lastLeadershipChangeTime = System.currentTimeMillis(); + } - public void incrementFailedTransactionsCount() { - this.failedTransactionsCount++; + @Override + public String getLastLeadershipChangeTime() { + return formatMillis(lastLeadershipChangeTime); + } + + @Override + public int getPendingTxCommitQueueSize() { + return shard != null ? shard.getPendingTxCommitQueueSize() : -1; + } + + @Override + public int getTxCohortCacheSize() { + return shard != null ? shard.getCohortCacheSize() : -1; + } + + @Override + public void captureSnapshot() { + if (shard != null) { + shard.getSelf().tell(new InitiateCaptureSnapshot(), ActorRef.noSender()); + } } }