-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<FollowerInfo> 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());
+ }
}
}