X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?p=controller.git;a=blobdiff_plain;f=opendaylight%2Fmd-sal%2Fstatistics-manager%2Fsrc%2Fmain%2Fjava%2Forg%2Fopendaylight%2Fcontroller%2Fmd%2Fstatistics%2Fmanager%2FNodeStatisticsHandler.java;h=6796b4eb8723d02064d31a56bfa479c9412a4246;hp=691b9c0b15f58a9d6a01d05e7146c8a69251e332;hb=c89c6d750fd4e3c9e93427b9a863a6e3c146bfdb;hpb=def3f90c150a98aa910ce5ba3e4692c461dd3250 diff --git a/opendaylight/md-sal/statistics-manager/src/main/java/org/opendaylight/controller/md/statistics/manager/NodeStatisticsHandler.java b/opendaylight/md-sal/statistics-manager/src/main/java/org/opendaylight/controller/md/statistics/manager/NodeStatisticsHandler.java index 691b9c0b15..6796b4eb87 100644 --- a/opendaylight/md-sal/statistics-manager/src/main/java/org/opendaylight/controller/md/statistics/manager/NodeStatisticsHandler.java +++ b/opendaylight/md-sal/statistics-manager/src/main/java/org/opendaylight/controller/md/statistics/manager/NodeStatisticsHandler.java @@ -9,9 +9,10 @@ package org.opendaylight.controller.md.statistics.manager; import java.util.Collection; import java.util.List; +import java.util.Timer; +import java.util.TimerTask; import java.util.concurrent.TimeUnit; -import org.opendaylight.controller.md.statistics.manager.MultipartMessageManager.StatsRequestType; import org.opendaylight.controller.sal.binding.api.data.DataModificationTransaction; import org.opendaylight.controller.sal.binding.api.data.DataProviderService; import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.FlowCapableNode; @@ -56,9 +57,6 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import com.google.common.base.Preconditions; -import com.google.common.util.concurrent.FutureCallback; -import com.google.common.util.concurrent.Futures; -import com.google.common.util.concurrent.ListenableFuture; /** * This class handles the lifecycle of per-node statistics. It receives data @@ -69,9 +67,12 @@ import com.google.common.util.concurrent.ListenableFuture; */ public final class NodeStatisticsHandler implements AutoCloseable, FlowCapableContext { private static final Logger logger = LoggerFactory.getLogger(NodeStatisticsHandler.class); + + private static final long STATS_COLLECTION_MILLIS = TimeUnit.SECONDS.toMillis(15); + private static final long FIRST_COLLECTION_MILLIS = TimeUnit.SECONDS.toMillis(5); private static final int NUMBER_OF_WAIT_CYCLES = 2; - private final MultipartMessageManager msgManager = new MultipartMessageManager(); + private final MultipartMessageManager msgManager; private final InstanceIdentifier targetNodeIdentifier; private final FlowStatsTracker flowStats; private final FlowTableStatsTracker flowTableStats; @@ -84,6 +85,13 @@ public final class NodeStatisticsHandler implements AutoCloseable, FlowCapableCo private final DataProviderService dps; private final NodeRef targetNodeRef; private final NodeKey targetNodeKey; + private final TimerTask task = new TimerTask() { + @Override + public void run() { + requestPeriodicStatistics(); + cleanStaleStatistics(); + } + }; public NodeStatisticsHandler(final DataProviderService dps, final NodeKey nodeKey, final OpendaylightFlowStatisticsService flowStatsService, @@ -97,8 +105,9 @@ public final class NodeStatisticsHandler implements AutoCloseable, FlowCapableCo this.targetNodeIdentifier = InstanceIdentifier.builder(Nodes.class).child(Node.class, targetNodeKey).build(); this.targetNodeRef = new NodeRef(targetNodeIdentifier); - final long lifetimeNanos = TimeUnit.MILLISECONDS.toNanos(StatisticsProvider.STATS_COLLECTION_MILLIS * NUMBER_OF_WAIT_CYCLES); + final long lifetimeNanos = TimeUnit.MILLISECONDS.toNanos(STATS_COLLECTION_MILLIS * NUMBER_OF_WAIT_CYCLES); + msgManager = new MultipartMessageManager(lifetimeNanos); flowStats = new FlowStatsTracker(flowStatsService, this, lifetimeNanos); flowTableStats = new FlowTableStatsTracker(flowTableStatsService, this, lifetimeNanos); groupDescStats = new GroupDescStatsTracker(groupStatsService, this, lifetimeNanos); @@ -275,7 +284,7 @@ public final class NodeStatisticsHandler implements AutoCloseable, FlowCapableCo queueStats.request(); } - public synchronized void start() { + public synchronized void start(final Timer timer) { flowStats.start(dps); groupDescStats.start(dps); groupStats.start(dps); @@ -283,11 +292,16 @@ public final class NodeStatisticsHandler implements AutoCloseable, FlowCapableCo meterStats.start(dps); queueStats.start(dps); + timer.schedule(task, (long) (Math.random() * FIRST_COLLECTION_MILLIS), STATS_COLLECTION_MILLIS); + + logger.debug("Statistics handler for node started with base interval {}ms", STATS_COLLECTION_MILLIS); + requestPeriodicStatistics(); } @Override public synchronized void close() { + task.cancel(); flowStats.close(); groupDescStats.close(); groupStats.close(); @@ -299,34 +313,14 @@ public final class NodeStatisticsHandler implements AutoCloseable, FlowCapableCo } @Override - public void registerTransaction(final ListenableFuture future, final StatsRequestType type) { - Futures.addCallback(future, new FutureCallback() { - @Override - public void onSuccess(TransactionId result) { - msgManager.recordExpectedTransaction(result, type); - logger.debug("Transaction {} for node {} sent successfully", result, targetNodeKey); - } - - @Override - public void onFailure(Throwable t) { - logger.warn("Failed to send statistics request for node {}", targetNodeKey, t); - } - }); + public void registerTransaction(TransactionId id) { + msgManager.recordExpectedTransaction(id); + logger.debug("Transaction {} for node {} sent successfully", id, targetNodeKey); } @Override - public void registerTableTransaction(final ListenableFuture future, final Short id) { - Futures.addCallback(future, new FutureCallback() { - @Override - public void onSuccess(TransactionId result) { - msgManager.recordExpectedTableTransaction(result, StatsRequestType.AGGR_FLOW, id); - logger.debug("Transaction {} for node {} table {} sent successfully", result, targetNodeKey, id); - } - - @Override - public void onFailure(Throwable t) { - logger.warn("Failed to send table statistics request for node {} table {}", targetNodeKey, id, t); - } - }); + public void registerTableTransaction(final TransactionId id, final Short table) { + msgManager.recordExpectedTableTransaction(id, table); + logger.debug("Transaction {} for node {} table {} sent successfully", id, targetNodeKey, table); } }