Fix IllegalStateException in StateProviderImpl
If a transaction fails, the StateProviderImpl can get stuck in
a perpetual cycle of subsequent transactions failing due to:
java.lang.IllegalStateException: Previous transaction odl2-1-datastore-operational-fe-3-chn-44-txn-1-0 is not ready yet
at org.opendaylight.controller.cluster.datastore.TransactionChainProxy$Allocated.checkReady(TransactionChainProxy.java:85)[315:org.opendaylight.controller.sal-distributed-datastore:1.6.0.ODL_7_0_0_0]
at org.opendaylight.controller.cluster.datastore.TransactionChainProxy.allocateWriteTransaction(TransactionChainProxy.java:187)[315:org.opendaylight.controller.sal-distributed-datastore:1.6.0.ODL_7_0_0_0]
at org.opendaylight.controller.cluster.datastore.TransactionChainProxy.newReadWriteTransaction(TransactionChainProxy.java:166)[315:org.opendaylight.controller.sal-distributed-datastore:1.6.0.ODL_7_0_0_0]
at org.opendaylight.controller.cluster.databroker.DOMBrokerReadWriteTransaction.createTransaction(DOMBrokerReadWriteTransaction.java:52)[315:org.opendaylight.controller.sal-distributed-datastore:1.6.0.ODL_7_0_0_0]
at org.opendaylight.controller.cluster.databroker.DOMBrokerReadWriteTransaction.createTransaction(DOMBrokerReadWriteTransaction.java:22)[315:org.opendaylight.controller.sal-distributed-datastore:1.6.0.ODL_7_0_0_0]
at org.opendaylight.controller.cluster.databroker.AbstractDOMBrokerTransaction.getSubtransaction(AbstractDOMBrokerTransaction.java:57)[315:org.opendaylight.controller.sal-distributed-datastore:1.6.0.ODL_7_0_0_0]
at org.opendaylight.controller.cluster.databroker.AbstractDOMBrokerWriteTransaction.merge(AbstractDOMBrokerWriteTransaction.java:102)[315:org.opendaylight.controller.sal-distributed-datastore:1.6.0.ODL_7_0_0_0]
at org.opendaylight.controller.md.sal.dom.spi.ForwardingDOMDataReadWriteTransaction.merge(ForwardingDOMDataReadWriteTransaction.java:54)[314:org.opendaylight.controller.sal-core-spi:1.6.0.ODL_7_0_0_0]
at org.opendaylight.controller.md.sal.binding.impl.BindingDOMWriteTransactionAdapter.ensureParentsByMerge(BindingDOMWriteTransactionAdapter.java:67)[302:org.opendaylight.controller.sal-binding-broker-impl:1.6.0.ODL_7_0_0_0]
at org.opendaylight.controller.md.sal.binding.impl.AbstractWriteTransaction.put(AbstractWriteTransaction.java:41)[302:org.opendaylight.controller.sal-binding-broker-impl:1.6.0.ODL_7_0_0_0]
at org.opendaylight.protocol.bgp.state.StateProviderImpl.storeOperationalState(StateProviderImpl.java:151)[252:org.opendaylight.bgpcep.bgp-openconfig-state:0.8.0.ODL_7_0_0_0]
at org.opendaylight.protocol.bgp.state.StateProviderImpl.lambda$updateBGPStats$1(StateProviderImpl.java:124)[252:org.opendaylight.bgpcep.bgp-openconfig-state:0.8.0.ODL_7_0_0_0]
The root cause is due to attempitng to continue to use a failed
transaction chain. It should close the failed chain and create a new
on as is required by the API contract.
For the UT, I used the RememberingLogger from infrautils to indirectly
verify the tx chain is rest on failure by checking logged errors. The
RememberingLogger is wired via static binding in infrautils which
supplants logback as the backing impl.
Change-Id: Ie26f047c2320ff812d796a25f2e3721b59b73ba0
Signed-off-by: Tom Pantelis <tompantelis@gmail.com>