From: Robert Varga Date: Sat, 15 Feb 2014 02:17:36 +0000 (+0100) Subject: Detect RPC failures X-Git-Tag: autorelease-tag-v20140601202136_82eb3f9~436 X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?p=controller.git;a=commitdiff_plain;h=3a827de1a10cd2c88a09eefc0ec518fa00f8dc02 Detect RPC failures 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 --- diff --git a/opendaylight/md-sal/statistics-manager/src/main/java/org/opendaylight/controller/md/statistics/manager/AbstractStatsTracker.java b/opendaylight/md-sal/statistics-manager/src/main/java/org/opendaylight/controller/md/statistics/manager/AbstractStatsTracker.java index 81fa7c8791..7b756d8f48 100644 --- a/opendaylight/md-sal/statistics-manager/src/main/java/org/opendaylight/controller/md/statistics/manager/AbstractStatsTracker.java +++ b/opendaylight/md-sal/statistics-manager/src/main/java/org/opendaylight/controller/md/statistics/manager/AbstractStatsTracker.java @@ -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 { + private static final Logger logger = LoggerFactory.getLogger(AbstractStatsTracker.class); private static final Function, TransactionId> FUNCTION = new Function, TransactionId>() { @Override public TransactionId apply(RpcResult 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 { return context.getNodeIdentifier(); } - protected final void requestHelper(Future> future, StatsRequestType type) { - context.registerTransaction(Futures.transform(JdkFutureAdapters.listenInPoolThread(future), FUNCTION), type); + protected final void requestHelper(Future> future) { + context.registerTransaction(Futures.transform(JdkFutureAdapters.listenInPoolThread(future), FUNCTION)); } protected final DataModificationTransaction startTransaction() { diff --git a/opendaylight/md-sal/statistics-manager/src/main/java/org/opendaylight/controller/md/statistics/manager/FlowCapableContext.java b/opendaylight/md-sal/statistics-manager/src/main/java/org/opendaylight/controller/md/statistics/manager/FlowCapableContext.java index 34ff87f4a4..27aa17a904 100644 --- a/opendaylight/md-sal/statistics-manager/src/main/java/org/opendaylight/controller/md/statistics/manager/FlowCapableContext.java +++ b/opendaylight/md-sal/statistics-manager/src/main/java/org/opendaylight/controller/md/statistics/manager/FlowCapableContext.java @@ -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 getNodeIdentifier(); NodeRef getNodeRef(); DataModificationTransaction startDataModification(); - void registerTransaction(ListenableFuture future, StatsRequestType type); + void registerTransaction(ListenableFuture future); void registerTableTransaction(ListenableFuture future, Short tableId); } diff --git a/opendaylight/md-sal/statistics-manager/src/main/java/org/opendaylight/controller/md/statistics/manager/FlowStatsTracker.java b/opendaylight/md-sal/statistics-manager/src/main/java/org/opendaylight/controller/md/statistics/manager/FlowStatsTracker.java index 2cba58f27f..90ddc28acd 100644 --- a/opendaylight/md-sal/statistics-manager/src/main/java/org/opendaylight/controller/md/statistics/manager/FlowStatsTracker.java +++ b/opendaylight/md-sal/statistics-manager/src/main/java/org/opendaylight/controller/md/statistics/manager/FlowStatsTracker.java @@ -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 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(); diff --git a/opendaylight/md-sal/statistics-manager/src/main/java/org/opendaylight/controller/md/statistics/manager/NodeConnectorStatsTracker.java b/opendaylight/md-sal/statistics-manager/src/main/java/org/opendaylight/controller/md/statistics/manager/NodeConnectorStatsTracker.java index 8ae6bbd4de..00bd27402f 100644 --- a/opendaylight/md-sal/statistics-manager/src/main/java/org/opendaylight/controller/md/statistics/manager/NodeConnectorStatsTracker.java +++ b/opendaylight/md-sal/statistics-manager/src/main/java/org/opendaylight/controller/md/statistics/manager/NodeConnectorStatsTracker.java @@ -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 future, final StatsRequestType type) { + public void registerTransaction(final ListenableFuture future) { Futures.addCallback(future, new FutureCallback() { @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() { @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); } diff --git a/opendaylight/md-sal/statistics-manager/src/main/java/org/opendaylight/controller/md/statistics/manager/QueueStatsTracker.java b/opendaylight/md-sal/statistics-manager/src/main/java/org/opendaylight/controller/md/statistics/manager/QueueStatsTracker.java index 2ea9ecc96d..f187c7082e 100644 --- a/opendaylight/md-sal/statistics-manager/src/main/java/org/opendaylight/controller/md/statistics/manager/QueueStatsTracker.java +++ b/opendaylight/md-sal/statistics-manager/src/main/java/org/opendaylight/controller/md/statistics/manager/QueueStatsTracker.java @@ -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 errors; + + public RPCFailedException(final String message, final Collection errors) { + super(message); + this.errors = errors; + } + + @Override + public String toString() { + return "RPCFailedException [errors=" + errors + ", message=" + getMessage() + ']'; + } +}