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%2FClientBackedTransaction.java;h=a0f369638d50e17aaa7882fec9137bab9c48cae9;hp=6c1429773972562a7127c45558ab2290210f6557;hb=1d5ca4009be6c61d7b61989799037ad8f1ab7a75;hpb=5a0edd493bafc365647bc6311b4b7da86a78645d diff --git a/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/databroker/ClientBackedTransaction.java b/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/databroker/ClientBackedTransaction.java index 6c14297739..a0f369638d 100644 --- a/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/databroker/ClientBackedTransaction.java +++ b/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/databroker/ClientBackedTransaction.java @@ -7,16 +7,15 @@ */ package org.opendaylight.controller.cluster.databroker; -import com.google.common.base.FinalizablePhantomReference; -import com.google.common.base.FinalizableReferenceQueue; -import com.google.common.base.Preconditions; -import java.util.Set; -import java.util.concurrent.ConcurrentHashMap; -import javax.annotation.Nonnull; +import static java.util.Objects.requireNonNull; + +import java.lang.ref.Cleaner; +import java.lang.ref.Cleaner.Cleanable; import org.opendaylight.controller.cluster.access.concepts.TransactionIdentifier; import org.opendaylight.controller.cluster.databroker.actors.dds.AbstractClientHandle; import org.opendaylight.controller.cluster.databroker.actors.dds.ClientTransaction; -import org.opendaylight.controller.sal.core.spi.data.AbstractDOMStoreTransaction; +import org.opendaylight.mdsal.dom.spi.store.AbstractDOMStoreTransaction; +import org.opendaylight.mdsal.dom.spi.store.DOMStoreTransaction; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -29,46 +28,43 @@ import org.slf4j.LoggerFactory; */ abstract class ClientBackedTransaction> extends AbstractDOMStoreTransaction { - private static final class Finalizer extends FinalizablePhantomReference> { - private static final FinalizableReferenceQueue QUEUE = new FinalizableReferenceQueue(); - private static final Set FINALIZERS = ConcurrentHashMap.newKeySet(); - private static final Logger LOG = LoggerFactory.getLogger(Finalizer.class); - + private static final class Cleanup implements Runnable { private final AbstractClientHandle transaction; + private final Throwable allocationContext; - private Finalizer(final ClientBackedTransaction referent, final AbstractClientHandle transaction) { - super(referent, QUEUE); - this.transaction = Preconditions.checkNotNull(transaction); - } - - static @Nonnull > T recordTransaction( - @Nonnull final ClientBackedTransaction referent, @Nonnull final T transaction) { - FINALIZERS.add(new Finalizer(referent, transaction)); - return transaction; + Cleanup(final AbstractClientHandle transaction, final Throwable allocationContext) { + this.transaction = transaction; + this.allocationContext = allocationContext; } @Override - public void finalizeReferent() { - FINALIZERS.remove(this); + public void run() { if (transaction.abort()) { - LOG.warn("Aborted orphan transaction {}", transaction.getIdentifier()); + LOG.info("Aborted orphan transaction {}", transaction, allocationContext); } } } + private static final Logger LOG = LoggerFactory.getLogger(ClientBackedTransaction.class); + private static final Cleaner CLEANER = Cleaner.create(); + private final T delegate; + private final Cleanable cleanable; - ClientBackedTransaction(final T delegate) { + ClientBackedTransaction(final T delegate, final Throwable allocationContext) { super(delegate.getIdentifier()); - this.delegate = Finalizer.recordTransaction(this, delegate); - } - - final T delegate() { - return delegate; + this.delegate = requireNonNull(delegate); + this.cleanable = CLEANER.register(this, new Cleanup(delegate, allocationContext)); } @Override public void close() { delegate.abort(); + // Run cleaning immediate so the references is not stuck in cleaner queue + cleanable.clean(); + } + + final T delegate() { + return delegate; } }