From 95208fa5d24f3d7c2362ee619c9a6a294a69f7cd Mon Sep 17 00:00:00 2001 From: Robert Varga Date: Thu, 18 Aug 2016 15:15:12 +0200 Subject: [PATCH] BUG-5280: move proxy instantiation to AbstractClientHistory Histories should be the synchronization point for accessing per-cookie proxies. Move instantiation code, making cookie/history mapping internal to AbstractClientHistory. Change-Id: I512e93d72b682668790a5dd213112d772143f045 Signed-off-by: Robert Varga --- .../databroker/actors/dds/AbstractClientHistory.java | 8 +++++++- .../databroker/actors/dds/ClientTransaction.java | 12 +++++------- 2 files changed, 12 insertions(+), 8 deletions(-) diff --git a/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/databroker/actors/dds/AbstractClientHistory.java b/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/databroker/actors/dds/AbstractClientHistory.java index f364994e3d..fda9a16ab8 100644 --- a/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/databroker/actors/dds/AbstractClientHistory.java +++ b/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/databroker/actors/dds/AbstractClientHistory.java @@ -12,6 +12,7 @@ import java.util.Map; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.atomic.AtomicReferenceFieldUpdater; import org.opendaylight.controller.cluster.access.concepts.LocalHistoryIdentifier; +import org.opendaylight.controller.cluster.access.concepts.TransactionIdentifier; import org.opendaylight.yangtools.concepts.Identifiable; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -54,7 +55,7 @@ abstract class AbstractClientHistory extends LocalAbortable implements Identifia Preconditions.checkState(success, "Race condition detected, state changed from %s to %s", expected, state); } - final LocalHistoryIdentifier getHistoryForCookie(final Long cookie) { + private LocalHistoryIdentifier getHistoryForCookie(final Long cookie) { LocalHistoryIdentifier ret = histories.get(cookie); if (ret == null) { ret = new LocalHistoryIdentifier(identifier.getClientId(), identifier.getHistoryId(), cookie); @@ -82,6 +83,11 @@ abstract class AbstractClientHistory extends LocalAbortable implements Identifia state = State.CLOSED; } + final AbstractProxyTransaction createTransactionProxy(final TransactionIdentifier transactionId, final Long shard) { + return AbstractProxyTransaction.create(client, getHistoryForCookie(shard), + transactionId.getTransactionId(), client.resolver().getFutureBackendInfo(shard)); + } + /** * Callback invoked from {@link ClientTransaction} when a transaction has been sub * diff --git a/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/databroker/actors/dds/ClientTransaction.java b/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/databroker/actors/dds/ClientTransaction.java index f5f545a48e..10d64ed9bb 100644 --- a/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/databroker/actors/dds/ClientTransaction.java +++ b/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/databroker/actors/dds/ClientTransaction.java @@ -72,18 +72,16 @@ public final class ClientTransaction extends LocalAbortable implements Identifia Preconditions.checkState(state == OPEN_STATE, "Transaction %s is closed", transactionId); } + private AbstractProxyTransaction createProxy(final Long shard) { + return parent.createTransactionProxy(transactionId, shard); + } + private AbstractProxyTransaction ensureProxy(final YangInstanceIdentifier path) { checkNotClosed(); final ModuleShardBackendResolver resolver = parent.getClient().resolver(); final Long shard = resolver.resolveShardForPath(path); - AbstractProxyTransaction ret = proxies.get(shard); - if (ret == null) { - ret = AbstractProxyTransaction.create(parent.getClient(), parent.getHistoryForCookie(shard), - transactionId.getTransactionId(), resolver.getFutureBackendInfo(shard)); - proxies.put(shard, ret); - } - return ret; + return proxies.computeIfAbsent(shard, this::createProxy); } @Override -- 2.36.6