X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?a=blobdiff_plain;f=opendaylight%2Fmd-sal%2Fsal-distributed-datastore%2Fsrc%2Fmain%2Fjava%2Forg%2Fopendaylight%2Fcontroller%2Fcluster%2Fdatabroker%2Factors%2Fdds%2FProxyHistory.java;h=e75a2df4c0d6084ba6629ff2926357a7b6a8a0f1;hb=refs%2Fchanges%2F94%2F57994%2F7;hp=7c3b2010c2ce809307646f852ee473e9d6c9cbf4;hpb=930747a6ba5d888d2fbe54473132680e4621d858;p=controller.git diff --git a/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/databroker/actors/dds/ProxyHistory.java b/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/databroker/actors/dds/ProxyHistory.java index 7c3b2010c2..e75a2df4c0 100644 --- a/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/databroker/actors/dds/ProxyHistory.java +++ b/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/databroker/actors/dds/ProxyHistory.java @@ -23,6 +23,7 @@ import java.util.function.BiConsumer; import java.util.function.Consumer; import javax.annotation.concurrent.GuardedBy; import org.opendaylight.controller.cluster.access.client.AbstractClientConnection; +import org.opendaylight.controller.cluster.access.client.ClientActorContext; import org.opendaylight.controller.cluster.access.client.ConnectedClientConnection; import org.opendaylight.controller.cluster.access.client.ConnectionEntry; import org.opendaylight.controller.cluster.access.commands.CreateLocalHistoryRequest; @@ -85,9 +86,15 @@ abstract class ProxyHistory implements Identifiable { @Override AbstractProxyTransaction doCreateTransactionProxy(final AbstractClientConnection connection, - final TransactionIdentifier txId, final boolean snapshotOnly) { + final TransactionIdentifier txId, final boolean snapshotOnly, final boolean isDone) { Preconditions.checkState(lastOpen == null, "Proxy %s has %s currently open", this, lastOpen); + if (isDone) { + // Done transactions do not register on our radar on should not have any state associated. + return snapshotOnly ? new LocalReadOnlyProxyTransaction(this, txId) + : new LocalReadWriteProxyTransaction(this, txId); + } + // onTransactionCompleted() runs concurrently final LocalReadWriteProxyTransaction localSealed = lastSealed; final DataTreeSnapshot baseSnapshot; @@ -144,7 +151,7 @@ abstract class ProxyHistory implements Identifiable { @Override AbstractProxyTransaction doCreateTransactionProxy(final AbstractClientConnection connection, - final TransactionIdentifier txId, final boolean snapshotOnly) { + final TransactionIdentifier txId, final boolean snapshotOnly, final boolean isDone) { final DataTreeSnapshot snapshot = takeSnapshot(); return snapshotOnly ? new LocalReadOnlyProxyTransaction(this, txId, snapshot) : new LocalReadWriteProxyTransaction(this, txId, snapshot); @@ -164,8 +171,8 @@ abstract class ProxyHistory implements Identifiable { @Override AbstractProxyTransaction doCreateTransactionProxy(final AbstractClientConnection connection, - final TransactionIdentifier txId, final boolean snapshotOnly) { - return new RemoteProxyTransaction(this, txId, snapshotOnly, true); + final TransactionIdentifier txId, final boolean snapshotOnly, final boolean isDone) { + return new RemoteProxyTransaction(this, txId, snapshotOnly, true, isDone); } @Override @@ -182,8 +189,8 @@ abstract class ProxyHistory implements Identifiable { @Override AbstractProxyTransaction doCreateTransactionProxy(final AbstractClientConnection connection, - final TransactionIdentifier txId, final boolean snapshotOnly) { - return new RemoteProxyTransaction(this, txId, snapshotOnly, false); + final TransactionIdentifier txId, final boolean snapshotOnly, final boolean isDone) { + return new RemoteProxyTransaction(this, txId, snapshotOnly, false, isDone); } @Override @@ -222,7 +229,7 @@ abstract class ProxyHistory implements Identifiable { if (identifier.equals(req.getTarget())) { Verify.verify(req instanceof LocalHistoryRequest); if (req instanceof CreateLocalHistoryRequest) { - successor.connection.sendRequest(req, e.getCallback()); + successor.connection.enqueueRequest(req, e.getCallback(), e.getEnqueuedTicks()); it.remove(); break; } @@ -230,11 +237,8 @@ abstract class ProxyHistory 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 @@ -245,7 +249,7 @@ abstract class ProxyHistory implements Identifiable { if (identifier.equals(req.getTarget())) { Verify.verify(req instanceof LocalHistoryRequest); if (req instanceof DestroyLocalHistoryRequest) { - successor.connection.sendRequest(req, e.getCallback()); + successor.connection.enqueueRequest(req, e.getCallback(), e.getEnqueuedTicks()); it.remove(); break; } @@ -338,6 +342,10 @@ abstract class ProxyHistory implements Identifiable { return identifier; } + final ClientActorContext context() { + return connection.context(); + } + final long currentTime() { return connection.currentTime(); } @@ -352,14 +360,19 @@ abstract class ProxyHistory implements Identifiable { final AbstractProxyTransaction createTransactionProxy(final TransactionIdentifier txId, final boolean snapshotOnly) { + return createTransactionProxy(txId, snapshotOnly, false); + } + + AbstractProxyTransaction createTransactionProxy(final TransactionIdentifier txId, final boolean snapshotOnly, + final boolean isDone) { lock.lock(); try { if (successor != null) { - return successor.createTransactionProxy(txId, snapshotOnly); + return successor.createTransactionProxy(txId, snapshotOnly, isDone); } final TransactionIdentifier proxyId = new TransactionIdentifier(identifier, txId.getTransactionId()); - final AbstractProxyTransaction ret = doCreateTransactionProxy(connection, proxyId, snapshotOnly); + final AbstractProxyTransaction ret = doCreateTransactionProxy(connection, proxyId, snapshotOnly, isDone); proxies.put(proxyId, ret); LOG.debug("Allocated proxy {} for transaction {}", proxyId, txId); return ret; @@ -371,8 +384,8 @@ abstract class ProxyHistory implements Identifiable { final void abortTransaction(final AbstractProxyTransaction tx) { lock.lock(); try { - proxies.remove(tx.getIdentifier()); - LOG.debug("Proxy {} aborting transaction {}", this, tx); + // Removal will be completed once purge completes + LOG.debug("Proxy {} aborted transaction {}", this, tx); onTransactionAborted(tx); } finally { lock.unlock(); @@ -382,7 +395,7 @@ abstract class ProxyHistory implements Identifiable { final void completeTransaction(final AbstractProxyTransaction tx) { lock.lock(); try { - proxies.remove(tx.getIdentifier()); + // Removal will be completed once purge completes LOG.debug("Proxy {} completing transaction {}", this, tx); onTransactionCompleted(tx); } finally { @@ -390,6 +403,16 @@ abstract class ProxyHistory implements Identifiable { } } + void purgeTransaction(final AbstractProxyTransaction tx) { + lock.lock(); + try { + proxies.remove(tx.getIdentifier()); + LOG.debug("Proxy {} purged transaction {}", this, tx); + } finally { + lock.unlock(); + } + } + final void close() { lock.lock(); try { @@ -417,7 +440,7 @@ abstract class ProxyHistory implements Identifiable { @GuardedBy("lock") abstract AbstractProxyTransaction doCreateTransactionProxy(AbstractClientConnection connection, - TransactionIdentifier txId, boolean snapshotOnly); + TransactionIdentifier txId, boolean snapshotOnly, boolean isDone); abstract ProxyHistory createSuccessor(AbstractClientConnection connection);