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=7f81370a87407c0b60eeeb59675c5c552e4db19e;hb=62cddd88e42e8f3c6a92bbf42c97b0d6806f44ae;hp=765fe211d2ef59f6cdb02d64ad4a7a1af17b2a3d;hpb=a3cecfd01d0ef8922530924e3ee9684eb03ee5d6;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 765fe211d2..7f81370a87 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 @@ -5,30 +5,22 @@ * terms of the Eclipse Public License v1.0 which accompanies this distribution, * and is available at http://www.eclipse.org/legal/epl-v10.html */ - 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.Joiner.MapJoiner; -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.TimeUnit; import java.util.concurrent.atomic.AtomicLong; -import javax.annotation.Nullable; +import org.checkerframework.checker.lock.qual.GuardedBy; +import org.eclipse.jdt.annotation.Nullable; 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 scala.concurrent.Await; /** * Maintains statistics for a shard. @@ -38,13 +30,16 @@ import scala.concurrent.Await; public class ShardStats extends AbstractMXBean implements ShardStatsMXBean { public static final String JMX_CATEGORY_SHARD = "Shards"; + // FIXME: migrate this to Java 8 thread-safe time + @GuardedBy("DATE_FORMAT") private static final SimpleDateFormat DATE_FORMAT = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS"); - private static final Cache ONDEMAND_RAFT_STATE_CACHE = - CacheBuilder.newBuilder().expireAfterWrite(2, TimeUnit.SECONDS).build(); - private static final MapJoiner MAP_JOINER = Joiner.on(", ").withKeyValueSeparator(": "); + private final Shard shard; + + private final OnDemandShardStateCache stateCache; + private long committedTransactionsCount; private long readOnlyTransactionCount; @@ -63,48 +58,34 @@ public class ShardStats extends AbstractMXBean implements ShardStatsMXBean { private boolean followerInitialSyncStatus = false; - private final Shard shard; - private String statRetrievalError; - private String statRetrievalTime; - private long leadershipChangeCount; private long lastLeadershipChangeTime; - public ShardStats(final String shardName, final String mxBeanType, @Nullable final Shard shard) { + public ShardStats(final String shardName, final String mxBeanType, final @Nullable 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() { - String name = getShardName(); - OnDemandRaftState state = ONDEMAND_RAFT_STATE_CACHE.getIfPresent(name); - if (state == null) { + try { + final OnDemandRaftState state = stateCache.get(); 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(); - ONDEMAND_RAFT_STATE_CACHE.put(name, state); - } catch (Exception e) { - statRetrievalError = e.toString(); - } - } - - state = state != null ? state : OnDemandRaftState.builder().build(); + return state; + } catch (Exception e) { + statRetrievalError = e.getCause().toString(); + return OnDemandRaftState.builder().build(); } + } - return state; + private static String formatMillis(final long timeMillis) { + synchronized (DATE_FORMAT) { + return DATE_FORMAT.format(new Date(timeMillis)); + } } @Override @@ -214,9 +195,7 @@ public class ShardStats extends AbstractMXBean implements ShardStatsMXBean { @Override public String getLastCommittedTransactionTime() { - synchronized (DATE_FORMAT) { - return DATE_FORMAT.format(new Date(lastCommittedTransactionTime)); - } + return formatMillis(lastCommittedTransactionTime); } @Override @@ -299,7 +278,7 @@ public class ShardStats extends AbstractMXBean implements ShardStatsMXBean { } - public void setFollowerInitialSyncStatus(boolean followerInitialSyncStatus) { + public void setFollowerInitialSyncStatus(final boolean followerInitialSyncStatus) { this.followerInitialSyncStatus = followerInitialSyncStatus; } @@ -321,7 +300,7 @@ public class ShardStats extends AbstractMXBean implements ShardStatsMXBean { @Override public String getStatRetrievalTime() { getOnDemandRaftState(); - return statRetrievalTime; + return stateCache.getStatRetrievaelTime(); } @Override @@ -342,9 +321,7 @@ public class ShardStats extends AbstractMXBean implements ShardStatsMXBean { @Override public String getLastLeadershipChangeTime() { - synchronized (DATE_FORMAT) { - return DATE_FORMAT.format(new Date(lastLeadershipChangeTime)); - } + return formatMillis(lastLeadershipChangeTime); } @Override