From e41bd0a8c722f09d901dd17b23480ad928c3e784 Mon Sep 17 00:00:00 2001 From: Robert Varga Date: Fri, 14 Feb 2014 20:24:40 +0100 Subject: [PATCH] Move queue/meter/flow listeners into their trackers This completes the move of triggers under a per-node registration. With this structure we should have a complete control of what should be going on for a switch. Change-Id: Ia35c925947e044ff826c1f2560c040fe696aaed0 Signed-off-by: Robert Varga --- .../AbstractListeningStatsTracker.java | 48 ++++++ .../manager/AbstractStatsTracker.java | 12 +- .../manager/FlowCapableContext.java | 6 + .../statistics/manager/FlowStatsTracker.java | 97 +++++++++--- .../manager/FlowTableStatsTracker.java | 17 +- .../manager/GroupDescStatsTracker.java | 70 +++++++-- .../statistics/manager/GroupStatsTracker.java | 51 +++++- .../manager/MeterConfigStatsTracker.java | 63 ++++++-- .../statistics/manager/MeterStatsTracker.java | 67 ++++++-- .../manager/NodeConnectorStatsTracker.java | 17 +- .../manager/NodeStatisticsHandler.java | 148 +++++------------- .../statistics/manager/QueueStatsTracker.java | 87 ++++++++-- .../manager/StatisticsManagerActivator.java | 4 +- .../manager/StatisticsProvider.java | 84 +--------- .../manager/StatisticsUpdateHandler.java | 121 -------------- 15 files changed, 485 insertions(+), 407 deletions(-) create mode 100644 opendaylight/md-sal/statistics-manager/src/main/java/org/opendaylight/controller/md/statistics/manager/AbstractListeningStatsTracker.java delete mode 100644 opendaylight/md-sal/statistics-manager/src/main/java/org/opendaylight/controller/md/statistics/manager/StatisticsUpdateHandler.java diff --git a/opendaylight/md-sal/statistics-manager/src/main/java/org/opendaylight/controller/md/statistics/manager/AbstractListeningStatsTracker.java b/opendaylight/md-sal/statistics-manager/src/main/java/org/opendaylight/controller/md/statistics/manager/AbstractListeningStatsTracker.java new file mode 100644 index 0000000000..4a58579b13 --- /dev/null +++ b/opendaylight/md-sal/statistics-manager/src/main/java/org/opendaylight/controller/md/statistics/manager/AbstractListeningStatsTracker.java @@ -0,0 +1,48 @@ +/* + * 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 org.opendaylight.controller.sal.binding.api.data.DataBrokerService; +import org.opendaylight.controller.sal.binding.api.data.DataChangeListener; +import org.opendaylight.yangtools.concepts.ListenerRegistration; +import org.opendaylight.yangtools.yang.binding.InstanceIdentifier; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import com.google.common.base.Preconditions; + +abstract class AbstractListeningStatsTracker extends AbstractStatsTracker implements AutoCloseable, DataChangeListener { + private static final Logger logger = LoggerFactory.getLogger(AbstractListeningStatsTracker.class); + private ListenerRegistration reg; + + protected AbstractListeningStatsTracker(FlowCapableContext context, long lifetimeNanos) { + super(context, lifetimeNanos); + } + + protected abstract InstanceIdentifier listenPath(); + protected abstract String statName(); + + public void start(final DataBrokerService dbs) { + Preconditions.checkState(reg == null); + + reg = dbs.registerDataChangeListener(listenPath(), this); + logger.debug("{} Statistics tracker for node {} started", statName(), getNodeIdentifier()); + } + + @Override + public final void close() { + if (reg != null) { + try { + reg.close(); + } catch (Exception e) { + logger.warn("Failed to stop {} Statistics tracker for node {}", statName(), getNodeIdentifier(), e); + } + reg = null; + } + } +} 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 03ed6cb1f1..81fa7c8791 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,6 +14,7 @@ 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; @@ -27,7 +28,6 @@ import com.google.common.base.Function; import com.google.common.base.Preconditions; import com.google.common.util.concurrent.Futures; import com.google.common.util.concurrent.JdkFutureAdapters; -import com.google.common.util.concurrent.ListenableFuture; abstract class AbstractStatsTracker { private static final Function, TransactionId> FUNCTION = @@ -59,8 +59,12 @@ abstract class AbstractStatsTracker { return context.getNodeIdentifier(); } - protected static final ListenableFuture requestHelper(Future> future) { - return Futures.transform(JdkFutureAdapters.listenInPoolThread(future), FUNCTION); + protected final void requestHelper(Future> future, StatsRequestType type) { + context.registerTransaction(Futures.transform(JdkFutureAdapters.listenInPoolThread(future), FUNCTION), type); + } + + protected final DataModificationTransaction startTransaction() { + return context.startDataModification(); } protected abstract void cleanupSingleStat(DataModificationTransaction trans, K item); @@ -68,7 +72,7 @@ abstract class AbstractStatsTracker { public final synchronized void updateStats(List list) { final Long expiryTime = System.nanoTime() + lifetimeNanos; - final DataModificationTransaction trans = context.startDataModification(); + final DataModificationTransaction trans = startTransaction(); for (final I item : list) { trackedItems.put(updateSingleStat(trans, item), expiryTime); 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 9893c28f6c..34ff87f4a4 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,11 +7,15 @@ */ 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; import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.Node; import org.opendaylight.yangtools.yang.binding.InstanceIdentifier; +import com.google.common.util.concurrent.ListenableFuture; + /** * Interface exposed to AbstractStatsTracker by its parent NodeStatisticsHandler. * While we could simply exist without this interface, its purpose is to document @@ -21,4 +25,6 @@ interface FlowCapableContext { InstanceIdentifier getNodeIdentifier(); NodeRef getNodeRef(); DataModificationTransaction startDataModification(); + void registerTransaction(ListenableFuture future, StatsRequestType type); + 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 abbc94ee2b..2cba58f27f 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 @@ -7,6 +7,11 @@ */ 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; import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.FlowId; @@ -24,23 +29,20 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.statistics.rev130819.O import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.statistics.rev130819.flow.and.statistics.map.list.FlowAndStatisticsMapList; import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.statistics.rev130819.flow.and.statistics.map.list.FlowAndStatisticsMapListBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.statistics.rev130819.flow.statistics.FlowStatisticsBuilder; -import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.transaction.rev131103.TransactionId; import org.opendaylight.yang.gen.v1.urn.opendaylight.model.statistics.types.rev130925.GenericStatistics; +import org.opendaylight.yangtools.yang.binding.DataObject; import org.opendaylight.yangtools.yang.binding.InstanceIdentifier; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import com.google.common.base.Preconditions; -import com.google.common.util.concurrent.ListenableFuture; - -final class FlowStatsTracker extends AbstractStatsTracker { +final class FlowStatsTracker extends AbstractListeningStatsTracker { private static final Logger logger = LoggerFactory.getLogger(FlowStatsTracker.class); private final OpendaylightFlowStatisticsService flowStatsService; private int unaccountedFlowsCounter = 1; FlowStatsTracker(OpendaylightFlowStatisticsService flowStatsService, final FlowCapableContext context, long lifetimeNanos) { super(context, lifetimeNanos); - this.flowStatsService = Preconditions.checkNotNull(flowStatsService); + this.flowStatsService = flowStatsService; } @Override @@ -192,27 +194,80 @@ final class FlowStatsTracker extends AbstractStatsTracker requestAllFlowsAllTables() { - final GetAllFlowsStatisticsFromAllFlowTablesInputBuilder input = new GetAllFlowsStatisticsFromAllFlowTablesInputBuilder(); - input.setNode(getNodeRef()); + @Override + protected InstanceIdentifier listenPath() { + return getNodeIdentifierBuilder().augmentation(FlowCapableNode.class).child(Table.class).child(Flow.class).build(); + } - return requestHelper(flowStatsService.getAllFlowsStatisticsFromAllFlowTables(input.build())); + @Override + protected String statName() { + return "Flow"; } - public ListenableFuture requestAggregateFlows(final TableKey key) { - GetAggregateFlowStatisticsFromFlowTableForAllFlowsInputBuilder input = - new GetAggregateFlowStatisticsFromFlowTableForAllFlowsInputBuilder(); + public void requestAllFlowsAllTables() { + if (flowStatsService != null) { + final GetAllFlowsStatisticsFromAllFlowTablesInputBuilder input = new GetAllFlowsStatisticsFromAllFlowTablesInputBuilder(); + input.setNode(getNodeRef()); - input.setNode(getNodeRef()); - input.setTableId(new org.opendaylight.yang.gen.v1.urn.opendaylight.table.types.rev131026.TableId(key.getId())); - return requestHelper(flowStatsService.getAggregateFlowStatisticsFromFlowTableForAllFlows(input.build())); + requestHelper(flowStatsService.getAllFlowsStatisticsFromAllFlowTables(input.build()), StatsRequestType.ALL_FLOW); + } } - public ListenableFuture requestFlow(final Flow flow) { - final GetFlowStatisticsFromFlowTableInputBuilder input = - new GetFlowStatisticsFromFlowTableInputBuilder(flow); - input.setNode(getNodeRef()); + public void requestAggregateFlows(final TableKey key) { + if (flowStatsService != null) { + GetAggregateFlowStatisticsFromFlowTableForAllFlowsInputBuilder input = + new GetAggregateFlowStatisticsFromFlowTableForAllFlowsInputBuilder(); + + 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); + } + } + + public void requestFlow(final Flow flow) { + if (flowStatsService != null) { + final GetFlowStatisticsFromFlowTableInputBuilder input = + new GetFlowStatisticsFromFlowTableInputBuilder(flow); + input.setNode(getNodeRef()); + + requestHelper(flowStatsService.getFlowStatisticsFromFlowTable(input.build()), StatsRequestType.ALL_FLOW); + } + } + + @Override + public void onDataChanged(DataChangeEvent, DataObject> change) { + for (Entry, DataObject> e : change.getCreatedConfigurationData().entrySet()) { + if (Flow.class.equals(e.getKey().getTargetType())) { + final Flow flow = (Flow) e.getValue(); + logger.debug("Key {} triggered request for flow {}", e.getKey(), flow); + requestFlow(flow); + } else { + logger.debug("Ignoring key {}", e.getKey()); + } + } + + final DataModificationTransaction trans = startTransaction(); + for (InstanceIdentifier key : change.getRemovedConfigurationData()) { + if (Flow.class.equals(key.getTargetType())) { + @SuppressWarnings("unchecked") + final InstanceIdentifier flow = (InstanceIdentifier)key; + final InstanceIdentifier del = InstanceIdentifier.builder(flow) + .augmentation(FlowStatisticsData.class).build(); + logger.debug("Key {} triggered remove of augmentation {}", key, del); + + trans.removeOperationalData(del); + } + } + trans.commit(); + } + + @Override + public void start(final DataBrokerService dbs) { + if (flowStatsService == null) { + logger.debug("No Flow Statistics service, not subscribing to flows on node {}", getNodeIdentifier()); + return; + } - return requestHelper(flowStatsService.getFlowStatisticsFromFlowTable(input.build())); + super.start(dbs); } } diff --git a/opendaylight/md-sal/statistics-manager/src/main/java/org/opendaylight/controller/md/statistics/manager/FlowTableStatsTracker.java b/opendaylight/md-sal/statistics-manager/src/main/java/org/opendaylight/controller/md/statistics/manager/FlowTableStatsTracker.java index 4136b3d0e4..20b1b84c49 100644 --- a/opendaylight/md-sal/statistics-manager/src/main/java/org/opendaylight/controller/md/statistics/manager/FlowTableStatsTracker.java +++ b/opendaylight/md-sal/statistics-manager/src/main/java/org/opendaylight/controller/md/statistics/manager/FlowTableStatsTracker.java @@ -11,6 +11,7 @@ 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; @@ -23,12 +24,8 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.table.statistics.rev13 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.table.statistics.rev131215.flow.table.and.statistics.map.FlowTableAndStatisticsMap; import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.table.statistics.rev131215.flow.table.statistics.FlowTableStatistics; import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.table.statistics.rev131215.flow.table.statistics.FlowTableStatisticsBuilder; -import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.transaction.rev131103.TransactionId; import org.opendaylight.yangtools.yang.binding.InstanceIdentifier; -import com.google.common.base.Preconditions; -import com.google.common.util.concurrent.ListenableFuture; - final class FlowTableStatsTracker extends AbstractStatsTracker { private final Set privateTables = new ConcurrentSkipListSet<>(); private final Set tables = Collections.unmodifiableSet(privateTables); @@ -36,7 +33,7 @@ final class FlowTableStatsTracker extends AbstractStatsTracker getTables() { @@ -65,10 +62,12 @@ final class FlowTableStatsTracker extends AbstractStatsTracker request() { - final GetFlowTablesStatisticsInputBuilder input = new GetFlowTablesStatisticsInputBuilder(); - input.setNode(getNodeRef()); + public void request() { + if (flowTableStatsService != null) { + final GetFlowTablesStatisticsInputBuilder input = new GetFlowTablesStatisticsInputBuilder(); + input.setNode(getNodeRef()); - return requestHelper(flowTableStatsService.getFlowTablesStatistics(input.build())); + requestHelper(flowTableStatsService.getFlowTablesStatistics(input.build()), StatsRequestType.ALL_FLOW); + } } } diff --git a/opendaylight/md-sal/statistics-manager/src/main/java/org/opendaylight/controller/md/statistics/manager/GroupDescStatsTracker.java b/opendaylight/md-sal/statistics-manager/src/main/java/org/opendaylight/controller/md/statistics/manager/GroupDescStatsTracker.java index 90702e4818..663269e25f 100644 --- a/opendaylight/md-sal/statistics-manager/src/main/java/org/opendaylight/controller/md/statistics/manager/GroupDescStatsTracker.java +++ b/opendaylight/md-sal/statistics-manager/src/main/java/org/opendaylight/controller/md/statistics/manager/GroupDescStatsTracker.java @@ -7,9 +7,11 @@ */ 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; -import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.transaction.rev131103.TransactionId; import org.opendaylight.yang.gen.v1.urn.opendaylight.group.statistics.rev131111.GetGroupDescriptionInputBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.group.statistics.rev131111.NodeGroupDescStats; import org.opendaylight.yang.gen.v1.urn.opendaylight.group.statistics.rev131111.NodeGroupDescStatsBuilder; @@ -19,17 +21,18 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.group import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.groups.Group; import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.groups.GroupBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.groups.GroupKey; +import org.opendaylight.yangtools.yang.binding.DataObject; import org.opendaylight.yangtools.yang.binding.InstanceIdentifier; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; -import com.google.common.base.Preconditions; -import com.google.common.util.concurrent.ListenableFuture; - -final class GroupDescStatsTracker extends AbstractStatsTracker { +final class GroupDescStatsTracker extends AbstractListeningStatsTracker { + private static final Logger logger = LoggerFactory.getLogger(GroupDescStatsTracker.class); private final OpendaylightGroupStatisticsService groupStatsService; public GroupDescStatsTracker(OpendaylightGroupStatisticsService groupStatsService, final FlowCapableContext context, final long lifetimeNanos) { super(context, lifetimeNanos); - this.groupStatsService = Preconditions.checkNotNull(groupStatsService); + this.groupStatsService = groupStatsService; } @Override @@ -58,10 +61,57 @@ final class GroupDescStatsTracker extends AbstractStatsTracker request() { - final GetGroupDescriptionInputBuilder input = new GetGroupDescriptionInputBuilder(); - input.setNode(getNodeRef()); + @Override + protected InstanceIdentifier listenPath() { + return getNodeIdentifierBuilder().augmentation(FlowCapableNode.class).child(Group.class).build(); + } + + @Override + protected String statName() { + return "Group Descriptor"; + } + + public void request() { + if (groupStatsService != null) { + final GetGroupDescriptionInputBuilder input = new GetGroupDescriptionInputBuilder(); + input.setNode(getNodeRef()); + + requestHelper(groupStatsService.getGroupDescription(input.build()), StatsRequestType.GROUP_DESC); + } + } + + @Override + public void onDataChanged(DataChangeEvent, DataObject> change) { + for (InstanceIdentifier key : change.getCreatedConfigurationData().keySet()) { + if (Group.class.equals(key.getTargetType())) { + logger.debug("Key {} triggered request", key); + request(); + } else { + logger.debug("Ignoring key {}", key); + } + } + + final DataModificationTransaction trans = startTransaction(); + for (InstanceIdentifier key : change.getRemovedConfigurationData()) { + if (Group.class.equals(key.getTargetType())) { + @SuppressWarnings("unchecked") + InstanceIdentifier group = (InstanceIdentifier)key; + InstanceIdentifier del = InstanceIdentifier.builder(group).augmentation(NodeGroupDescStats.class).toInstance(); + logger.debug("Key {} triggered remove of augmentation {}", key, del); + + trans.removeOperationalData(del); + } + } + trans.commit(); + } + + @Override + public void start(final DataBrokerService dbs) { + if (groupStatsService == null) { + logger.debug("No Group Statistics service, not subscribing to groups on node {}", getNodeIdentifier()); + return; + } - return requestHelper(groupStatsService.getGroupDescription(input.build())); + super.start(dbs); } } diff --git a/opendaylight/md-sal/statistics-manager/src/main/java/org/opendaylight/controller/md/statistics/manager/GroupStatsTracker.java b/opendaylight/md-sal/statistics-manager/src/main/java/org/opendaylight/controller/md/statistics/manager/GroupStatsTracker.java index 40f526e13c..e9488abc1e 100644 --- a/opendaylight/md-sal/statistics-manager/src/main/java/org/opendaylight/controller/md/statistics/manager/GroupStatsTracker.java +++ b/opendaylight/md-sal/statistics-manager/src/main/java/org/opendaylight/controller/md/statistics/manager/GroupStatsTracker.java @@ -7,9 +7,11 @@ */ 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; -import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.transaction.rev131103.TransactionId; import org.opendaylight.yang.gen.v1.urn.opendaylight.group.statistics.rev131111.GetAllGroupStatisticsInputBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.group.statistics.rev131111.NodeGroupStatistics; import org.opendaylight.yang.gen.v1.urn.opendaylight.group.statistics.rev131111.NodeGroupStatisticsBuilder; @@ -19,12 +21,15 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.group import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.groups.Group; import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.groups.GroupBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.groups.GroupKey; +import org.opendaylight.yangtools.yang.binding.DataObject; import org.opendaylight.yangtools.yang.binding.InstanceIdentifier; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import com.google.common.base.Preconditions; -import com.google.common.util.concurrent.ListenableFuture; -final class GroupStatsTracker extends AbstractStatsTracker { +final class GroupStatsTracker extends AbstractListeningStatsTracker { + private static final Logger logger = LoggerFactory.getLogger(GroupStatsTracker.class); private final OpendaylightGroupStatisticsService groupStatsService; GroupStatsTracker(OpendaylightGroupStatisticsService groupStatsService, FlowCapableContext context, long lifetimeNanos) { @@ -58,10 +63,46 @@ final class GroupStatsTracker extends AbstractStatsTracker request() { + @Override + protected InstanceIdentifier listenPath() { + return getNodeIdentifierBuilder().augmentation(FlowCapableNode.class).child(Group.class).build(); + } + + @Override + protected String statName() { + return "Group"; + } + + public void request() { final GetAllGroupStatisticsInputBuilder input = new GetAllGroupStatisticsInputBuilder(); input.setNode(getNodeRef()); - return requestHelper(groupStatsService.getAllGroupStatistics(input.build())); + requestHelper(groupStatsService.getAllGroupStatistics(input.build()), StatsRequestType.ALL_GROUP); + } + + @Override + public void onDataChanged(DataChangeEvent, DataObject> change) { + final DataModificationTransaction trans = startTransaction(); + for (InstanceIdentifier key : change.getRemovedConfigurationData()) { + if (Group.class.equals(key.getTargetType())) { + @SuppressWarnings("unchecked") + InstanceIdentifier group = (InstanceIdentifier)key; + InstanceIdentifier del = InstanceIdentifier.builder(group).augmentation(NodeGroupStatistics.class).toInstance(); + logger.debug("Key {} triggered remove of augmentation {}", key, del); + + trans.removeOperationalData(del); + } + } + trans.commit(); + } + + @Override + public void start(final DataBrokerService dbs) { + if (groupStatsService == null) { + logger.debug("No Group Statistics service, not subscribing to groups on node {}", getNodeIdentifier()); + return; + } + + super.start(dbs); } } diff --git a/opendaylight/md-sal/statistics-manager/src/main/java/org/opendaylight/controller/md/statistics/manager/MeterConfigStatsTracker.java b/opendaylight/md-sal/statistics-manager/src/main/java/org/opendaylight/controller/md/statistics/manager/MeterConfigStatsTracker.java index 150728db16..a32fc220ec 100644 --- a/opendaylight/md-sal/statistics-manager/src/main/java/org/opendaylight/controller/md/statistics/manager/MeterConfigStatsTracker.java +++ b/opendaylight/md-sal/statistics-manager/src/main/java/org/opendaylight/controller/md/statistics/manager/MeterConfigStatsTracker.java @@ -7,29 +7,32 @@ */ 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; import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.meters.Meter; import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.meters.MeterBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.meters.MeterKey; -import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.transaction.rev131103.TransactionId; import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.statistics.rev131111.GetAllMeterConfigStatisticsInputBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.statistics.rev131111.NodeMeterConfigStats; import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.statistics.rev131111.NodeMeterConfigStatsBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.statistics.rev131111.OpendaylightMeterStatisticsService; import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.statistics.rev131111.nodes.node.meter.MeterConfigStatsBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.types.rev130918.meter.config.stats.reply.MeterConfigStats; +import org.opendaylight.yangtools.yang.binding.DataObject; import org.opendaylight.yangtools.yang.binding.InstanceIdentifier; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; -import com.google.common.base.Preconditions; -import com.google.common.util.concurrent.ListenableFuture; - -final class MeterConfigStatsTracker extends AbstractStatsTracker { +final class MeterConfigStatsTracker extends AbstractListeningStatsTracker { + private static final Logger logger = LoggerFactory.getLogger(MeterConfigStatsTracker.class); private final OpendaylightMeterStatisticsService meterStatsService; protected MeterConfigStatsTracker(OpendaylightMeterStatisticsService meterStatsService, final FlowCapableContext context, long lifetimeNanos) { super(context, lifetimeNanos); - this.meterStatsService = Preconditions.checkNotNull(meterStatsService); + this.meterStatsService = meterStatsService; } @Override @@ -60,10 +63,50 @@ final class MeterConfigStatsTracker extends AbstractStatsTracker request() { - GetAllMeterConfigStatisticsInputBuilder input = new GetAllMeterConfigStatisticsInputBuilder(); - input.setNode(getNodeRef()); + public void request() { + if (meterStatsService != null) { + GetAllMeterConfigStatisticsInputBuilder input = new GetAllMeterConfigStatisticsInputBuilder(); + input.setNode(getNodeRef()); + + requestHelper(meterStatsService.getAllMeterConfigStatistics(input.build()), StatsRequestType.METER_CONFIG); + } + } + + @Override + public void onDataChanged(DataChangeEvent, DataObject> change) { + final DataModificationTransaction trans = startTransaction(); + + for (InstanceIdentifier key : change.getRemovedConfigurationData()) { + if (Meter.class.equals(key.getTargetType())) { + @SuppressWarnings("unchecked") + InstanceIdentifier meter = (InstanceIdentifier)key; + + InstanceIdentifier nodeMeterStatisticsAugmentation = + InstanceIdentifier.builder(meter).augmentation(NodeMeterConfigStats.class).toInstance(); + trans.removeOperationalData(nodeMeterStatisticsAugmentation); + } + } + + trans.commit(); + } + + @Override + protected InstanceIdentifier listenPath() { + return getNodeIdentifierBuilder().augmentation(FlowCapableNode.class).child(Meter.class).build(); + } + + @Override + protected String statName() { + return "Meter Config"; + } + + @Override + public void start(final DataBrokerService dbs) { + if (meterStatsService == null) { + logger.debug("No Meter Statistics service, not subscribing to meter on node {}", getNodeIdentifier()); + return; + } - return requestHelper(meterStatsService.getAllMeterConfigStatistics(input.build())); + super.start(dbs); } } diff --git a/opendaylight/md-sal/statistics-manager/src/main/java/org/opendaylight/controller/md/statistics/manager/MeterStatsTracker.java b/opendaylight/md-sal/statistics-manager/src/main/java/org/opendaylight/controller/md/statistics/manager/MeterStatsTracker.java index 807e82c9ef..1e1ed6b916 100644 --- a/opendaylight/md-sal/statistics-manager/src/main/java/org/opendaylight/controller/md/statistics/manager/MeterStatsTracker.java +++ b/opendaylight/md-sal/statistics-manager/src/main/java/org/opendaylight/controller/md/statistics/manager/MeterStatsTracker.java @@ -7,29 +7,32 @@ */ 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; import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.meters.Meter; import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.meters.MeterBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.meters.MeterKey; -import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.transaction.rev131103.TransactionId; import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.statistics.rev131111.GetAllMeterStatisticsInputBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.statistics.rev131111.NodeMeterStatistics; import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.statistics.rev131111.NodeMeterStatisticsBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.statistics.rev131111.OpendaylightMeterStatisticsService; import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.statistics.rev131111.nodes.node.meter.MeterStatisticsBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.types.rev130918.meter.statistics.reply.MeterStats; +import org.opendaylight.yangtools.yang.binding.DataObject; import org.opendaylight.yangtools.yang.binding.InstanceIdentifier; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; -import com.google.common.base.Preconditions; -import com.google.common.util.concurrent.ListenableFuture; - -final class MeterStatsTracker extends AbstractStatsTracker { +final class MeterStatsTracker extends AbstractListeningStatsTracker { + private static final Logger logger = LoggerFactory.getLogger(MeterStatsTracker.class); private final OpendaylightMeterStatisticsService meterStatsService; MeterStatsTracker(OpendaylightMeterStatisticsService meterStatsService, final FlowCapableContext context, long lifetimeNanos) { super(context, lifetimeNanos); - this.meterStatsService = Preconditions.checkNotNull(meterStatsService); + this.meterStatsService = meterStatsService; } @Override @@ -59,10 +62,54 @@ final class MeterStatsTracker extends AbstractStatsTracker request() { - GetAllMeterStatisticsInputBuilder input = new GetAllMeterStatisticsInputBuilder(); - input.setNode(getNodeRef()); + public void request() { + if (meterStatsService != null) { + GetAllMeterStatisticsInputBuilder input = new GetAllMeterStatisticsInputBuilder(); + input.setNode(getNodeRef()); + + requestHelper(meterStatsService.getAllMeterStatistics(input.build()), StatsRequestType.ALL_METER); + } + } + + @Override + public void onDataChanged(DataChangeEvent, DataObject> change) { + for (InstanceIdentifier key : change.getCreatedConfigurationData().keySet()) { + if (Meter.class.equals(key.getTargetType())) { + request(); + } + } + + final DataModificationTransaction trans = startTransaction(); + for (InstanceIdentifier key : change.getRemovedConfigurationData()) { + if (Meter.class.equals(key.getTargetType())) { + @SuppressWarnings("unchecked") + InstanceIdentifier meter = (InstanceIdentifier)key; + + InstanceIdentifier nodeMeterStatisticsAugmentation = + InstanceIdentifier.builder(meter).augmentation(NodeMeterStatistics.class).toInstance(); + trans.removeOperationalData(nodeMeterStatisticsAugmentation); + } + } + trans.commit(); + } + + @Override + protected InstanceIdentifier listenPath() { + return getNodeIdentifierBuilder().augmentation(FlowCapableNode.class).child(Meter.class).build(); + } + + @Override + protected String statName() { + return "Meter"; + } + + @Override + public void start(final DataBrokerService dbs) { + if (meterStatsService == null) { + logger.debug("No Meter Statistics service, not subscribing to meters on node {}", getNodeIdentifier()); + return; + } - return requestHelper(meterStatsService.getAllMeterStatistics(input.build())); + super.start(dbs); } } 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 83d9da13f0..8ae6bbd4de 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,8 +7,8 @@ */ 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.node.NodeConnector; import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.node.NodeConnectorBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.node.NodeConnectorKey; @@ -22,16 +22,13 @@ import org.opendaylight.yangtools.yang.binding.InstanceIdentifier; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import com.google.common.base.Preconditions; -import com.google.common.util.concurrent.ListenableFuture; - final class NodeConnectorStatsTracker extends AbstractStatsTracker { private static final Logger logger = LoggerFactory.getLogger(NodeConnectorStatsTracker.class); private final OpendaylightPortStatisticsService portStatsService; NodeConnectorStatsTracker(final OpendaylightPortStatisticsService portStatsService, final FlowCapableContext context, long lifetimeNanos) { super(context, lifetimeNanos); - this.portStatsService = Preconditions.checkNotNull(portStatsService); + this.portStatsService = portStatsService; } @Override @@ -77,10 +74,12 @@ final class NodeConnectorStatsTracker extends AbstractStatsTracker request() { - final GetAllNodeConnectorsStatisticsInputBuilder input = new GetAllNodeConnectorsStatisticsInputBuilder(); - input.setNode(getNodeRef()); + public void request() { + if (portStatsService != null) { + final GetAllNodeConnectorsStatisticsInputBuilder input = new GetAllNodeConnectorsStatisticsInputBuilder(); + input.setNode(getNodeRef()); - return requestHelper(portStatsService.getAllNodeConnectorsStatistics(input.build())); + requestHelper(portStatsService.getAllNodeConnectorsStatistics(input.build()), StatsRequestType.ALL_PORT); + } } } 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 413c01b1bc..691b9c0b15 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 @@ -18,7 +18,6 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.Fl import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.tables.Table; import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.tables.TableBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.tables.TableKey; -import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.tables.table.Flow; import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.statistics.rev130819.AggregateFlowStatisticsData; import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.statistics.rev130819.AggregateFlowStatisticsDataBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.statistics.rev130819.OpendaylightFlowStatisticsService; @@ -28,7 +27,6 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.table.statistics.rev13 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.table.statistics.rev131215.flow.table.and.statistics.map.FlowTableAndStatisticsMap; 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.yang.gen.v1.urn.opendaylight.flow.types.queue.rev130925.QueueId; import org.opendaylight.yang.gen.v1.urn.opendaylight.group.statistics.rev131111.NodeGroupFeatures; import org.opendaylight.yang.gen.v1.urn.opendaylight.group.statistics.rev131111.NodeGroupFeaturesBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.group.statistics.rev131111.OpendaylightGroupStatisticsService; @@ -36,7 +34,6 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.group.statistics.rev131111. import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.GroupFeatures; import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.group.desc.stats.reply.GroupDescStats; import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.group.statistics.reply.GroupStats; -import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeConnectorId; import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeRef; import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.Nodes; import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.Node; @@ -102,41 +99,14 @@ public final class NodeStatisticsHandler implements AutoCloseable, FlowCapableCo final long lifetimeNanos = TimeUnit.MILLISECONDS.toNanos(StatisticsProvider.STATS_COLLECTION_MILLIS * NUMBER_OF_WAIT_CYCLES); - if (flowStatsService != null) { - flowStats = new FlowStatsTracker(flowStatsService, this, lifetimeNanos); - } else { - flowStats = null; - } - if (flowTableStatsService != null) { - flowTableStats = new FlowTableStatsTracker(flowTableStatsService, this, lifetimeNanos); - } else { - flowTableStats = null; - } - - if (groupStatsService != null) { - groupDescStats = new GroupDescStatsTracker(groupStatsService, this, lifetimeNanos); - groupStats = new GroupStatsTracker(groupStatsService, this, lifetimeNanos); - } else { - groupDescStats = null; - groupStats = null; - } - if (meterStatsService != null) { - meterConfigStats = new MeterConfigStatsTracker(meterStatsService, this, lifetimeNanos); - meterStats = new MeterStatsTracker(meterStatsService, this, lifetimeNanos); - } else { - meterConfigStats = null; - meterStats = null; - } - if (portStatsService != null) { - nodeConnectorStats = new NodeConnectorStatsTracker(portStatsService, this, lifetimeNanos); - } else { - nodeConnectorStats = null; - } - if (queueStatsService != null) { - queueStats = new QueueStatsTracker(queueStatsService, this, lifetimeNanos); - } else { - queueStats = null; - } + flowStats = new FlowStatsTracker(flowStatsService, this, lifetimeNanos); + flowTableStats = new FlowTableStatsTracker(flowTableStatsService, this, lifetimeNanos); + groupDescStats = new GroupDescStatsTracker(groupStatsService, this, lifetimeNanos); + groupStats = new GroupStatsTracker(groupStatsService, this, lifetimeNanos); + meterConfigStats = new MeterConfigStatsTracker(meterStatsService, this, lifetimeNanos); + meterStats = new MeterStatsTracker(meterStatsService, this, lifetimeNanos); + nodeConnectorStats = new NodeConnectorStatsTracker(portStatsService, this, lifetimeNanos); + queueStats = new QueueStatsTracker(queueStatsService, this, lifetimeNanos); } public NodeKey getTargetNodeKey() { @@ -285,88 +255,51 @@ public final class NodeStatisticsHandler implements AutoCloseable, FlowCapableCo public synchronized void requestPeriodicStatistics() { logger.debug("Send requests for statistics collection to node : {}", targetNodeKey); - if (flowTableStats != null){ - registerTransaction(flowTableStats.request(), StatsRequestType.ALL_FLOW); - } - if (flowStats != null){ - // FIXME: it does not make sense to trigger this before sendAllFlowTablesStatisticsRequest() - // comes back -- we do not have any tables anyway. - final Collection tables = flowTableStats.getTables(); - logger.debug("Node {} supports {} table(s)", targetNodeKey, tables.size()); - for (final TableKey key : tables) { - logger.debug("Send aggregate stats request for flow table {} to node {}", key.getId(), targetNodeKey); - registerTableTransaction(flowStats.requestAggregateFlows(key), key.getId()); - } - - registerTransaction(flowStats.requestAllFlowsAllTables(), StatsRequestType.ALL_FLOW); - } + flowTableStats.request(); - if (nodeConnectorStats != null) { - registerTransaction(nodeConnectorStats.request(), StatsRequestType.ALL_PORT); + // FIXME: it does not make sense to trigger this before sendAllFlowTablesStatisticsRequest() + // comes back -- we do not have any tables anyway. + final Collection tables = flowTableStats.getTables(); + logger.debug("Node {} supports {} table(s)", targetNodeKey, tables.size()); + for (final TableKey key : tables) { + logger.debug("Send aggregate stats request for flow table {} to node {}", key.getId(), targetNodeKey); + flowStats.requestAggregateFlows(key); } - if (groupStats != null) { - registerTransaction(groupStats.request(), StatsRequestType.ALL_GROUP); - } - sendGroupDescriptionRequest(); - - if (meterStats != null) { - registerTransaction(meterStats.request(), StatsRequestType.ALL_METER); - } - sendMeterConfigStatisticsRequest(); - - if(queueStats != null) { - registerTransaction(queueStats.request(), StatsRequestType.ALL_QUEUE_STATS); - } + flowStats.requestAllFlowsAllTables(); + nodeConnectorStats.request(); + groupStats.request(); + groupDescStats.request(); + meterStats.request(); + meterConfigStats.request(); + queueStats.request(); } public synchronized void start() { + flowStats.start(dps); + groupDescStats.start(dps); + groupStats.start(dps); + meterConfigStats.start(dps); + meterStats.start(dps); + queueStats.start(dps); + requestPeriodicStatistics(); } @Override public synchronized void close() { - // FIXME: cleanup any resources we hold (registrations, etc.) - logger.debug("Statistics handler for {} shut down", targetNodeKey.getId()); - } - - synchronized void sendFlowStatsFromTableRequest(Flow flow) { - if (flowStats == null) { - logger.debug("No Flow statistics service, not sending a request"); - return; - } - - registerTransaction(flowStats.requestFlow(flow), StatsRequestType.ALL_FLOW); - } - - synchronized void sendGroupDescriptionRequest() { - if (groupStats == null) { - logger.debug("No Group Descriptor statistics service, not sending a request"); - return; - } - - registerTransaction(groupDescStats.request(), StatsRequestType.GROUP_DESC); - } + flowStats.close(); + groupDescStats.close(); + groupStats.close(); + meterConfigStats.close(); + meterStats.close(); + queueStats.close(); - synchronized void sendMeterConfigStatisticsRequest() { - if (meterConfigStats == null) { - logger.debug("No Meter Config statistics service, not sending a request"); - return; - } - - registerTransaction(meterConfigStats.request(), StatsRequestType.METER_CONFIG); - } - - synchronized void sendQueueStatsFromGivenNodeConnector(NodeConnectorId nodeConnectorId, QueueId queueId) { - if (queueStats == null) { - logger.debug("No Queue statistics service, not sending a request"); - return; - } - - registerTransaction(queueStats.request(nodeConnectorId, queueId), StatsRequestType.ALL_QUEUE_STATS); + logger.debug("Statistics handler for {} shut down", targetNodeKey.getId()); } - private void registerTransaction(final ListenableFuture future, final StatsRequestType type) { + @Override + public void registerTransaction(final ListenableFuture future, final StatsRequestType type) { Futures.addCallback(future, new FutureCallback() { @Override public void onSuccess(TransactionId result) { @@ -381,7 +314,8 @@ public final class NodeStatisticsHandler implements AutoCloseable, FlowCapableCo }); } - private void registerTableTransaction(final ListenableFuture future, final Short id) { + @Override + public void registerTableTransaction(final ListenableFuture future, final Short id) { Futures.addCallback(future, new FutureCallback() { @Override public void onSuccess(TransactionId result) { 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 a9db771fa6..2ea9ecc96d 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 @@ -7,9 +7,13 @@ */ 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; -import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.transaction.rev131103.TransactionId; import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.port.rev130925.queues.Queue; import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.port.rev130925.queues.QueueBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.port.rev130925.queues.QueueKey; @@ -24,20 +28,18 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.queue.statistics.rev131216. import org.opendaylight.yang.gen.v1.urn.opendaylight.queue.statistics.rev131216.OpendaylightQueueStatisticsService; import org.opendaylight.yang.gen.v1.urn.opendaylight.queue.statistics.rev131216.flow.capable.node.connector.queue.statistics.FlowCapableNodeConnectorQueueStatisticsBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.queue.statistics.rev131216.queue.id.and.statistics.map.QueueIdAndStatisticsMap; +import org.opendaylight.yangtools.yang.binding.DataObject; import org.opendaylight.yangtools.yang.binding.InstanceIdentifier; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import com.google.common.base.Preconditions; -import com.google.common.util.concurrent.ListenableFuture; - -final class QueueStatsTracker extends AbstractStatsTracker { +final class QueueStatsTracker extends AbstractListeningStatsTracker { private static final Logger logger = LoggerFactory.getLogger(QueueStatsTracker.class); private final OpendaylightQueueStatisticsService queueStatsService; QueueStatsTracker(OpendaylightQueueStatisticsService queueStatsService, final FlowCapableContext context, long lifetimeNanos) { super(context, lifetimeNanos); - this.queueStatsService = Preconditions.checkNotNull(queueStatsService); + this.queueStatsService = queueStatsService; } @Override @@ -81,20 +83,73 @@ final class QueueStatsTracker extends AbstractStatsTracker request() { - GetAllQueuesStatisticsFromAllPortsInputBuilder input = new GetAllQueuesStatisticsFromAllPortsInputBuilder(); - input.setNode(getNodeRef()); + public void request() { + if (queueStatsService != null) { + GetAllQueuesStatisticsFromAllPortsInputBuilder input = new GetAllQueuesStatisticsFromAllPortsInputBuilder(); + input.setNode(getNodeRef()); + + requestHelper(queueStatsService.getAllQueuesStatisticsFromAllPorts(input.build()), StatsRequestType.ALL_QUEUE_STATS); + } + } + + public void request(NodeConnectorId nodeConnectorId, QueueId queueId) { + if (queueStatsService != null) { + GetQueueStatisticsFromGivenPortInputBuilder input = new GetQueueStatisticsFromGivenPortInputBuilder(); + + input.setNode(getNodeRef()); + input.setNodeConnectorId(nodeConnectorId); + input.setQueueId(queueId); - return requestHelper(queueStatsService.getAllQueuesStatisticsFromAllPorts(input.build())); + requestHelper(queueStatsService.getQueueStatisticsFromGivenPort(input.build()), StatsRequestType.ALL_QUEUE_STATS); + } } - public ListenableFuture request(NodeConnectorId nodeConnectorId, QueueId queueId) { - GetQueueStatisticsFromGivenPortInputBuilder input = new GetQueueStatisticsFromGivenPortInputBuilder(); + @Override + public void onDataChanged(DataChangeEvent, DataObject> change) { + for (Entry, DataObject> e : change.getCreatedConfigurationData().entrySet()) { + if (Queue.class.equals(e.getKey().getTargetType())) { + final Queue queue = (Queue) e.getValue(); + final NodeConnectorKey key = e.getKey().firstKeyOf(NodeConnector.class, NodeConnectorKey.class); + logger.debug("Key {} triggered request for connector {} queue {}", key.getId(), queue.getQueueId()); + request(key.getId(), queue.getQueueId()); + } else { + logger.debug("Ignoring key {}", e.getKey()); + } + } + + final DataModificationTransaction trans = startTransaction(); + for (InstanceIdentifier key : change.getRemovedConfigurationData()) { + if (Queue.class.equals(key.getTargetType())) { + @SuppressWarnings("unchecked") + final InstanceIdentifier queue = (InstanceIdentifier)key; + final InstanceIdentifier del = InstanceIdentifier.builder(queue) + .augmentation(FlowCapableNodeConnectorQueueStatisticsData.class).build(); + logger.debug("Key {} triggered remove of augmentation {}", key, del); + + trans.removeOperationalData(del); + } + } + trans.commit(); + } - input.setNode(getNodeRef()); - input.setNodeConnectorId(nodeConnectorId); - input.setQueueId(queueId); + @Override + protected InstanceIdentifier listenPath() { + return getNodeIdentifierBuilder().child(NodeConnector.class) + .augmentation(FlowCapableNodeConnector.class).child(Queue.class).build(); + } + + @Override + protected String statName() { + return "Queue"; + } + + @Override + public void start(final DataBrokerService dbs) { + if (queueStatsService == null) { + logger.debug("No Queue Statistics service, not subscribing to queues on node {}", getNodeIdentifier()); + return; + } - return requestHelper(queueStatsService.getQueueStatisticsFromGivenPort(input.build())); + super.start(dbs); } } diff --git a/opendaylight/md-sal/statistics-manager/src/main/java/org/opendaylight/controller/md/statistics/manager/StatisticsManagerActivator.java b/opendaylight/md-sal/statistics-manager/src/main/java/org/opendaylight/controller/md/statistics/manager/StatisticsManagerActivator.java index b59482e96b..5bcbef119a 100644 --- a/opendaylight/md-sal/statistics-manager/src/main/java/org/opendaylight/controller/md/statistics/manager/StatisticsManagerActivator.java +++ b/opendaylight/md-sal/statistics-manager/src/main/java/org/opendaylight/controller/md/statistics/manager/StatisticsManagerActivator.java @@ -11,7 +11,6 @@ package org.opendaylight.controller.md.statistics.manager; import org.opendaylight.controller.sal.binding.api.AbstractBindingAwareProvider; import org.opendaylight.controller.sal.binding.api.BindingAwareBroker.ProviderContext; import org.opendaylight.controller.sal.binding.api.NotificationProviderService; -import org.opendaylight.controller.sal.binding.api.data.DataBrokerService; import org.opendaylight.controller.sal.binding.api.data.DataProviderService; import org.osgi.framework.BundleContext; @@ -20,12 +19,11 @@ public class StatisticsManagerActivator extends AbstractBindingAwareProvider { @Override public void onSessionInitiated(ProviderContext session) { - final DataBrokerService dbs = session.getSALService(DataBrokerService.class); final DataProviderService dps = session.getSALService(DataProviderService.class); final NotificationProviderService nps = session.getSALService(NotificationProviderService.class); statsProvider = new StatisticsProvider(dps); - statsProvider.start(dbs, nps, session); + statsProvider.start(nps, session); } @Override diff --git a/opendaylight/md-sal/statistics-manager/src/main/java/org/opendaylight/controller/md/statistics/manager/StatisticsProvider.java b/opendaylight/md-sal/statistics-manager/src/main/java/org/opendaylight/controller/md/statistics/manager/StatisticsProvider.java index 842cdaf292..8ffa5d6732 100644 --- a/opendaylight/md-sal/statistics-manager/src/main/java/org/opendaylight/controller/md/statistics/manager/StatisticsProvider.java +++ b/opendaylight/md-sal/statistics-manager/src/main/java/org/opendaylight/controller/md/statistics/manager/StatisticsProvider.java @@ -16,25 +16,14 @@ import java.util.concurrent.TimeUnit; import org.opendaylight.controller.sal.binding.api.NotificationProviderService; import org.opendaylight.controller.sal.binding.api.RpcConsumerRegistry; -import org.opendaylight.controller.sal.binding.api.data.DataBrokerService; import org.opendaylight.controller.sal.binding.api.data.DataChangeListener; -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; -import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.FlowCapableNodeConnector; -import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.meters.Meter; -import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.tables.Table; -import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.tables.table.Flow; import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.statistics.rev130819.OpendaylightFlowStatisticsService; import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.table.statistics.rev131215.OpendaylightFlowTableStatisticsService; -import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.port.rev130925.queues.Queue; -import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.queue.rev130925.QueueId; import org.opendaylight.yang.gen.v1.urn.opendaylight.group.statistics.rev131111.OpendaylightGroupStatisticsService; -import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.groups.Group; -import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeConnectorId; import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeId; import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.Nodes; -import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.node.NodeConnector; import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.Node; import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.NodeKey; import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.statistics.rev131111.OpendaylightMeterStatisticsService; @@ -42,7 +31,6 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.port.statistics.rev131214.O import org.opendaylight.yang.gen.v1.urn.opendaylight.queue.statistics.rev131216.OpendaylightQueueStatisticsService; import org.opendaylight.yangtools.concepts.ListenerRegistration; import org.opendaylight.yangtools.concepts.Registration; -import org.opendaylight.yangtools.yang.binding.DataObject; import org.opendaylight.yangtools.yang.binding.InstanceIdentifier; import org.opendaylight.yangtools.yang.binding.NotificationListener; import org.slf4j.Logger; @@ -83,8 +71,6 @@ public class StatisticsProvider implements AutoCloseable { private OpendaylightQueueStatisticsService queueStatsService; - private StatisticsUpdateHandler statsUpdateHandler; - public StatisticsProvider(final DataProviderService dataService) { this.dps = Preconditions.checkNotNull(dataService); } @@ -95,7 +81,7 @@ public class StatisticsProvider implements AutoCloseable { private ListenerRegistration flowCapableTrackerRegistration; - public void start(final DataBrokerService dbs, final NotificationProviderService nps, final RpcConsumerRegistry rpcRegistry) { + public void start(final NotificationProviderService nps, final RpcConsumerRegistry rpcRegistry) { // Get Group/Meter statistics service instances groupStatsService = rpcRegistry.getRpcService(OpendaylightGroupStatisticsService.class); @@ -112,12 +98,9 @@ public class StatisticsProvider implements AutoCloseable { final InstanceIdentifier fcnId = InstanceIdentifier.builder(Nodes.class) .child(Node.class).augmentation(FlowCapableNode.class).build(); spLogger.debug("Registering FlowCapable tracker to {}", fcnId); - this.flowCapableTrackerRegistration = dbs.registerDataChangeListener(fcnId, + this.flowCapableTrackerRegistration = dps.registerDataChangeListener(fcnId, new FlowCapableTracker(this, fcnId)); - statsUpdateHandler = new StatisticsUpdateHandler(StatisticsProvider.this); - registerDataStoreUpdateListener(dbs); - timer.schedule(new TimerTask() { @Override public void run() { @@ -142,69 +125,6 @@ public class StatisticsProvider implements AutoCloseable { spLogger.info("Statistics Provider started."); } - private void registerDataStoreUpdateListener(DataBrokerService dbs) { - // FIXME: the below should be broken out into StatisticsUpdateHandler - - //Register for flow updates - InstanceIdentifier pathFlow = InstanceIdentifier.builder(Nodes.class).child(Node.class) - .augmentation(FlowCapableNode.class) - .child(Table.class) - .child(Flow.class).toInstance(); - dbs.registerDataChangeListener(pathFlow, statsUpdateHandler); - - //Register for meter updates - InstanceIdentifier pathMeter = InstanceIdentifier.builder(Nodes.class).child(Node.class) - .augmentation(FlowCapableNode.class) - .child(Meter.class).toInstance(); - - dbs.registerDataChangeListener(pathMeter, statsUpdateHandler); - - //Register for group updates - InstanceIdentifier pathGroup = InstanceIdentifier.builder(Nodes.class).child(Node.class) - .augmentation(FlowCapableNode.class) - .child(Group.class).toInstance(); - dbs.registerDataChangeListener(pathGroup, statsUpdateHandler); - - //Register for queue updates - InstanceIdentifier pathQueue = InstanceIdentifier.builder(Nodes.class).child(Node.class) - .child(NodeConnector.class) - .augmentation(FlowCapableNodeConnector.class) - .child(Queue.class).toInstance(); - dbs.registerDataChangeListener(pathQueue, statsUpdateHandler); - } - - protected DataModificationTransaction startChange() { - return dps.beginTransaction(); - } - - public void sendFlowStatsFromTableRequest(NodeKey node, Flow flow) { - final NodeStatisticsHandler h = getStatisticsHandler(node.getId()); - if (h != null) { - h.sendFlowStatsFromTableRequest(flow); - } - } - - public void sendGroupDescriptionRequest(NodeKey node) { - final NodeStatisticsHandler h = getStatisticsHandler(node.getId()); - if (h != null) { - h.sendGroupDescriptionRequest(); - } - } - - public void sendMeterConfigStatisticsRequest(NodeKey node) { - final NodeStatisticsHandler h = getStatisticsHandler(node.getId()); - if (h != null) { - h.sendMeterConfigStatisticsRequest(); - } - } - - public void sendQueueStatsFromGivenNodeConnector(NodeKey node,NodeConnectorId nodeConnectorId, QueueId queueId) { - final NodeStatisticsHandler h = getStatisticsHandler(node.getId()); - if (h != null) { - h.sendQueueStatsFromGivenNodeConnector(nodeConnectorId, queueId); - } - } - /** * Get the handler for a particular node. * diff --git a/opendaylight/md-sal/statistics-manager/src/main/java/org/opendaylight/controller/md/statistics/manager/StatisticsUpdateHandler.java b/opendaylight/md-sal/statistics-manager/src/main/java/org/opendaylight/controller/md/statistics/manager/StatisticsUpdateHandler.java deleted file mode 100644 index e22bd0874f..0000000000 --- a/opendaylight/md-sal/statistics-manager/src/main/java/org/opendaylight/controller/md/statistics/manager/StatisticsUpdateHandler.java +++ /dev/null @@ -1,121 +0,0 @@ -/* - * Copyright IBM Corporation, 2013. 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.Map; -import java.util.Set; - -import org.opendaylight.controller.md.sal.common.api.data.DataChangeEvent; -import org.opendaylight.controller.sal.binding.api.data.DataChangeListener; -import org.opendaylight.controller.sal.binding.api.data.DataModificationTransaction; -import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.meters.Meter; -import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.tables.table.Flow; -import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.statistics.rev130819.FlowStatisticsData; -import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.port.rev130925.queues.Queue; -import org.opendaylight.yang.gen.v1.urn.opendaylight.group.statistics.rev131111.NodeGroupDescStats; -import org.opendaylight.yang.gen.v1.urn.opendaylight.group.statistics.rev131111.NodeGroupStatistics; -import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.groups.Group; -import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.node.NodeConnector; -import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.node.NodeConnectorKey; -import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.Node; -import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.NodeKey; -import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.statistics.rev131111.NodeMeterConfigStats; -import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.statistics.rev131111.NodeMeterStatistics; -import org.opendaylight.yang.gen.v1.urn.opendaylight.queue.statistics.rev131216.FlowCapableNodeConnectorQueueStatisticsData; -import org.opendaylight.yangtools.yang.binding.DataObject; -import org.opendaylight.yangtools.yang.binding.InstanceIdentifier; - -/** - * Following are two main responsibilities of the class - * 1) Listen for the create changes in config data store for tree nodes (Flow,Group,Meter,Queue) - * and send statistics request to the switch to fetch the statistics - * - * 2)Listen for the remove changes in config data store for tree nodes (Flow,Group,Meter,Queue) - * and remove the relative statistics data from operational data store. - * - * @author avishnoi@in.ibm.com - * - */ -public class StatisticsUpdateHandler implements DataChangeListener { - private final StatisticsProvider statisticsManager; - - public StatisticsUpdateHandler(final StatisticsProvider manager){ - this.statisticsManager = manager; - } - - @SuppressWarnings("unchecked") - @Override - public void onDataChanged(DataChangeEvent, DataObject> change) { - Map, DataObject> additions = change.getCreatedConfigurationData(); - for (InstanceIdentifier dataObjectInstance : additions.keySet()) { - DataObject dataObject = additions.get(dataObjectInstance); - NodeKey nodeII = dataObjectInstance.firstKeyOf(Node.class, NodeKey.class); - if(dataObject instanceof Flow){ - Flow flow = (Flow) dataObject; - this.statisticsManager.sendFlowStatsFromTableRequest(nodeII, flow); - } - if(dataObject instanceof Meter){ - this.statisticsManager.sendMeterConfigStatisticsRequest(nodeII); - } - if(dataObject instanceof Group){ - this.statisticsManager.sendGroupDescriptionRequest(nodeII); - } - if(dataObject instanceof Queue){ - Queue queue = (Queue) dataObject; - InstanceIdentifier nodeConnectorII = dataObjectInstance.firstIdentifierOf(NodeConnector.class); - NodeConnectorKey nodeConnectorKey = InstanceIdentifier.keyOf(nodeConnectorII); - this.statisticsManager.sendQueueStatsFromGivenNodeConnector(nodeII, nodeConnectorKey.getId(), queue.getQueueId()); - } - } - - DataModificationTransaction it = this.statisticsManager.startChange(); - Set> removals = change.getRemovedConfigurationData(); - for (InstanceIdentifier dataObjectInstance : removals) { - DataObject dataObject = change.getOriginalConfigurationData().get(dataObjectInstance); - - if(dataObject instanceof Flow){ - InstanceIdentifier flowII = (InstanceIdentifier)dataObjectInstance; - InstanceIdentifier flowAugmentation = - InstanceIdentifier.builder(flowII).augmentation(FlowStatisticsData.class).toInstance(); - it.removeOperationalData(flowAugmentation); - } - if(dataObject instanceof Meter){ - InstanceIdentifier meterII = (InstanceIdentifier)dataObjectInstance; - - InstanceIdentifier nodeMeterConfigStatsAugmentation = - InstanceIdentifier.builder(meterII).augmentation(NodeMeterConfigStats.class).toInstance(); - it.removeOperationalData(nodeMeterConfigStatsAugmentation); - - InstanceIdentifier nodeMeterStatisticsAugmentation = - InstanceIdentifier.builder(meterII).augmentation(NodeMeterStatistics.class).toInstance(); - it.removeOperationalData(nodeMeterStatisticsAugmentation); - } - - if(dataObject instanceof Group){ - InstanceIdentifier groupII = (InstanceIdentifier)dataObjectInstance; - - InstanceIdentifier nodeGroupDescStatsAugmentation = - InstanceIdentifier.builder(groupII).augmentation(NodeGroupDescStats.class).toInstance(); - it.removeOperationalData(nodeGroupDescStatsAugmentation); - - InstanceIdentifier nodeGroupStatisticsAugmentation = - InstanceIdentifier.builder(groupII).augmentation(NodeGroupStatistics.class).toInstance(); - it.removeOperationalData(nodeGroupStatisticsAugmentation); - } - - if(dataObject instanceof Queue){ - InstanceIdentifier queueII = (InstanceIdentifier)dataObjectInstance; - - InstanceIdentifier nodeConnectorQueueStatisticsDataAugmentation = - InstanceIdentifier.builder(queueII).augmentation(FlowCapableNodeConnectorQueueStatisticsData.class).toInstance(); - it.removeOperationalData(nodeConnectorQueueStatisticsDataAugmentation); - } - } - it.commit(); - } -} -- 2.36.6