From db3d7caeeb310f76a9a159f9a8d7e9beff89f645 Mon Sep 17 00:00:00 2001 From: Robert Varga Date: Wed, 20 Feb 2019 13:56:30 +0100 Subject: [PATCH 1/1] Do not assert seal transition on forward path Unlike the replay path, where we expect no successor, the forward path may very well encounter a successor being present. Move the assertion to replay path only, as that is where it catches issues. The forward path automatically propagates the seal via its use of sendRequest(), which is forwarded as needed and therefore we only note the race via LOG.debug() and not assert it. Change-Id: I6f95acc49800d456c049d19982c801015fd69420 JIRA: CONTROLLER-1885 Signed-off-by: Robert Varga --- .../actors/dds/AbstractProxyTransaction.java | 17 ++++++++++++----- .../dds/LocalReadWriteProxyTransaction.java | 4 ++-- .../actors/dds/RemoteProxyTransaction.java | 8 ++++++-- 3 files changed, 20 insertions(+), 9 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 f8cb9e01bc..546738fb67 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 @@ -363,10 +363,14 @@ abstract class AbstractProxyTransaction implements Identifiable enqueuedTicks) { - parent.onTransactionSealed(this); + return sealState(); + } + private boolean sealState() { + parent.onTransactionSealed(this); // Transition internal state to sealed and detect presence of a successor return STATE_UPDATER.compareAndSet(this, OPEN, SEALED); } diff --git a/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/databroker/actors/dds/LocalReadWriteProxyTransaction.java b/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/databroker/actors/dds/LocalReadWriteProxyTransaction.java index ccce603652..8b19e30b4b 100644 --- a/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/databroker/actors/dds/LocalReadWriteProxyTransaction.java +++ b/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/databroker/actors/dds/LocalReadWriteProxyTransaction.java @@ -185,9 +185,9 @@ final class LocalReadWriteProxyTransaction extends LocalProxyTransaction { } @Override - void sealOnly() { + boolean sealOnly() { sealModification(); - super.sealOnly(); + return super.sealOnly(); } @Override diff --git a/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/databroker/actors/dds/RemoteProxyTransaction.java b/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/databroker/actors/dds/RemoteProxyTransaction.java index 46e1924dd5..d36218c19e 100644 --- a/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/databroker/actors/dds/RemoteProxyTransaction.java +++ b/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/databroker/actors/dds/RemoteProxyTransaction.java @@ -7,6 +7,8 @@ */ package org.opendaylight.controller.cluster.databroker.actors.dds; +import static com.google.common.base.Verify.verify; + import com.google.common.util.concurrent.FluentFuture; import com.google.common.util.concurrent.ListenableFuture; import com.google.common.util.concurrent.SettableFuture; @@ -347,7 +349,9 @@ final class RemoteProxyTransaction extends AbstractProxyTransaction { // Persistence protocol implies we are sealed, propagate the marker, but hold off doing other actions // until we know what we are going to do. if (markSealed()) { - sealOnly(); + if (!sealOnly()) { + LOG.debug("Proxy {} has a successor, which should receive seal through a separate request", this); + } } final TransactionRequest tmp; @@ -488,7 +492,7 @@ final class RemoteProxyTransaction extends AbstractProxyTransaction { // Persistence protocol implies we are sealed, propagate the marker, but hold off doing other actions // until we know what we are going to do. if (markSealed()) { - sealOnly(); + verify(sealOnly(), "Attempted to replay seal on %s", this); } final TransactionRequest tmp; -- 2.36.6