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=99f60497d81d0469b84150b1bafff614508f5ae4;hb=fb0a271c02454f11cd3c64130513dfb7caf3f386;hp=4ef16adc17fe594344636972759a65c766766a02;hpb=6a192f0eeedc302ae0b506d04f9d79b34406aef5;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 4ef16adc17..99f60497d8 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,13 +8,14 @@ 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; @@ -23,21 +24,28 @@ 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 { +public class SnapshotBackedWriteTransaction extends AbstractDOMStoreTransaction + implements DOMStoreWriteTransaction, SnapshotBackedTransaction { + private static final Logger LOG = LoggerFactory.getLogger(SnapshotBackedWriteTransaction.class); + @SuppressWarnings("rawtypes") - private static final AtomicReferenceFieldUpdater READY_UPDATER = - AtomicReferenceFieldUpdater.newUpdater(SnapshotBackedWriteTransaction.class, TransactionReadyPrototype.class, "readyImpl"); + private static final AtomicReferenceFieldUpdater READY_UPDATER = + AtomicReferenceFieldUpdater.newUpdater(SnapshotBackedWriteTransaction.class, + TransactionReadyPrototype.class, "readyImpl"); + @SuppressWarnings("rawtypes") - private static final AtomicReferenceFieldUpdater TREE_UPDATER = - AtomicReferenceFieldUpdater.newUpdater(SnapshotBackedWriteTransaction.class, DataTreeModification.class, "mutableTree"); + private static final AtomicReferenceFieldUpdater TREE_UPDATER = + AtomicReferenceFieldUpdater.newUpdater(SnapshotBackedWriteTransaction.class, + DataTreeModification.class, "mutableTree"); // non-null when not ready private volatile TransactionReadyPrototype readyImpl; @@ -47,11 +55,12 @@ 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) { checkNotReady(); @@ -62,16 +71,16 @@ public class SnapshotBackedWriteTransaction extends AbstractDOMStoreTransacti try { tree.write(path, data); // FIXME: Add checked exception - } catch (final Exception e) { + } 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); } } + @SuppressWarnings("checkstyle:IllegalCatch") @Override public void merge(final YangInstanceIdentifier path, final NormalizedNode data) { checkNotReady(); @@ -82,16 +91,16 @@ public class SnapshotBackedWriteTransaction extends AbstractDOMStoreTransacti try { tree.merge(path, data); // FIXME: Add checked exception - } catch (final 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); + } catch (Exception 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); } } + @SuppressWarnings("checkstyle:IllegalCatch") @Override public void delete(final YangInstanceIdentifier path) { checkNotReady(); @@ -102,11 +111,10 @@ public class SnapshotBackedWriteTransaction extends AbstractDOMStoreTransacti try { tree.delete(path); // FIXME: Add checked exception - } catch (final Exception e) { + } 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); } @@ -123,10 +131,12 @@ public class SnapshotBackedWriteTransaction extends AbstractDOMStoreTransacti return readyImpl == null ? null : mutableTree.readNode(path); } - private final void checkNotReady() { - checkState(readyImpl != null, "Transaction %s is no longer open. No further modifications allowed.", getIdentifier()); + private void checkNotReady() { + checkState(readyImpl != null, + "Transaction %s is no longer open. No further modifications allowed.", getIdentifier()); } + @SuppressWarnings("checkstyle:IllegalCatch") @Override public DOMStoreThreePhaseCommitCohort ready() { @SuppressWarnings("unchecked") @@ -137,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 @@ -154,14 +169,20 @@ 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); } /** - * Prototype implementation of {@link SnapshotBackedWriteTransaction#ready()} + * Prototype implementation of {@link SnapshotBackedWriteTransaction#ready()}. * + *

* This class is intended to be implemented by Transaction factories responsible for allocation * of {@link org.opendaylight.mdsal.dom.spi.store.SnapshotBackedWriteTransaction} and * providing underlying logic for applying implementation. @@ -175,19 +196,22 @@ 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. - * * This call must not fail. * * @param tx * 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); } -} \ No newline at end of file +}