Fix bug 2450 - Statistics collection slow - performance
[controller.git] / opendaylight / md-sal / statistics-manager / src / main / java / org / opendaylight / controller / md / statistics / manager / StatisticsManager.java
1 /**
2  * Copyright (c) 2014 Cisco Systems, Inc. and others.  All rights reserved.
3  *
4  * This program and the accompanying materials are made available under the
5  * terms of the Eclipse Public License v1.0 which accompanies this distribution,
6  * and is available at http://www.eclipse.org/legal/epl-v10.html
7  */
8
9 package org.opendaylight.controller.md.statistics.manager;
10
11 import java.util.List;
12
13 import org.opendaylight.controller.md.sal.binding.api.ReadWriteTransaction;
14 import org.opendaylight.controller.md.sal.common.api.data.TransactionChainListener;
15 import org.opendaylight.controller.md.statistics.manager.StatPermCollector.StatCapabTypes;
16 import org.opendaylight.controller.md.statistics.manager.impl.StatisticsManagerConfig;
17 import org.opendaylight.controller.sal.binding.api.NotificationProviderService;
18 import org.opendaylight.controller.sal.binding.api.RpcConsumerRegistry;
19 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.meters.Meter;
20 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.tables.table.Flow;
21 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.statistics.rev130819.OpendaylightFlowStatisticsListener;
22 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.table.statistics.rev131215.OpendaylightFlowTableStatisticsListener;
23 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.transaction.rev131103.TransactionId;
24 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.port.rev130925.queues.Queue;
25 import org.opendaylight.yang.gen.v1.urn.opendaylight.group.statistics.rev131111.OpendaylightGroupStatisticsListener;
26 import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.groups.Group;
27 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.Node;
28 import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.statistics.rev131111.OpendaylightMeterStatisticsListener;
29 import org.opendaylight.yang.gen.v1.urn.opendaylight.port.statistics.rev131214.OpendaylightPortStatisticsListener;
30 import org.opendaylight.yang.gen.v1.urn.opendaylight.queue.statistics.rev131216.OpendaylightQueueStatisticsListener;
31 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
32
33 /**
34  * statistics-manager
35  * org.opendaylight.controller.md.statistics.manager
36  *
37  * StatisticsManager
38  * It represent a central point for whole module. Implementation
39  * StatisticsManager registers all Operation/DS {@link StatNotifyCommiter} and
40  * Config/DS {@StatListeningCommiter}, as well as {@link StatPermCollector}
41  * for statistic collecting and {@link StatRpcMsgManager} as Device RPCs provider.
42  * In next, StatisticsManager provides all DS contact Transaction services.
43  *
44  * @author <a href="mailto:vdemcak@cisco.com">Vaclav Demcak</a>
45  *
46  * Created: Aug 27, 2014
47  */
48 public interface StatisticsManager extends AutoCloseable, TransactionChainListener {
49
50     /**
51      * StatDataStoreOperation
52      * Interface represent functionality to submit changes to DataStore.
53      * Internal {@link TransactionChainListener} joining all DS commits
54      * to Set of chained changes for prevent often DataStore touches.
55      */
56     public interface StatDataStoreOperation {
57
58         /**
59          * Apply all read / write (put|merge) operation
60          * for DataStore
61          * @param {@link ReadWriteTransaction} tx
62          */
63         void applyOperation(ReadWriteTransaction tx);
64
65     }
66
67     /**
68      * Method starts whole StatisticManager functionality
69      *
70      * @param {@link NotificationProviderService} notifService
71      * @param {@link RpcConsumerRegistry} rpcRegistry
72      * @param minReqNetMonitInt
73      */
74     void start(final NotificationProviderService notifService,
75             final RpcConsumerRegistry rpcRegistry);
76
77     /**
78      * Method provides read/write DataStore functionality cross applyOperation
79      * defined in {@link StatDataStoreOperation}
80      *
81      * @param inventoryOper - operation for DataStore
82      */
83     void enqueue(final StatDataStoreOperation inventoryOper);
84
85     /**
86      * Method wraps {@link StatisticCollector}.isProvidedFlowNodeActive method
87      * to provide parallel statCollection process for Set of Nodes. So it has to
88      * identify correct Node Set by NodeIdentifier
89      *
90      * @param nodeIdent
91      */
92      boolean isProvidedFlowNodeActive(InstanceIdentifier<Node> nodeIdent);
93
94      /**
95       * Method wraps {@link StatPermCollector}.collectNextStatistics to provide
96       * parallel statCollection process for Set of Nodes. So it has to
97       * identify correct Node Set by NodeIdentifier.
98       *
99       * @param nodeIdent
100       */
101      void collectNextStatistics(InstanceIdentifier<Node> nodeIdent, TransactionId xid);
102
103      /**
104       * Method wraps {@link StatPermCollector}.connectedNodeRegistration to provide
105       * parallel statCollection process for Set of Nodes. So it has to
106       * connect node to new or not full Node statCollector Set.
107       *
108       * @param nodeIdent
109       * @param statTypes
110       * @param nrOfSwitchTables
111       */
112      void connectedNodeRegistration(InstanceIdentifier<Node> nodeIdent,
113              List<StatCapabTypes> statTypes, Short nrOfSwitchTables);
114
115      /**
116       * Method wraps {@link StatPermCollector}.disconnectedNodeUnregistration to provide
117       * parallel statCollection process for Set of Nodes. So it has to identify
118       * correct collector for disconnect node.
119       *
120       * @param nodeIdent
121       */
122      void disconnectedNodeUnregistration(InstanceIdentifier<Node> nodeIdent);
123
124      /**
125       * Method wraps {@link StatPermCollector}.registerAdditionalNodeFeature to provide
126       * possibility to register additional Node Feature {@link StatCapabTypes} for
127       * statistics collecting.
128       *
129       * @param nodeIdent
130       * @param statCapab
131       */
132      void registerAdditionalNodeFeature(InstanceIdentifier<Node> nodeIdent, StatCapabTypes statCapab);
133
134     /**
135      * Method provides access to Device RPC methods by wrapped
136      * internal method. In next {@link StatRpcMsgManager} is registered all
137      * Multipart device msg response and joining all to be able run all
138      * collected statistics in one time (easy identification Data for delete)
139      *
140      * @return {@link StatRpcMsgManager}
141      */
142     StatRpcMsgManager getRpcMsgManager();
143
144     /**
145      * Define Method : {@link org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.FlowCapableNode}
146      * Operational/DS data change listener -> impl. target -> register FlowCapableNode to Statistic Collecting process
147      * @return {@link StatNodeRegistration}
148      */
149     StatNodeRegistration getNodeRegistrator();
150
151     /**
152      * Define Method : Flow Config/DS data change listener -> impl. target ->
153      * -> make pair between Config/DS FlowId and Device Flow response Hash
154      * @return
155      */
156     StatListeningCommiter<Flow, OpendaylightFlowStatisticsListener> getFlowListenComit();
157
158     /**
159      * Define Method : Meter Config/DS data change listener and Operation/DS notify commit
160      * functionality
161      * @return
162      */
163     StatListeningCommiter<Meter, OpendaylightMeterStatisticsListener> getMeterListenCommit();
164
165     /**
166      * Define Method : Group Config/DS data change listener and Operation/DS notify commit
167      * functionality
168      * @return
169      */
170     StatListeningCommiter<Group, OpendaylightGroupStatisticsListener> getGroupListenCommit();
171
172     /**
173      * Define Method : Queue Config/DS change listener and Operation/DS notify commit functionality
174      * @return
175      */
176     StatListeningCommiter<Queue, OpendaylightQueueStatisticsListener> getQueueNotifyCommit();
177
178     /**
179      * Define Method : Table Operation/DS notify commit functionality
180      * @return
181      */
182     StatNotifyCommiter<OpendaylightFlowTableStatisticsListener> getTableNotifCommit();
183
184     /**
185      * Define Method : Port Operation/DS notify commit functionality
186      * @return
187      */
188     StatNotifyCommiter<OpendaylightPortStatisticsListener> getPortNotifyCommit();
189
190     StatisticsManagerConfig getConfiguration();
191
192 }
193