X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?a=blobdiff_plain;f=dom%2Fmdsal-dom-spi%2Fsrc%2Fmain%2Fjava%2Forg%2Fopendaylight%2Fmdsal%2Fdom%2Fspi%2Fstore%2FSnapshotBackedWriteTransaction.java;h=babb8ed003a7061439689b8d4cbe8102f64a3bd7;hb=11408d627adca7eb71ac956c3ad01f75b6b91596;hp=620438347ad3f4350a6c7a8a68e81300d7cd4316;hpb=465c7e6c9d5bcaa647cf2e86aa3e1c65fc0d591d;p=mdsal.git diff --git a/dom/mdsal-dom-spi/src/main/java/org/opendaylight/mdsal/dom/spi/store/SnapshotBackedWriteTransaction.java b/dom/mdsal-dom-spi/src/main/java/org/opendaylight/mdsal/dom/spi/store/SnapshotBackedWriteTransaction.java index 620438347a..babb8ed003 100644 --- a/dom/mdsal-dom-spi/src/main/java/org/opendaylight/mdsal/dom/spi/store/SnapshotBackedWriteTransaction.java +++ b/dom/mdsal-dom-spi/src/main/java/org/opendaylight/mdsal/dom/spi/store/SnapshotBackedWriteTransaction.java @@ -8,30 +8,30 @@ package org.opendaylight.mdsal.dom.spi.store; import static com.google.common.base.Preconditions.checkState; +import static java.util.Objects.requireNonNull; import com.google.common.annotations.Beta; import com.google.common.base.MoreObjects.ToStringHelper; -import com.google.common.base.Optional; -import com.google.common.base.Preconditions; import com.google.common.base.Throwables; +import java.util.Optional; import java.util.concurrent.atomic.AtomicReferenceFieldUpdater; +import org.eclipse.jdt.annotation.Nullable; import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier; import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode; -import org.opendaylight.yangtools.yang.data.api.schema.tree.DataTreeModification; -import org.opendaylight.yangtools.yang.data.api.schema.tree.DataTreeSnapshot; +import org.opendaylight.yangtools.yang.data.tree.api.DataTreeModification; +import org.opendaylight.yangtools.yang.data.tree.api.DataTreeSnapshot; import org.slf4j.Logger; import org.slf4j.LoggerFactory; /** - * Implementation of Write transaction which is backed by - * {@link DataTreeSnapshot} and executed according to - * {@link org.opendaylight.mdsal.dom.spi.store.SnapshotBackedWriteTransaction.TransactionReadyPrototype}. + * Implementation of Write transaction which is backed by {@link DataTreeSnapshot} and executed according to + * {@link TransactionReadyPrototype}. * * @param Identifier type */ @Beta public class SnapshotBackedWriteTransaction extends AbstractDOMStoreTransaction - implements DOMStoreWriteTransaction { + implements DOMStoreWriteTransaction, SnapshotBackedTransaction { private static final Logger LOG = LoggerFactory.getLogger(SnapshotBackedWriteTransaction.class); @@ -55,14 +55,14 @@ public class SnapshotBackedWriteTransaction extends AbstractDOMStoreTransacti SnapshotBackedWriteTransaction(final T identifier, final boolean debug, final DataTreeSnapshot snapshot, final TransactionReadyPrototype readyImpl) { super(identifier, debug); - this.readyImpl = Preconditions.checkNotNull(readyImpl, "readyImpl must not be null."); + this.readyImpl = requireNonNull(readyImpl, "readyImpl must not be null."); mutableTree = snapshot.newModification(); LOG.debug("Write Tx: {} allocated with snapshot {}", identifier, snapshot); } @SuppressWarnings("checkstyle:IllegalCatch") @Override - public void write(final YangInstanceIdentifier path, final NormalizedNode data) { + public void write(final YangInstanceIdentifier path, final NormalizedNode data) { checkNotReady(); final DataTreeModification tree = mutableTree; @@ -73,9 +73,8 @@ public class SnapshotBackedWriteTransaction extends AbstractDOMStoreTransacti // FIXME: Add checked exception } catch (Exception e) { LOG.error("Tx: {}, failed to write {}:{} in {}", getIdentifier(), path, data, tree, e); - // Rethrow original ones if they are subclasses of RuntimeException - // or Error - Throwables.propagateIfPossible(e); + // Rethrow original ones if they are subclasses of RuntimeException or Error + Throwables.throwIfUnchecked(e); // FIXME: Introduce proper checked exception throw new IllegalArgumentException("Illegal input data.", e); } @@ -83,7 +82,7 @@ public class SnapshotBackedWriteTransaction extends AbstractDOMStoreTransacti @SuppressWarnings("checkstyle:IllegalCatch") @Override - public void merge(final YangInstanceIdentifier path, final NormalizedNode data) { + public void merge(final YangInstanceIdentifier path, final NormalizedNode data) { checkNotReady(); final DataTreeModification tree = mutableTree; @@ -93,10 +92,9 @@ public class SnapshotBackedWriteTransaction extends AbstractDOMStoreTransacti tree.merge(path, data); // FIXME: Add checked exception } catch (Exception e) { - LOG.error("Tx: {}, failed to write {}:{} in {}", getIdentifier(), path, data, tree, e); - // Rethrow original ones if they are subclasses of RuntimeException - // or Error - Throwables.propagateIfPossible(e); + LOG.error("Tx: {}, failed to merge {}:{} in {}", getIdentifier(), path, data, tree, e); + // Rethrow original ones if they are subclasses of RuntimeException or Error + Throwables.throwIfUnchecked(e); // FIXME: Introduce proper checked exception throw new IllegalArgumentException("Illegal input data.", e); } @@ -115,9 +113,8 @@ public class SnapshotBackedWriteTransaction extends AbstractDOMStoreTransacti // FIXME: Add checked exception } catch (Exception e) { LOG.error("Tx: {}, failed to delete {} in {}", getIdentifier(), path, tree, e); - // Rethrow original ones if they are subclasses of RuntimeException - // or Error - Throwables.propagateIfPossible(e); + // Rethrow original ones if they are subclasses of RuntimeException or Error + Throwables.throwIfUnchecked(e); // FIXME: Introduce proper checked exception throw new IllegalArgumentException("Illegal path to delete.", e); } @@ -130,7 +127,7 @@ public class SnapshotBackedWriteTransaction extends AbstractDOMStoreTransacti * @param path Path to read * @return null if the the transaction has been closed; */ - final Optional> readSnapshotNode(final YangInstanceIdentifier path) { + final Optional readSnapshotNode(final YangInstanceIdentifier path) { return readyImpl == null ? null : mutableTree.readNode(path); } @@ -139,6 +136,7 @@ public class SnapshotBackedWriteTransaction extends AbstractDOMStoreTransacti "Transaction %s is no longer open. No further modifications allowed.", getIdentifier()); } + @SuppressWarnings("checkstyle:IllegalCatch") @Override public DOMStoreThreePhaseCommitCohort ready() { @SuppressWarnings("unchecked") @@ -149,8 +147,13 @@ public class SnapshotBackedWriteTransaction extends AbstractDOMStoreTransacti final DataTreeModification tree = mutableTree; TREE_UPDATER.lazySet(this, null); - tree.ready(); - return wasReady.transactionReady(this, tree); + try { + tree.ready(); + return wasReady.transactionReady(this, tree, null); + } catch (RuntimeException e) { + LOG.debug("Store transaction: {}: unexpected failure when readying", getIdentifier(), e); + return wasReady.transactionReady(this, tree, e); + } } @Override @@ -166,6 +169,11 @@ public class SnapshotBackedWriteTransaction extends AbstractDOMStoreTransacti } } + @Override + public Optional getSnapshot() { + return readyImpl == null ? Optional.empty() : Optional.ofNullable(mutableTree); + } + @Override protected ToStringHelper addToStringAttributes(final ToStringHelper toStringHelper) { return toStringHelper.add("ready", readyImpl == null); @@ -188,7 +196,7 @@ public class SnapshotBackedWriteTransaction extends AbstractDOMStoreTransacti * * @param tx Transaction which got aborted. */ - protected abstract void transactionAborted(final SnapshotBackedWriteTransaction tx); + protected abstract void transactionAborted(SnapshotBackedWriteTransaction tx); /** * Returns a commit coordinator associated with supplied transactions. @@ -198,9 +206,12 @@ public class SnapshotBackedWriteTransaction extends AbstractDOMStoreTransacti * Transaction on which ready was invoked. * @param tree * Modified data tree which has been constructed. + * @param readyError + * Any error that has already happened when readying. * @return DOMStoreThreePhaseCommitCohort associated with transaction */ - protected abstract DOMStoreThreePhaseCommitCohort transactionReady( - SnapshotBackedWriteTransaction tx, DataTreeModification tree); + protected abstract DOMStoreThreePhaseCommitCohort transactionReady(SnapshotBackedWriteTransaction tx, + DataTreeModification tree, + @Nullable Exception readyError); } }