Detect RPC failures 42/5342/1
authorRobert Varga <rovarga@cisco.com>
Sat, 15 Feb 2014 02:17:36 +0000 (03:17 +0100)
committerRobert Varga <rovarga@cisco.com>
Sat, 15 Feb 2014 05:12:06 +0000 (06:12 +0100)
This detects when RPCs to stats services fail. Also it removes the enums
used only for legacy debug.

Change-Id: Id4eb348b92378735a143b799b4c97b9840766ff6
Signed-off-by: Robert Varga <rovarga@cisco.com>
13 files changed:
opendaylight/md-sal/statistics-manager/src/main/java/org/opendaylight/controller/md/statistics/manager/AbstractStatsTracker.java
opendaylight/md-sal/statistics-manager/src/main/java/org/opendaylight/controller/md/statistics/manager/FlowCapableContext.java
opendaylight/md-sal/statistics-manager/src/main/java/org/opendaylight/controller/md/statistics/manager/FlowStatsTracker.java
opendaylight/md-sal/statistics-manager/src/main/java/org/opendaylight/controller/md/statistics/manager/FlowTableStatsTracker.java
opendaylight/md-sal/statistics-manager/src/main/java/org/opendaylight/controller/md/statistics/manager/GroupDescStatsTracker.java
opendaylight/md-sal/statistics-manager/src/main/java/org/opendaylight/controller/md/statistics/manager/GroupStatsTracker.java
opendaylight/md-sal/statistics-manager/src/main/java/org/opendaylight/controller/md/statistics/manager/MeterConfigStatsTracker.java
opendaylight/md-sal/statistics-manager/src/main/java/org/opendaylight/controller/md/statistics/manager/MeterStatsTracker.java
opendaylight/md-sal/statistics-manager/src/main/java/org/opendaylight/controller/md/statistics/manager/MultipartMessageManager.java
opendaylight/md-sal/statistics-manager/src/main/java/org/opendaylight/controller/md/statistics/manager/NodeConnectorStatsTracker.java
opendaylight/md-sal/statistics-manager/src/main/java/org/opendaylight/controller/md/statistics/manager/NodeStatisticsHandler.java
opendaylight/md-sal/statistics-manager/src/main/java/org/opendaylight/controller/md/statistics/manager/QueueStatsTracker.java
opendaylight/md-sal/statistics-manager/src/main/java/org/opendaylight/controller/md/statistics/manager/RPCFailedException.java [new file with mode: 0644]

index 81fa7c87917e98af33da999da7b17949592a8fcc..7b756d8f48747fbdb89006c606ee91563b836340 100644 (file)
@@ -14,7 +14,6 @@ import java.util.Map;
 import java.util.Map.Entry;
 import java.util.concurrent.Future;
 
-import org.opendaylight.controller.md.statistics.manager.MultipartMessageManager.StatsRequestType;
 import org.opendaylight.controller.sal.binding.api.data.DataModificationTransaction;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.transaction.rev131103.TransactionAware;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.transaction.rev131103.TransactionId;
@@ -23,6 +22,8 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.N
 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier.InstanceIdentifierBuilder;
 import org.opendaylight.yangtools.yang.common.RpcResult;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
 import com.google.common.base.Function;
 import com.google.common.base.Preconditions;
