X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?a=blobdiff_plain;f=opendaylight%2Fmd-sal%2Fsal-dom-spi%2Fsrc%2Fmain%2Fjava%2Forg%2Fopendaylight%2Fcontroller%2Fsal%2Fcore%2Fspi%2Fdata%2FSnapshotBackedWriteTransaction.java;h=01f4008d341ceb9677917c3ddf0f00a8814273a4;hb=refs%2Fchanges%2F11%2F80211%2F6;hp=a02d768370133743b4c38ef0d7246f450422a6d2;hpb=9d382baa1e291f3199089b00f2e9adf910c1f9a0;p=controller.git diff --git a/opendaylight/md-sal/sal-dom-spi/src/main/java/org/opendaylight/controller/sal/core/spi/data/SnapshotBackedWriteTransaction.java b/opendaylight/md-sal/sal-dom-spi/src/main/java/org/opendaylight/controller/sal/core/spi/data/SnapshotBackedWriteTransaction.java index a02d768370..01f4008d34 100644 --- a/opendaylight/md-sal/sal-dom-spi/src/main/java/org/opendaylight/controller/sal/core/spi/data/SnapshotBackedWriteTransaction.java +++ b/opendaylight/md-sal/sal-dom-spi/src/main/java/org/opendaylight/controller/sal/core/spi/data/SnapshotBackedWriteTransaction.java @@ -8,12 +8,14 @@ package org.opendaylight.controller.sal.core.spi.data; import static com.google.common.base.Preconditions.checkState; + 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.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; @@ -29,14 +31,17 @@ import org.slf4j.LoggerFactory; * @param Identifier type */ @Beta -public class SnapshotBackedWriteTransaction extends AbstractDOMStoreTransaction implements DOMStoreWriteTransaction { +public class SnapshotBackedWriteTransaction extends AbstractDOMStoreTransaction + implements DOMStoreWriteTransaction { 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; @@ -52,6 +57,7 @@ public class SnapshotBackedWriteTransaction extends AbstractDOMStoreTransacti } @Override + @SuppressWarnings("checkstyle:IllegalCatch") public void write(final YangInstanceIdentifier path, final NormalizedNode data) { checkNotReady(); @@ -61,7 +67,7 @@ public class SnapshotBackedWriteTransaction extends AbstractDOMStoreTransacti try { tree.write(path, data); // FIXME: Add checked exception - } catch (Exception e) { + } catch (RuntimeException e) { LOG.error("Tx: {}, failed to write {}:{} in {}", getIdentifier(), path, data, tree, e); // Rethrow original ones if they are subclasses of RuntimeException // or Error @@ -72,6 +78,7 @@ public class SnapshotBackedWriteTransaction extends AbstractDOMStoreTransacti } @Override + @SuppressWarnings("checkstyle:IllegalCatch") public void merge(final YangInstanceIdentifier path, final NormalizedNode data) { checkNotReady(); @@ -81,7 +88,7 @@ public class SnapshotBackedWriteTransaction extends AbstractDOMStoreTransacti try { tree.merge(path, data); // FIXME: Add checked exception - } catch (Exception e) { + } catch (RuntimeException e) { LOG.error("Tx: {}, failed to write {}:{} in {}", getIdentifier(), path, data, tree, e); // Rethrow original ones if they are subclasses of RuntimeException // or Error @@ -92,6 +99,7 @@ public class SnapshotBackedWriteTransaction extends AbstractDOMStoreTransacti } @Override + @SuppressWarnings("checkstyle:IllegalCatch") public void delete(final YangInstanceIdentifier path) { checkNotReady(); @@ -101,7 +109,7 @@ public class SnapshotBackedWriteTransaction extends AbstractDOMStoreTransacti try { tree.delete(path); // FIXME: Add checked exception - } catch (Exception e) { + } catch (RuntimeException e) { LOG.error("Tx: {}, failed to delete {} in {}", getIdentifier(), path, tree, e); // Rethrow original ones if they are subclasses of RuntimeException // or Error @@ -119,14 +127,16 @@ public class SnapshotBackedWriteTransaction extends AbstractDOMStoreTransacti * @return null if the the transaction has been closed; */ final Optional> readSnapshotNode(final YangInstanceIdentifier path) { - return readyImpl == null ? null : mutableTree.readNode(path); + return readyImpl == null ? null : Optional.fromJavaUtil(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()); } @Override + @SuppressWarnings("checkstyle:IllegalCatch") public DOMStoreThreePhaseCommitCohort ready() { @SuppressWarnings("unchecked") final TransactionReadyPrototype wasReady = READY_UPDATER.getAndSet(this, null); @@ -136,8 +146,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 @@ -159,11 +174,8 @@ public class SnapshotBackedWriteTransaction extends AbstractDOMStoreTransacti } /** - * Prototype implementation of - * {@link #ready(org.opendaylight.controller.sal.core.spi.data.SnapshotBackedWriteTransaction)} - * - * This class is intended to be implemented by Transaction factories - * responsible for allocation of {@link org.opendaylight.controller.sal.core.spi.data.SnapshotBackedWriteTransaction} and + * This class is intended to be implemented by Transaction factories responsible for allocation of + * {@link org.opendaylight.controller.sal.core.spi.data.SnapshotBackedWriteTransaction} and * providing underlying logic for applying implementation. * * @param identifier type @@ -175,19 +187,24 @@ 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 +}