From cc5009b8f3ea91f64ee48cda815c6a5e73a8a1af Mon Sep 17 00:00:00 2001 From: Robert Varga Date: Tue, 30 May 2017 19:35:17 +0200 Subject: [PATCH 1/1] 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 --- .../databroker/actors/dds/AbstractProxyTransaction.java | 9 ++++++--- .../cluster/databroker/actors/dds/ProxyHistory.java | 9 +++------ .../actors/dds/AbstractProxyTransactionTest.java | 7 ++++++- 3 files changed, 15 insertions(+), 10 deletions(-) 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