@@ -30,10 +31,16 @@ import com.google.common.util.concurrent.Futures;
 import com.google.common.util.concurrent.JdkFutureAdapters;
 
 abstract class AbstractStatsTracker<I, K> {
+    private static final Logger logger = LoggerFactory.getLogger(AbstractStatsTracker.class);
     private static final Function<RpcResult<? extends TransactionAware>, TransactionId> FUNCTION =
             new Function<RpcResult<? extends TransactionAware>, TransactionId>() {
         @Override
         public TransactionId apply(RpcResult<? extends TransactionAware> input) {
+            if (!input.isSuccessful()) {
+                logger.debug("Statistics request failed: {}", input.getErrors());
+                throw new RPCFailedException("Failed to send statistics request", input.getErrors());
+            }
+
             return input.getResult().getTransactionId();
         }
     };
@@ -59,8 +66,8 @@ abstract class AbstractStatsTracker<I, K> {
         return context.getNodeIdentifier();
     }
 
-    protected final <T extends TransactionAware> void requestHelper(Future<RpcResult<T>> future, StatsRequestType type) {
-        context.registerTransaction(Futures.transform(JdkFutureAdapters.listenInPoolThread(future), FUNCTION), type);
+    protected final <T extends TransactionAware> void requestHelper(Future<RpcResult<T>> future) {
+        context.registerTransaction(Futures.transform(JdkFutureAdapters.listenInPoolThread(future), FUNCTION));
     }
 
     protected final DataModificationTransaction startTransaction() {
index 34ff87f4a4cf3b4d7e513fb92c5b9c4bdb45dafc..27aa17a9045e9f30c616152a65ada7e69d5397e0 100644 (file)
@@ -7,7 +7,6 @@
  */
 package org.opendaylight.controller.md.statistics.manager;
 
-import org.opendaylight.controller.md.statistics.manager.MultipartMessageManager.StatsRequestType;
 import org.opendaylight.controller.sal.binding.api.data.DataModificationTransaction;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.transaction.rev131103.TransactionId;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeRef;
@@ -25,6 +24,6 @@ interface FlowCapableContext {
     InstanceIdentifier<Node> getNodeIdentifier();
     NodeRef getNodeRef();
     DataModificationTransaction startDataModification();
-    void registerTransaction(ListenableFuture<TransactionId> future, StatsRequestType type);
+    void registerTransaction(ListenableFuture<TransactionId> future);
     void registerTableTransaction(ListenableFuture<TransactionId> future, Short tableId);
 }
index 2cba58f27f851a4faf66e97ce8ac84830431646b..90ddc28acd0066e72e8e134a49c0a786b6f49b4b 100644 (file)
@@ -10,7 +10,6 @@ package org.opendaylight.controller.md.statistics.manager;
 import java.util.Map.Entry;
 
 import org.opendaylight.controller.md.sal.common.api.data.DataChangeEvent;
-import org.opendaylight.controller.md.statistics.manager.MultipartMessageManager.StatsRequestType;
 import org.opendaylight.controller.sal.binding.api.data.DataBrokerService;
 import org.opendaylight.controller.sal.binding.api.data.DataModificationTransaction;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.FlowCapableNode;
@@ -209,7 +208,7 @@ final class FlowStatsTracker extends AbstractListeningStatsTracker<FlowAndStatis
             final GetAllFlowsStatisticsFromAllFlowTablesInputBuilder input = new GetAllFlowsStatisticsFromAllFlowTablesInputBuilder();
             input.setNode(getNodeRef());
 
-            requestHelper(flowStatsService.getAllFlowsStatisticsFromAllFlowTables(input.build()), StatsRequestType.ALL_FLOW);
+            requestHelper(flowStatsService.getAllFlowsStatisticsFromAllFlowTables(input.build()));
         }
     }
 
@@ -220,7 +219,7 @@ final class FlowStatsTracker extends AbstractListeningStatsTracker<FlowAndStatis
 
             input.setNode(getNodeRef());
             input.setTableId(new org.opendaylight.yang.gen.v1.urn.opendaylight.table.types.rev131026.TableId(key.getId()));
-            requestHelper(flowStatsService.getAggregateFlowStatisticsFromFlowTableForAllFlows(input.build()), StatsRequestType.ALL_FLOW);
+            requestHelper(flowStatsService.getAggregateFlowStatisticsFromFlowTableForAllFlows(input.build()));
         }
     }
 
@@ -230,7 +229,7 @@ final class FlowStatsTracker extends AbstractListeningStatsTracker<FlowAndStatis
                     new GetFlowStatisticsFromFlowTableInputBuilder(flow);
             input.setNode(getNodeRef());
 
-            requestHelper(flowStatsService.getFlowStatisticsFromFlowTable(input.build()), StatsRequestType.ALL_FLOW);
+            requestHelper(flowStatsService.getFlowStatisticsFromFlowTable(input.build()));
         }
     }
 
index 20b1b84c49befe3b5a099b63261cf537ddcf234c..3fe68c111a1549bc6c9df7b9b19803590ffad94b 100644 (file)
@@ -11,7 +11,6 @@ import java.util.Collections;
 import java.util.Set;
 import java.util.concurrent.ConcurrentSkipListSet;
 
-import org.opendaylight.controller.md.statistics.manager.MultipartMessageManager.StatsRequestType;
 import org.opendaylight.controller.sal.binding.api.data.DataModificationTransaction;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.FlowCapableNode;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.tables.Table;
@@ -67,7 +66,7 @@ final class FlowTableStatsTracker extends AbstractStatsTracker<FlowTableAndStati
             final GetFlowTablesStatisticsInputBuilder input = new GetFlowTablesStatisticsInputBuilder();
             input.setNode(getNodeRef());
 
-            requestHelper(flowTableStatsService.getFlowTablesStatistics(input.build()), StatsRequestType.ALL_FLOW);
+            requestHelper(flowTableStatsService.getFlowTablesStatistics(input.build()));
         }
     }
 }
