X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?p=controller.git;a=blobdiff_plain;f=opendaylight%2Fmd-sal%2Fsal-dom-broker%2Fsrc%2Fmain%2Fjava%2Forg%2Fopendaylight%2Fcontroller%2Fmd%2Fsal%2Fdom%2Fbroker%2Fimpl%2FDOMForwardedWriteTransaction.java;h=58c91001c4e8887fec5a297507567fd69dc3a649;hp=45e18ff2199838c2b9896bd4ef9663e07bafdcb1;hb=2a6aa1775604906755883f810ee9ea6d5f286135;hpb=7ce44a14175815c85189845c918454a037f0db10 diff --git a/opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/controller/md/sal/dom/broker/impl/DOMForwardedWriteTransaction.java b/opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/controller/md/sal/dom/broker/impl/DOMForwardedWriteTransaction.java index 45e18ff219..58c91001c4 100644 --- a/opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/controller/md/sal/dom/broker/impl/DOMForwardedWriteTransaction.java +++ b/opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/controller/md/sal/dom/broker/impl/DOMForwardedWriteTransaction.java @@ -7,8 +7,11 @@ */ package org.opendaylight.controller.md.sal.dom.broker.impl; -import com.google.common.base.Preconditions; -import com.google.common.util.concurrent.CheckedFuture; +import static com.google.common.base.Preconditions.checkState; +import static java.util.Objects.requireNonNull; + +import com.google.common.base.Supplier; +import com.google.common.util.concurrent.FluentFuture; import com.google.common.util.concurrent.Futures; import com.google.common.util.concurrent.ListenableFuture; import java.util.ArrayList; @@ -16,14 +19,11 @@ import java.util.Collection; import java.util.Map; import java.util.concurrent.Future; import java.util.concurrent.atomic.AtomicReferenceFieldUpdater; -import org.opendaylight.controller.md.sal.common.api.TransactionStatus; import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType; -import org.opendaylight.controller.md.sal.common.api.data.TransactionCommitFailedException; -import org.opendaylight.controller.md.sal.common.impl.service.AbstractDataTransaction; import org.opendaylight.controller.md.sal.dom.api.DOMDataWriteTransaction; import org.opendaylight.controller.sal.core.spi.data.DOMStoreThreePhaseCommitCohort; import org.opendaylight.controller.sal.core.spi.data.DOMStoreWriteTransaction; -import org.opendaylight.yangtools.yang.common.RpcResult; +import org.opendaylight.mdsal.common.api.CommitInfo; import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier; import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode; import org.slf4j.Logger; @@ -34,28 +34,33 @@ import org.slf4j.LoggerFactory; * {@link DOMStoreWriteTransaction} transactions. A sub-transaction is selected by * {@link LogicalDatastoreType} type parameter in: * + *

*

+ * *

