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;
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;
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();
}
};
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() {
*/
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;
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);
}
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;
final GetAllFlowsStatisticsFromAllFlowTablesInputBuilder input = new GetAllFlowsStatisticsFromAllFlowTablesInputBuilder();
input.setNode(getNodeRef());
- requestHelper(flowStatsService.getAllFlowsStatisticsFromAllFlowTables(input.build()), StatsRequestType.ALL_FLOW);
+ requestHelper(flowStatsService.getAllFlowsStatisticsFromAllFlowTables(input.build()));
}
}
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()));
}
}
new GetFlowStatisticsFromFlowTableInputBuilder(flow);
input.setNode(getNodeRef());
- requestHelper(flowStatsService.getFlowStatisticsFromFlowTable(input.build()), StatsRequestType.ALL_FLOW);
+ requestHelper(flowStatsService.getFlowStatisticsFromFlowTable(input.build()));
}
}
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;
final GetFlowTablesStatisticsInputBuilder input = new GetFlowTablesStatisticsInputBuilder();
input.setNode(getNodeRef());
- requestHelper(flowTableStatsService.getFlowTablesStatistics(input.build()), StatsRequestType.ALL_FLOW);
+ requestHelper(flowTableStatsService.getFlowTablesStatistics(input.build()));
}
}
}
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;
final GetGroupDescriptionInputBuilder input = new GetGroupDescriptionInputBuilder();
input.setNode(getNodeRef());
- requestHelper(groupStatsService.getGroupDescription(input.build()), StatsRequestType.GROUP_DESC);
+ requestHelper(groupStatsService.getGroupDescription(input.build()));
}
}
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;
final GetAllGroupStatisticsInputBuilder input = new GetAllGroupStatisticsInputBuilder();
input.setNode(getNodeRef());
- requestHelper(groupStatsService.getAllGroupStatistics(input.build()), StatsRequestType.ALL_GROUP);
+ requestHelper(groupStatsService.getAllGroupStatistics(input.build()));
}
@Override
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;
GetAllMeterConfigStatisticsInputBuilder input = new GetAllMeterConfigStatisticsInputBuilder();
input.setNode(getNodeRef());
- requestHelper(meterStatsService.getAllMeterConfigStatistics(input.build()), StatsRequestType.METER_CONFIG);
+ requestHelper(meterStatsService.getAllMeterConfigStatistics(input.build()));
}
}
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;
GetAllMeterStatisticsInputBuilder input = new GetAllMeterStatisticsInputBuilder();
input.setNode(getNodeRef());
- requestHelper(meterStatsService.getAllMeterStatistics(input.build()), StatsRequestType.ALL_METER);
+ requestHelper(meterStatsService.getAllMeterStatistics(input.build()));
}
}
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;
@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) {
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 {
}
}
- 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 {
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();
*/
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;
final GetAllNodeConnectorsStatisticsInputBuilder input = new GetAllNodeConnectorsStatisticsInputBuilder();
input.setNode(getNodeRef());
- requestHelper(portStatsService.getAllNodeConnectorsStatistics(input.build()), StatsRequestType.ALL_PORT);
+ requestHelper(portStatsService.getAllNodeConnectorsStatistics(input.build()));
}
}
}
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;
}
@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);
}
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);
}
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;
GetAllQueuesStatisticsFromAllPortsInputBuilder input = new GetAllQueuesStatisticsFromAllPortsInputBuilder();
input.setNode(getNodeRef());
- requestHelper(queueStatsService.getAllQueuesStatisticsFromAllPorts(input.build()), StatsRequestType.ALL_QUEUE_STATS);
+ requestHelper(queueStatsService.getAllQueuesStatisticsFromAllPorts(input.build()));
}
}
input.setNodeConnectorId(nodeConnectorId);
input.setQueueId(queueId);
- requestHelper(queueStatsService.getQueueStatisticsFromGivenPort(input.build()), StatsRequestType.ALL_QUEUE_STATS);
+ requestHelper(queueStatsService.getQueueStatisticsFromGivenPort(input.build()));
}
}
--- /dev/null
+/*
+ * 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() + ']';
+ }
+}