index 663269e25ff1660622fc6a979e5eee0492f890f4..8aebd6b2491a00ce27bfb8e1093517029ea87cf3 100644 (file)
@@ -8,7 +8,6 @@
 package org.opendaylight.controller.md.statistics.manager;
 
 import org.opendaylight.controller.md.sal.common.api.data.DataChangeEvent;
-import org.opendaylight.controller.md.statistics.manager.MultipartMessageManager.StatsRequestType;
 import org.opendaylight.controller.sal.binding.api.data.DataBrokerService;
 import org.opendaylight.controller.sal.binding.api.data.DataModificationTransaction;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.FlowCapableNode;
@@ -76,7 +75,7 @@ final class GroupDescStatsTracker extends AbstractListeningStatsTracker<GroupDes
             final GetGroupDescriptionInputBuilder input = new GetGroupDescriptionInputBuilder();
             input.setNode(getNodeRef());
 
-            requestHelper(groupStatsService.getGroupDescription(input.build()), StatsRequestType.GROUP_DESC);
+            requestHelper(groupStatsService.getGroupDescription(input.build()));
         }
     }
 
index e9488abc1e10d0d30cf48932af7466ce518a0e18..1af8e4e9f1a2cf891795d06f967ca0b12307c730 100644 (file)
@@ -8,7 +8,6 @@
 package org.opendaylight.controller.md.statistics.manager;
 
 import org.opendaylight.controller.md.sal.common.api.data.DataChangeEvent;
-import org.opendaylight.controller.md.statistics.manager.MultipartMessageManager.StatsRequestType;
 import org.opendaylight.controller.sal.binding.api.data.DataBrokerService;
 import org.opendaylight.controller.sal.binding.api.data.DataModificationTransaction;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.FlowCapableNode;
@@ -77,7 +76,7 @@ final class GroupStatsTracker extends AbstractListeningStatsTracker<GroupStats,
         final GetAllGroupStatisticsInputBuilder input = new GetAllGroupStatisticsInputBuilder();
         input.setNode(getNodeRef());
 
-        requestHelper(groupStatsService.getAllGroupStatistics(input.build()), StatsRequestType.ALL_GROUP);
+        requestHelper(groupStatsService.getAllGroupStatistics(input.build()));
     }
 
     @Override
index a32fc220ecebb8e099ba82ab951f7a5d65678b9b..4b9592570565fc94d423702a7cff9923d110895f 100644 (file)
@@ -8,7 +8,6 @@
 package org.opendaylight.controller.md.statistics.manager;
 
 import org.opendaylight.controller.md.sal.common.api.data.DataChangeEvent;
-import org.opendaylight.controller.md.statistics.manager.MultipartMessageManager.StatsRequestType;
 import org.opendaylight.controller.sal.binding.api.data.DataBrokerService;
 import org.opendaylight.controller.sal.binding.api.data.DataModificationTransaction;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.FlowCapableNode;
@@ -68,7 +67,7 @@ final class MeterConfigStatsTracker extends AbstractListeningStatsTracker<MeterC
             GetAllMeterConfigStatisticsInputBuilder input = new GetAllMeterConfigStatisticsInputBuilder();
             input.setNode(getNodeRef());
 
-            requestHelper(meterStatsService.getAllMeterConfigStatistics(input.build()), StatsRequestType.METER_CONFIG);
+            requestHelper(meterStatsService.getAllMeterConfigStatistics(input.build()));
         }
     }
 
index 1e1ed6b91686746a959b3d605e3e47e1a9aa6e7b..091cbcc1a078f88d54cde3eaa9300da97aaed8c2 100644 (file)
@@ -8,7 +8,6 @@
 package org.opendaylight.controller.md.statistics.manager;
 
 import org.opendaylight.controller.md.sal.common.api.data.DataChangeEvent;
-import org.opendaylight.controller.md.statistics.manager.MultipartMessageManager.StatsRequestType;
 import org.opendaylight.controller.sal.binding.api.data.DataBrokerService;
 import org.opendaylight.controller.sal.binding.api.data.DataModificationTransaction;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.FlowCapableNode;
@@ -67,7 +66,7 @@ final class MeterStatsTracker extends AbstractListeningStatsTracker<MeterStats,
             GetAllMeterStatisticsInputBuilder input = new GetAllMeterStatisticsInputBuilder();
             input.setNode(getNodeRef());
 
