BUG-4364: data change counter transaction chain 76/28276/1
authorIveta Halanova <ihalanov@cisco.com>
Fri, 9 Oct 2015 13:34:30 +0000 (15:34 +0200)
committerMilos Fabian <milfabia@cisco.com>
Mon, 12 Oct 2015 09:41:52 +0000 (09:41 +0000)
to avoid logging spam

Change-Id: Ia59091f71edfb69d0fd3860086634112c4de0226
Signed-off-by: Iveta Halanova <ihalanov@cisco.com>
(cherry picked from commit e6cdc776146d60ff8c33c12eedda930d8bf03e4d)

data-change-counter/src/main/java/org/opendaylight/protocol/data/change/counter/TopologyDataChangeCounter.java
data-change-counter/src/test/java/org/opendaylight/controller/config/yang/bgpcep/data/change/counter/DataChangeCounterImplModuleTest.java

index fc5067cfdf7f1bd11b42592d2d7a7182813f9fac..afbf20013e02c0c7ad85e05dfca3221658ba28ba 100644 (file)
@@ -9,11 +9,15 @@
 package org.opendaylight.protocol.data.change.counter;
 
 import java.util.concurrent.atomic.AtomicLong;
+import org.opendaylight.controller.md.sal.binding.api.BindingTransactionChain;
 import org.opendaylight.controller.md.sal.binding.api.DataBroker;
 import org.opendaylight.controller.md.sal.binding.api.DataChangeListener;
 import org.opendaylight.controller.md.sal.binding.api.WriteTransaction;
 import org.opendaylight.controller.md.sal.common.api.data.AsyncDataChangeEvent;
+import org.opendaylight.controller.md.sal.common.api.data.AsyncTransaction;
 import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
+import org.opendaylight.controller.md.sal.common.api.data.TransactionChain;
+import org.opendaylight.controller.md.sal.common.api.data.TransactionChainListener;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.data.change.counter.rev140815.DataChangeCounter;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.data.change.counter.rev140815.DataChangeCounterBuilder;
 import org.opendaylight.yangtools.yang.binding.DataObject;