* {@link #commit()} will result in invocation of - * {@link DOMDataCommitImplementation#submit(org.opendaylight.controller.md.sal.dom.api.DOMDataWriteTransaction, Iterable)} - * invocation with all {@link org.opendaylight.controller.sal.core.spi.data.DOMStoreThreePhaseCommitCohort} for underlying - * transactions. + * {@link DOMDataCommitImplementation#submit(org.opendaylight.controller.md.sal.dom.api.DOMDataWriteTransaction, + * Iterable)} invocation with all {@link org.opendaylight.controller.sal.core.spi.data.DOMStoreThreePhaseCommitCohort} + * for underlying transactions. * * @param Subtype of {@link DOMStoreWriteTransaction} which is used as * subtransaction. */ +@Deprecated(forRemoval = true) class DOMForwardedWriteTransaction extends AbstractDOMForwardedCompositeTransaction implements DOMDataWriteTransaction { @SuppressWarnings("rawtypes") - private static final AtomicReferenceFieldUpdater IMPL_UPDATER = - AtomicReferenceFieldUpdater.newUpdater(DOMForwardedWriteTransaction.class, AbstractDOMForwardedTransactionFactory.class, "commitImpl"); + private static final AtomicReferenceFieldUpdater + IMPL_UPDATER = AtomicReferenceFieldUpdater + .newUpdater(DOMForwardedWriteTransaction.class, AbstractDOMForwardedTransactionFactory.class, "commitImpl"); @SuppressWarnings("rawtypes") - private static final AtomicReferenceFieldUpdater FUTURE_UPDATER = - AtomicReferenceFieldUpdater.newUpdater(DOMForwardedWriteTransaction.class, Future.class, "commitFuture"); + private static final AtomicReferenceFieldUpdater FUTURE_UPDATER + = AtomicReferenceFieldUpdater.newUpdater(DOMForwardedWriteTransaction.class, Future.class, "commitFuture"); private static final Logger LOG = LoggerFactory.getLogger(DOMForwardedWriteTransaction.class); private static final Future CANCELLED_FUTURE = Futures.immediateCancelledFuture(); @@ -68,9 +73,10 @@ class DOMForwardedWriteTransaction extends /** * Future task of transaction commit. It starts off as null, but is - * set appropriately on {@link #submit()} and {@link #cancel()} via + * set appropriately on {@link #commit()} and {@link #cancel()} via * {@link AtomicReferenceFieldUpdater#lazySet(Object, Object)}. * + *

* Lazy set is safe for use because it is only referenced to in the * {@link #cancel()} slow path, where we will busy-wait for it. The * fast path gets the benefit of a store-store barrier instead of the @@ -78,14 +84,15 @@ class DOMForwardedWriteTransaction extends */ private volatile Future commitFuture; - protected DOMForwardedWriteTransaction(final Object identifier, - final Map backingTxs, final AbstractDOMForwardedTransactionFactory commitImpl) { + protected DOMForwardedWriteTransaction(final Object identifier, final Map backingTxs, + final AbstractDOMForwardedTransactionFactory commitImpl) { super(identifier, backingTxs); - this.commitImpl = Preconditions.checkNotNull(commitImpl, "commitImpl must not be null."); + this.commitImpl = requireNonNull(commitImpl, "commitImpl must not be null."); } @Override - public void put(final LogicalDatastoreType store, final YangInstanceIdentifier path, final NormalizedNode data) { + public void put(final LogicalDatastoreType store, final YangInstanceIdentifier path, + final NormalizedNode data) { checkRunning(commitImpl); getSubtransaction(store).write(path, data); } @@ -97,7 +104,8 @@ class DOMForwardedWriteTransaction extends } @Override - public void merge(final LogicalDatastoreType store, final YangInstanceIdentifier path, final NormalizedNode data) { + public void merge(final LogicalDatastoreType store, final YangInstanceIdentifier path, + final NormalizedNode data) { checkRunning(commitImpl); getSubtransaction(store).merge(path, data); } @@ -108,6 +116,7 @@ class DOMForwardedWriteTransaction extends if (impl != null) { LOG.trace("Transaction {} cancelled before submit", getIdentifier()); FUTURE_UPDATER.lazySet(this, CANCELLED_FUTURE); + closeSubtransactions(); return true; } @@ -121,31 +130,35 @@ class DOMForwardedWriteTransaction extends return future.cancel(false); } - @Deprecated @Override - public ListenableFuture> commit() { - return AbstractDataTransaction.convertToLegacyCommitFuture(submit()); + public FluentFuture commit() { + return FluentFuture.from(doCommit(CommitInfo::empty)); } - @Override - public CheckedFuture submit() { + @SuppressWarnings("checkstyle:IllegalCatch") + private ListenableFuture doCommit(final Supplier futureValueSupplier) { final AbstractDOMForwardedTransactionFactory impl = IMPL_UPDATER.getAndSet(this, null); checkRunning(impl); final Collection txns = getSubtransactions(); final Collection cohorts = new ArrayList<>(txns.size()); - // FIXME: deal with errors thrown by backed (ready and submit can fail in theory) - for (DOMStoreWriteTransaction txn : txns) { - cohorts.add(txn.ready()); - } + ListenableFuture ret; + try { + for (DOMStoreWriteTransaction txn : txns) { + cohorts.add(txn.ready()); + } - final CheckedFuture ret = impl.submit(this, cohorts); + ret = impl.commit(this, cohorts, futureValueSupplier); + } catch (RuntimeException e) { + ret = FluentFuture.from(Futures.immediateFailedFuture( + TransactionCommitFailedExceptionMapper.COMMIT_ERROR_MAPPER.apply(e))); + } FUTURE_UPDATER.lazySet(this, ret); return ret; } private void checkRunning(final AbstractDOMForwardedTransactionFactory impl) { - Preconditions.checkState(impl != null, "Transaction %s is no longer running", getIdentifier()); + checkState(impl != null, "Transaction %s is no longer running", getIdentifier()); } }