-            requestHelper(meterStatsService.getAllMeterStatistics(input.build()), StatsRequestType.ALL_METER);
+            requestHelper(meterStatsService.getAllMeterStatistics(input.build()));
         }
     }
 
index e52a718a4e26c389af1c990b874fa8e81468682e..257684a400b0b36d53844b1f090047db55f14f3f 100644 (file)
@@ -40,19 +40,14 @@ public class MultipartMessageManager {
     private final Map<TxIdEntry,Short> txIdTotableIdMap = new ConcurrentHashMap<>();
 
     private static final class TxIdEntry {
-        private final StatsRequestType requestType;
         private final TransactionId txId;
 
-        public TxIdEntry(TransactionId txId, StatsRequestType requestType){
+        public TxIdEntry(TransactionId txId{
             this.txId = txId;
-            this.requestType = requestType;
         }
         public TransactionId getTxId() {
             return txId;
         }
-        public StatsRequestType getRequestType() {
-            return requestType;
-        }
         @Override
         public int hashCode() {
             final int prime = 31;
@@ -85,13 +80,13 @@ public class MultipartMessageManager {
 
         @Override
         public String toString() {
-            return "TxIdEntry [txId=" + txId + ", requestType=" + requestType + "]";
+            return "TxIdEntry [txId=" + txId + ']';
         }
     }
 
-    public void recordExpectedTableTransaction(TransactionId id, StatsRequestType type, Short tableId) {
-        recordExpectedTransaction(id, type);
-        txIdTotableIdMap.put(new TxIdEntry(id, null), Preconditions.checkNotNull(tableId));
+    public void recordExpectedTableTransaction(TransactionId id, Short tableId) {
+        recordExpectedTransaction(id);
+        txIdTotableIdMap.put(new TxIdEntry(id), Preconditions.checkNotNull(tableId));
     }
 
     public Short isExpectedTableTransaction(TransactionAware transaction, Boolean more) {
@@ -99,7 +94,7 @@ public class MultipartMessageManager {
             return null;
         }
 
-        final TxIdEntry key = new TxIdEntry(transaction.getTransactionId(), null);
+        final TxIdEntry key = new TxIdEntry(transaction.getTransactionId());
         if (more != null && more.booleanValue()) {
             return txIdTotableIdMap.get(key);
         } else {
@@ -107,13 +102,13 @@ public class MultipartMessageManager {
         }
     }
 
-    public void recordExpectedTransaction(TransactionId id, StatsRequestType type) {
-        TxIdEntry entry = new TxIdEntry(Preconditions.checkNotNull(id), Preconditions.checkNotNull(type));
+    public void recordExpectedTransaction(TransactionId id) {
+        TxIdEntry entry = new TxIdEntry(Preconditions.checkNotNull(id));
         txIdToRequestTypeMap.put(entry, getExpiryTime());
     }
 
     public boolean isExpectedTransaction(TransactionAware transaction, Boolean more) {
-        TxIdEntry entry = new TxIdEntry(transaction.getTransactionId(), null);
+        TxIdEntry entry = new TxIdEntry(transaction.getTransactionId());
         if (more != null && more.booleanValue()) {
             return txIdToRequestTypeMap.containsKey(entry);
         } else {
@@ -126,18 +121,6 @@ public class MultipartMessageManager {
                 StatisticsProvider.STATS_COLLECTION_MILLIS*NUMBER_OF_WAIT_CYCLES);
     }
 
-    public enum StatsRequestType {
-        ALL_FLOW,
-        AGGR_FLOW,
-        ALL_PORT,
-        ALL_FLOW_TABLE,
-        ALL_QUEUE_STATS,
-        ALL_GROUP,
-        ALL_METER,
-        GROUP_DESC,
-        METER_CONFIG
-    }
-
     public void cleanStaleTransactionIds() {
         final long now = System.nanoTime();
 
index 8ae6bbd4de1df39e4730df3044c1e56d14f240d8..00bd27402fc3c45c82f0f9d06c8a5a562ea76a97 100644 (file)
@@ -7,7 +7,6 @@
  */
 package org.opendaylight.controller.md.statistics.manager;
 
-import org.opendaylight.controller.md.statistics.manager.MultipartMessageManager.StatsRequestType;
 import org.opendaylight.controller.sal.binding.api.data.DataModificationTransaction;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.node.NodeConnector;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.node.NodeConnectorBuilder;
@@ -79,7 +78,7 @@ final class NodeConnectorStatsTracker extends AbstractStatsTracker<NodeConnector
             final GetAllNodeConnectorsStatisticsInputBuilder input = new GetAllNodeConnectorsStatisticsInputBuilder();
             input.setNode(getNodeRef());
 
-            requestHelper(portStatsService.getAllNodeConnectorsStatistics(input.build()), StatsRequestType.ALL_PORT);
+            requestHelper(portStatsService.getAllNodeConnectorsStatistics(input.build()));
         }
     }
 }
index 691b9c0b15f58a9d6a01d05e7146c8a69251e332..d62b680e1466c89d88180b51b0d89a97b2120602 100644 (file)
@@ -11,7 +11,6 @@ import java.util.Collection;
 import java.util.List;
 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;
@@ -299,11 +298,11 @@ public final class NodeStatisticsHandler implements AutoCloseable, FlowCapableCo
     }
 
     @Override
-    public void registerTransaction(final ListenableFuture<TransactionId> future, final StatsRequestType type) {
+    public void registerTransaction(final ListenableFuture<TransactionId> future) {
         Futures.addCallback(future, new FutureCallback<TransactionId>() {
             @Override
             public void onSuccess(TransactionId result) {
-                msgManager.recordExpectedTransaction(result, type);
+                msgManager.recordExpectedTransaction(result);
                 logger.debug("Transaction {} for node {} sent successfully", result, targetNodeKey);
             }
 
@@ -319,7 +318,7 @@ public final class NodeStatisticsHandler implements AutoCloseable, FlowCapableCo
         Futures.addCallback(future, new FutureCallback<TransactionId>() {
             @Override
             public void onSuccess(TransactionId result) {
-                msgManager.recordExpectedTableTransaction(result, StatsRequestType.AGGR_FLOW, id);
+                msgManager.recordExpectedTableTransaction(result, id);
                 logger.debug("Transaction {} for node {} table {} sent successfully", result, targetNodeKey, id);
             }
 
index 2ea9ecc96d8a49bdc36f48f068749e74c6b00148..f187c7082e6e3b2093e2e0b0654a406dd9315950 100644 (file)
@@ -10,7 +10,6 @@ package org.opendaylight.controller.md.statistics.manager;
 import java.util.Map.Entry;
 
 import org.opendaylight.controller.md.sal.common.api.data.DataChangeEvent;
-import org.opendaylight.controller.md.statistics.manager.MultipartMessageManager.StatsRequestType;
 import org.opendaylight.controller.sal.binding.api.data.DataBrokerService;
 import org.opendaylight.controller.sal.binding.api.data.DataModificationTransaction;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.FlowCapableNodeConnector;
@@ -88,7 +87,7 @@ final class QueueStatsTracker extends AbstractListeningStatsTracker<QueueIdAndSt
             GetAllQueuesStatisticsFromAllPortsInputBuilder input = new GetAllQueuesStatisticsFromAllPortsInputBuilder();
             input.setNode(getNodeRef());
 
-            requestHelper(queueStatsService.getAllQueuesStatisticsFromAllPorts(input.build()), StatsRequestType.ALL_QUEUE_STATS);
+            requestHelper(queueStatsService.getAllQueuesStatisticsFromAllPorts(input.build()));
         }
     }
 
@@ -100,7 +99,7 @@ final class QueueStatsTracker extends AbstractListeningStatsTracker<QueueIdAndSt
             input.setNodeConnectorId(nodeConnectorId);
             input.setQueueId(queueId);
 
-            requestHelper(queueStatsService.getQueueStatisticsFromGivenPort(input.build()), StatsRequestType.ALL_QUEUE_STATS);
+            requestHelper(queueStatsService.getQueueStatisticsFromGivenPort(input.build()));
         }
     }
 
diff --git a/opendaylight/md-sal/statistics-manager/src/main/java/org/opendaylight/controller/md/statistics/manager/RPCFailedException.java b/opendaylight/md-sal/statistics-manager/src/main/java/org/opendaylight/controller/md/statistics/manager/RPCFailedException.java
new file mode 100644 (file)
index 0000000..308c6dd
--- /dev/null
@@ -0,0 +1,27 @@
+/*
+ * 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
+ */
+package org.opendaylight.controller.md.statistics.manager;
+
+import java.util.Collection;
+
+import org.opendaylight.yangtools.yang.common.RpcError;
+
+final class RPCFailedException extends RuntimeException {
+    private static final long serialVersionUID = 1L;
+    private final Collection<RpcError> errors;
+
+    public RPCFailedException(final String message, final Collection<RpcError> errors) {
+        super(message);
+        this.errors = errors;
+    }
+
+    @Override
+    public String toString() {
+        return "RPCFailedException [errors=" + errors + ", message=" + getMessage() + ']';
+    }
+}