interface="org.opendaylight.controller.md.sal.binding.api.DataBroker"
odl:type="default" ranking="10"/>
- <reference id="domPingPongDataBroker" interface="org.opendaylight.controller.md.sal.dom.api.DOMDataBroker"
- odl:type="pingpong"/>
+ <reference id="tracingPingPongDOMDataBroker"
+ interface="org.opendaylight.controller.md.sal.trace.api.TracingDOMDataBroker"
+ odl:type="pingpong"/>
<bean id="bindingTracingPingPongDataBroker" class="org.opendaylight.controller.md.sal.binding.impl.BindingDOMDataBrokerAdapter">
- <argument ref="domPingPongDataBroker"/>
+ <argument ref="tracingPingPongDOMDataBroker"/>
<argument ref="mappingCodec"/>
</bean>
*/
package org.opendaylight.controller.md.sal.trace.cli;
+import java.util.List;
import org.apache.karaf.shell.api.action.Action;
import org.apache.karaf.shell.api.action.Command;
import org.apache.karaf.shell.api.action.lifecycle.Reference;
public class PrintOpenTransactionsCommand implements Action {
@Reference
- private TracingDOMDataBroker tracingDOMDataBroker;
+ private List<TracingDOMDataBroker> tracingDOMDataBrokers;
// NB: Do NOT have a non-default constructor for injection of @Reference
// Karaf needs a default constructor to create the command - and it works as is.
@Override
@SuppressWarnings("checkstyle:RegexpSingleLineJava")
public Object execute() throws Exception {
- if (!tracingDOMDataBroker.printOpenTransactions(System.out)) {
- System.out.println("No open transactions, great!");
+ for (TracingDOMDataBroker tracingDOMDataBroker : tracingDOMDataBrokers) {
+ tracingDOMDataBroker.printOpenTransactions(System.out);
}
return null;
}
*/
package org.opendaylight.controller.md.sal.trace.dom.impl;
+import static java.util.Objects.requireNonNull;
+
import java.io.PrintStream;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
-import java.util.Objects;
import java.util.Set;
import javax.annotation.Nonnull;
import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
private static final int STACK_TRACE_FIRST_RELEVANT_FRAME = 2;
+ private final String type; // "default" VS "pingpong"
private final BindingNormalizedNodeSerializer codec;
private final DOMDataBroker delegate;
private final List<Watch> registrationWatches = new ArrayList<>();
}
}
- public TracingBroker(DOMDataBroker delegate, Config config, BindingNormalizedNodeSerializer codec) {
- this.delegate = Objects.requireNonNull(delegate);
- this.codec = Objects.requireNonNull(codec);
+ public TracingBroker(String type, DOMDataBroker delegate, Config config, BindingNormalizedNodeSerializer codec) {
+ this.type = requireNonNull(type, "type");
+ this.delegate = requireNonNull(delegate, "delegate");
+ this.codec = requireNonNull(codec, "codec");
configure(config);
if (config.isTransactionDebugContextEnabled() != null) {
&& writeTransactionsRegistry.getAllUnique().isEmpty()
&& readWriteTransactionsRegistry.getAllUnique().isEmpty()) {
+ ps.println(type + ": No open transactions, great!");
return false;
}
- ps.println(getClass().getSimpleName() + " found some not yet (or never..) closed transaction[chain]s!");
+ ps.println(type + ": " + getClass().getSimpleName()
+ + " found some not yet (or never..) closed transaction[chain]s!");
ps.println("[NB: If no stack traces are shown below, then "
+ "enable transaction-debug-context-enabled in mdsaltrace_config.xml]");
ps.println();
interface="org.opendaylight.mdsal.binding.dom.codec.api.BindingNormalizedNodeSerializer"
odl:type="default" />
+ <!-- Tracing Binding DataBroker -->
+
<reference id="realDefaultDOMBroker"
interface="org.opendaylight.controller.md.sal.dom.api.DOMDataBroker"
odl:type="default" />
<bean id="tracingDefaultDOMBroker" class="org.opendaylight.controller.md.sal.trace.dom.impl.TracingBroker">
+ <argument value="default" />
<argument ref="realDefaultDOMBroker" />
<argument ref="mdsalConfig" />
<argument ref="codec" />
</interfaces>
</service>
+ <!-- Tracing Binding PingPong DataBroker -->
+
+ <reference id="realPingPongDOMDataBroker"
+ interface="org.opendaylight.controller.md.sal.dom.api.DOMDataBroker"
+ odl:type="pingpong"/>
- <bean id="tracingPingPongDOMBroker" class="org.opendaylight.controller.md.sal.dom.broker.impl.PingPongDataBroker">
- <argument ref="tracingDefaultDOMBroker" />
+ <bean id="tracingPingPongDOMBroker" class="org.opendaylight.controller.md.sal.trace.dom.impl.TracingBroker">
+ <argument value="pingpong" />
+ <argument ref="realPingPongDOMDataBroker" />
+ <argument ref="mdsalConfig" />
+ <argument ref="codec" />
</bean>
- <service id="tracingPingPongDOMBrokerSvc" ref="tracingPingPongDOMBroker"
- interface="org.opendaylight.controller.md.sal.dom.api.DOMDataBroker"
- ranking="10" odl:type="pingpong" />
+ <service id="tracingPingPongDOMBrokerSvc" ref="tracingPingPongDOMBroker" ranking="10" odl:type="pingpong">
+ <interfaces>
+ <value>org.opendaylight.controller.md.sal.dom.api.DOMDataBroker</value>
+ <value>org.opendaylight.controller.md.sal.trace.api.TracingDOMDataBroker</value>
+ </interfaces>
+ </service>
</blueprint>
DOMDataBroker domDataBroker = mock(DOMDataBroker.class, RETURNS_DEEP_STUBS);
Config config = new ConfigBuilder().setTransactionDebugContextEnabled(true).build();
BindingNormalizedNodeSerializer codec = mock(BindingNormalizedNodeSerializer.class);
- TracingBroker tracingBroker = new TracingBroker(domDataBroker, config, codec);
+ TracingBroker tracingBroker = new TracingBroker("mock", domDataBroker, config, codec);
for (int i = 0; i < 3; i++) {
DOMDataReadWriteTransaction tx = tracingBroker.newReadWriteTransaction();