@@ -21,7 +25,7 @@ import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-public class TopologyDataChangeCounter implements DataChangeListener {
+public class TopologyDataChangeCounter implements DataChangeListener, TransactionChainListener {
 
     private static final Logger LOG = LoggerFactory.getLogger(TopologyDataChangeCounter.class);
 
@@ -29,17 +33,19 @@ public class TopologyDataChangeCounter implements DataChangeListener {
             .builder(DataChangeCounter.class).build();
 
     private final DataBroker dataBroker;
-    private AtomicLong count;
+    private final BindingTransactionChain chain;
+    private final AtomicLong count;
 
     public TopologyDataChangeCounter(final DataBroker dataBroker) {
         this.dataBroker = dataBroker;
+        this.chain = this.dataBroker.createTransactionChain(this);
         this.count = new AtomicLong(0);
         putCount(this.count.get());
         LOG.debug("Data change counter initiated");
     }
 
     @Override
-    public void onDataChanged(AsyncDataChangeEvent<InstanceIdentifier<?>, DataObject> change) {
+    public void onDataChanged(final AsyncDataChangeEvent<InstanceIdentifier<?>, DataObject> change) {
         putCount(this.count.incrementAndGet());
         LOG.debug("Data change #{}", this.count.get());
     }
@@ -48,14 +54,25 @@ public class TopologyDataChangeCounter implements DataChangeListener {
         final WriteTransaction wTx = this.dataBroker.newWriteOnlyTransaction();
         wTx.delete(LogicalDatastoreType.OPERATIONAL, IID);
         wTx.submit();
+        this.chain.close();
         LOG.debug("Data change counter removed");
     }
 
     private void putCount(final long count) {
-        final WriteTransaction wTx = this.dataBroker.newWriteOnlyTransaction();
-        wTx.put(LogicalDatastoreType.OPERATIONAL, IID, new DataChangeCounterBuilder().setCount(count)
-                .build());
+        final WriteTransaction wTx = this.chain.newWriteOnlyTransaction();
+        wTx.put(LogicalDatastoreType.OPERATIONAL, IID, new DataChangeCounterBuilder().setCount(count).build());
         wTx.submit();
     }
 
+    @Override
+    public void onTransactionChainFailed(final TransactionChain<?, ?> chain, final AsyncTransaction<?, ?> transaction, final Throwable cause) {
+        chain.close();
+        LOG.warn("Transaction chain failure. Transaction: {}", transaction, cause);
+    }
+
+    @Override
+    public void onTransactionChainSuccessful(final TransactionChain<?, ?> chain) {
+        LOG.debug("Transaction chain successful. {}", chain);
+    }
+
 }
index 9c3523347e5d4c74cf964b0c7ac2f7026b38f9c1..bf6f6889fac062c0c64acbdab79ec4e8b071cd70 100644 (file)
@@ -26,10 +26,12 @@ import org.opendaylight.controller.config.manager.impl.AbstractConfigTest;
 import org.opendaylight.controller.config.manager.impl.factoriesresolver.HardcodedModuleFactoriesResolver;
 import org.opendaylight.controller.config.spi.Module;
 import org.opendaylight.controller.config.util.ConfigTransactionJMXClient;
+import org.opendaylight.controller.md.sal.binding.api.BindingTransactionChain;
 import org.opendaylight.controller.md.sal.binding.api.DataBroker;
 import org.opendaylight.controller.md.sal.binding.api.DataChangeListener;
 import org.opendaylight.controller.md.sal.binding.api.WriteTransaction;
 import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
+import org.opendaylight.controller.md.sal.common.api.data.TransactionChainListener;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.data.change.counter.rev140815.DataChangeCounter;
 import org.opendaylight.yangtools.concepts.ListenerRegistration;
 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
@@ -47,6 +49,8 @@ public class DataChangeCounterImplModuleTest extends AbstractConfigTest {
     @Mock
     private CloseableDataBroker dataBorker;
     @Mock
+    private BindingTransactionChain chain;
+    @Mock
     private WriteTransaction wTx;
     @Mock
     private ListenerRegistration<DataChangeListener> registration;
@@ -56,11 +60,14 @@ public class DataChangeCounterImplModuleTest extends AbstractConfigTest {
         Mockito.doNothing().when(this.registration).close();
         Mockito.doReturn(null).when(this.wTx).submit();
         Mockito.doNothing().when(this.wTx).put(Mockito.any(LogicalDatastoreType.class), Mockito.<InstanceIdentifier<DataChangeCounter>>any(), Mockito.any(DataChangeCounter.class));
-        Mockito.doReturn(registration).when(this.dataBorker).registerDataChangeListener(Mockito.any(LogicalDatastoreType.class), Mockito.<InstanceIdentifier<?>>any(), Mockito.any(DataChangeListener.class), Mockito.any(DataBroker.DataChangeScope.class));
+        Mockito.doReturn(this.registration).when(this.dataBorker).registerDataChangeListener(Mockito.any(LogicalDatastoreType.class), Mockito.<InstanceIdentifier<?>>any(), Mockito.any(DataChangeListener.class), Mockito.any(DataBroker.DataChangeScope.class));
         Mockito.doNothing().when(this.wTx).delete(Mockito.any(LogicalDatastoreType.class), Mockito.<InstanceIdentifier<?>>any());
+        Mockito.doReturn(this.chain).when(this.dataBorker).createTransactionChain(Mockito.any(TransactionChainListener.class));
+        Mockito.doReturn(this.wTx).when(this.chain).newWriteOnlyTransaction();
         Mockito.doReturn(this.wTx).when(this.dataBorker).newWriteOnlyTransaction();
+        Mockito.doNothing().when(this.chain).close();
         Mockito.doNothing().when(this.dataBorker).close();
-        super.initConfigTransactionManagerImpl(new HardcodedModuleFactoriesResolver(mockedContext, new DataChangeCounterImplModuleFactory(), new MockDataBrokerModuleFct()));
+        super.initConfigTransactionManagerImpl(new HardcodedModuleFactoriesResolver(this.mockedContext, new DataChangeCounterImplModuleFactory(), new MockDataBrokerModuleFct()));
     }
 
     @Test
@@ -73,7 +80,7 @@ public class DataChangeCounterImplModuleTest extends AbstractConfigTest {
     @Test
     public void testReusingOldInstance() throws Exception {
         createInstance(TOPOLOGY_NAME);
-        final ConfigTransactionJMXClient transaction = configRegistryClient.createTransaction();
+        final ConfigTransactionJMXClient transaction = this.configRegistryClient.createTransaction();
         assertBeanCount(1, FACTORY_NAME);
         final CommitStatus status = transaction.commit();
         assertBeanCount(1, FACTORY_NAME);
@@ -83,7 +90,7 @@ public class DataChangeCounterImplModuleTest extends AbstractConfigTest {
     @Test
     public void testReconfigureBean() throws Exception {
         createInstance(TOPOLOGY_NAME);
-        final ConfigTransactionJMXClient transaction = configRegistryClient.createTransaction();
+        final ConfigTransactionJMXClient transaction = this.configRegistryClient.createTransaction();
         final DataChangeCounterImplModuleMXBean mxBean = transaction.newMXBeanProxy(transaction.lookupConfigBean(FACTORY_NAME, INSTANCE_NAME),
                 DataChangeCounterImplModuleMXBean.class);
         mxBean.setTopologyName(NEW_TOPOLOGY_NAME);
@@ -91,14 +98,14 @@ public class DataChangeCounterImplModuleTest extends AbstractConfigTest {
         assertBeanCount(1, FACTORY_NAME);
         assertStatus(status, 0, 1, 1);
 
-        final ConfigTransactionJMXClient transaction2 = configRegistryClient.createTransaction();
+        final ConfigTransactionJMXClient transaction2 = this.configRegistryClient.createTransaction();
         final DataChangeCounterImplModuleMXBean mxBean2 = transaction2.newMXBeanProxy(transaction2.lookupConfigBean(FACTORY_NAME, INSTANCE_NAME),
                 DataChangeCounterImplModuleMXBean.class);
         Assert.assertEquals(NEW_TOPOLOGY_NAME, mxBean2.getTopologyName());
     }
 
     private CommitStatus createInstance(final String topologyName) throws Exception {
-        final ConfigTransactionJMXClient transaction = configRegistryClient.createTransaction();
+        final ConfigTransactionJMXClient transaction = this.configRegistryClient.createTransaction();
         final ObjectName on = transaction.createModule(FACTORY_NAME, INSTANCE_NAME);
         final ObjectName dbOn = transaction.createModule(MockDataBrokerModuleFct.INSTANCE_NAME, DATA_BROKER_INSTANCE_NAME);
         final DataChangeCounterImplModuleMXBean mxBean = transaction.newMXBeanProxy(on, DataChangeCounterImplModuleMXBean.class);
@@ -135,7 +142,7 @@ public class DataChangeCounterImplModuleTest extends AbstractConfigTest {
 
         @Override
         public Set<Class<? extends AbstractServiceInterface>> getImplementedServiceIntefaces() {
-            java.util.Set<Class<? extends org.opendaylight.controller.config.api.annotations.AbstractServiceInterface>> serviceIfcs2 = new java.util.HashSet<Class<? extends org.opendaylight.controller.config.api.annotations.AbstractServiceInterface>>();
+            final java.util.Set<Class<? extends org.opendaylight.controller.config.api.annotations.AbstractServiceInterface>> serviceIfcs2 = new java.util.HashSet<Class<? extends org.opendaylight.controller.config.api.annotations.AbstractServiceInterface>>();
             return java.util.Collections.unmodifiableSet(serviceIfcs2);
         }