From: Robert Varga Date: Tue, 30 May 2017 17:35:17 +0000 (+0200) Subject: BUG-8403: move successor allocation to AbstractProxyTransaction X-Git-Tag: release/carbon-sr1~52 X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?p=controller.git;a=commitdiff_plain;h=cc5009b8f3ea91f64ee48cda815c6a5e73a8a1af;hp=15a67bd103c2dc32f28139a7295ac84143c20d0c BUG-8403: move successor allocation to AbstractProxyTransaction We still have a tiny race window where we do not correctly handle reconnection, leading to an ISE splat -- this time if the final stage of transaction completion. The problem is that a reconnect attempt is happening while we are waiting for the transaction purge to complete. At this point the transaction has been completely resolved and the only remaining task is to inform the backend that we have received all of the state and hence it can throw it out (we will remove our state once purge completes). We are still allocating a live transaction in the local history and the purge request replay does not logically close it, leading to the splat. To fix this, we really need to allocate a non-open tx successor, which will not trip the successor local history. All the required knowledge already resides in AbstractProxyHistory, except we do not have a dedicated 'purging' state. This makes the first step of moving the allocation caller to the appropriate place. Change-Id: If82957019b478f4d5132edda4d38e6bc026aa0ab Signed-off-by: Robert Varga --- diff --git a/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/databroker/actors/dds/AbstractProxyTransaction.java b/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/databroker/actors/dds/AbstractProxyTransaction.java index bf56376fce..f4f2e19f76 100644 --- a/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/databroker/actors/dds/AbstractProxyTransaction.java +++ b/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/databroker/actors/dds/AbstractProxyTransaction.java @@ -543,9 +543,13 @@ abstract class AbstractProxyTransaction implements Identifiable enqueuedEntries) { + final void replayMessages(final ProxyHistory successorHistory, final Iterable enqueuedEntries) { final SuccessorState local = getSuccessorState(); + final State prevState = local.getPrevState(); + + final AbstractProxyTransaction successor = successorHistory.createTransactionProxy(getIdentifier(), + isSnapshotOnly()); + LOG.debug("{} created successor transaction proxy {}", this, successor); local.setSuccessor(successor); // Replay successful requests first @@ -593,7 +597,6 @@ abstract class AbstractProxyTransaction implements Identifiable { } for (AbstractProxyTransaction t : proxies.values()) { - LOG.debug("{} creating successor transaction proxy for {}", identifier, t); - final AbstractProxyTransaction newProxy = successor.createTransactionProxy(t.getIdentifier(), - t.isSnapshotOnly()); - LOG.debug("{} created successor transaction proxy {}", identifier, newProxy); - t.replayMessages(newProxy, previousEntries); + LOG.debug("{} replaying messages to old proxy {} towards successor {}", identifier, t, successor); + t.replayMessages(successor, previousEntries); } // Now look for any finalizing messages @@ -355,7 +352,7 @@ abstract class ProxyHistory implements Identifiable { return parent; } - final AbstractProxyTransaction createTransactionProxy(final TransactionIdentifier txId, + AbstractProxyTransaction createTransactionProxy(final TransactionIdentifier txId, final boolean snapshotOnly) { lock.lock(); try { diff --git a/opendaylight/md-sal/sal-distributed-datastore/src/test/java/org/opendaylight/controller/cluster/databroker/actors/dds/AbstractProxyTransactionTest.java b/opendaylight/md-sal/sal-distributed-datastore/src/test/java/org/opendaylight/controller/cluster/databroker/actors/dds/AbstractProxyTransactionTest.java index 7acbaf3676..cc4b227891 100644 --- a/opendaylight/md-sal/sal-distributed-datastore/src/test/java/org/opendaylight/controller/cluster/databroker/actors/dds/AbstractProxyTransactionTest.java +++ b/opendaylight/md-sal/sal-distributed-datastore/src/test/java/org/opendaylight/controller/cluster/databroker/actors/dds/AbstractProxyTransactionTest.java @@ -183,7 +183,12 @@ public abstract class AbstractProxyTransactionTest