X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?p=controller.git;a=blobdiff_plain;f=opendaylight%2Fmd-sal%2Fsal-distributed-datastore%2Fsrc%2Fmain%2Fjava%2Forg%2Fopendaylight%2Fcontroller%2Fcluster%2Fdatabroker%2Factors%2Fdds%2FAbstractClientHandle.java;h=842bc00d916ab1eae6c531cb4ceeddc971bdbc4c;hp=90773359dcab9c47089f6bdd96c1675c4275d5b7;hb=b0ea37067f7ac8d03cb785ce70616fa16a5ba5a4;hpb=5d761355a11fc761e8faccb36b05453013f1e4d1 diff --git a/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/databroker/actors/dds/AbstractClientHandle.java b/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/databroker/actors/dds/AbstractClientHandle.java index 90773359dc..842bc00d91 100644 --- a/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/databroker/actors/dds/AbstractClientHandle.java +++ b/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/databroker/actors/dds/AbstractClientHandle.java @@ -97,9 +97,10 @@ public abstract class AbstractClientHandle e * closed, too. */ final @Nullable Collection ensureClosed() { - @SuppressWarnings("unchecked") - final State local = STATE_UPDATER.getAndSet(this, null); - return local == null ? null : local.values(); + // volatile read and a conditional CAS. This ends up being better in the typical case when we are invoked more + // than once (see ClientBackedTransaction) than performing a STATE_UPDATER.getAndSet(). + final State local = state; + return local != null && STATE_UPDATER.compareAndSet(this, local, null) ? local.values() : null; } final T ensureProxy(final YangInstanceIdentifier path) {