Fix IllegalStateException in StateProviderImpl 93/71993/1
authorTom Pantelis <tompantelis@gmail.com>
Wed, 2 May 2018 17:25:54 +0000 (13:25 -0400)
committerClaudio D. Gasparini <claudio.gasparini@pantheon.tech>
Mon, 14 May 2018 14:14:07 +0000 (16:14 +0200)
commitc0166a8932f9155660ecadde0cc412513cf620b7
treed1ea7d5b25ae9b6dcd035babddb532a9c4789e13
parent4e6eefd5a9a1e4e29b7745426d4e730a7f5652e4
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>
.gitignore
bgp/openconfig-state/src/main/java/org/opendaylight/protocol/bgp/state/StateProviderImpl.java