From 87739e6c8f7edfaf977eb9cea86bac32cf016423 Mon Sep 17 00:00:00 2001 From: Robert Varga Date: Thu, 26 Apr 2018 12:20:10 +0200 Subject: [PATCH] Add SnapshotBackedTransaction DOMStore implementations working on SnapshotBacked transactions can provide additional functionality if they have access to the underlying snapshot. Expose a method which allows the snapshot to be acquired as long as the transaction is open. Change-Id: I408e31be0285fb41732f29206bccd71ce794215e Signed-off-by: Robert Varga --- .../store/SnapshotBackedReadTransaction.java | 16 ++++++---- .../SnapshotBackedReadWriteTransaction.java | 4 +-- .../spi/store/SnapshotBackedTransaction.java | 30 +++++++++++++++++++ .../store/SnapshotBackedWriteTransaction.java | 12 +++++--- 4 files changed, 50 insertions(+), 12 deletions(-) create mode 100644 dom/mdsal-dom-spi/src/main/java/org/opendaylight/mdsal/dom/spi/store/SnapshotBackedTransaction.java diff --git a/dom/mdsal-dom-spi/src/main/java/org/opendaylight/mdsal/dom/spi/store/SnapshotBackedReadTransaction.java b/dom/mdsal-dom-spi/src/main/java/org/opendaylight/mdsal/dom/spi/store/SnapshotBackedReadTransaction.java index 7fe884194f..dc1053dc6a 100644 --- a/dom/mdsal-dom-spi/src/main/java/org/opendaylight/mdsal/dom/spi/store/SnapshotBackedReadTransaction.java +++ b/dom/mdsal-dom-spi/src/main/java/org/opendaylight/mdsal/dom/spi/store/SnapshotBackedReadTransaction.java @@ -7,11 +7,10 @@ */ package org.opendaylight.mdsal.dom.spi.store; -import static com.google.common.base.Preconditions.checkNotNull; +import static java.util.Objects.requireNonNull; import com.google.common.annotations.Beta; import com.google.common.base.Optional; -import com.google.common.base.Preconditions; import com.google.common.util.concurrent.CheckedFuture; import com.google.common.util.concurrent.Futures; import org.opendaylight.mdsal.common.api.ReadFailedException; @@ -29,7 +28,7 @@ import org.slf4j.LoggerFactory; */ @Beta public final class SnapshotBackedReadTransaction extends - AbstractDOMStoreTransaction implements DOMStoreReadTransaction { + AbstractDOMStoreTransaction implements DOMStoreReadTransaction, SnapshotBackedTransaction { private static final Logger LOG = LoggerFactory.getLogger(SnapshotBackedReadTransaction.class); private volatile DataTreeSnapshot stableSnapshot; @@ -43,7 +42,7 @@ public final class SnapshotBackedReadTransaction extends */ SnapshotBackedReadTransaction(final T identifier, final boolean debug, final DataTreeSnapshot snapshot) { super(identifier, debug); - this.stableSnapshot = Preconditions.checkNotNull(snapshot); + this.stableSnapshot = requireNonNull(snapshot); LOG.debug("ReadOnly Tx: {} allocated with snapshot {}", identifier, snapshot); } @@ -57,7 +56,7 @@ public final class SnapshotBackedReadTransaction extends @Override public CheckedFuture>, ReadFailedException> read(final YangInstanceIdentifier path) { LOG.debug("Tx: {} Read: {}", getIdentifier(), path); - checkNotNull(path, "Path must not be null."); + requireNonNull(path, "Path must not be null."); final DataTreeSnapshot snapshot = stableSnapshot; if (snapshot == null) { @@ -75,7 +74,7 @@ public final class SnapshotBackedReadTransaction extends @Override public CheckedFuture exists(final YangInstanceIdentifier path) { LOG.debug("Tx: {} Exists: {}", getIdentifier(), path); - checkNotNull(path, "Path must not be null."); + requireNonNull(path, "Path must not be null."); try { return Futures.immediateCheckedFuture(read(path).checkedGet().isPresent()); @@ -83,4 +82,9 @@ public final class SnapshotBackedReadTransaction extends return Futures.immediateFailedCheckedFuture(e); } } + + @Override + public java.util.Optional getSnapshot() { + return java.util.Optional.ofNullable(stableSnapshot); + } } diff --git a/dom/mdsal-dom-spi/src/main/java/org/opendaylight/mdsal/dom/spi/store/SnapshotBackedReadWriteTransaction.java b/dom/mdsal-dom-spi/src/main/java/org/opendaylight/mdsal/dom/spi/store/SnapshotBackedReadWriteTransaction.java index 219d65abd3..7404324b31 100644 --- a/dom/mdsal-dom-spi/src/main/java/org/opendaylight/mdsal/dom/spi/store/SnapshotBackedReadWriteTransaction.java +++ b/dom/mdsal-dom-spi/src/main/java/org/opendaylight/mdsal/dom/spi/store/SnapshotBackedReadWriteTransaction.java @@ -21,8 +21,8 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; /** - * Implementation of Read-Write transaction which is backed by {@link DataTreeSnapshot} - * and executed according to {@link TransactionReadyPrototype}. + * Implementation of Read-Write transaction which is backed by {@link DataTreeSnapshot} and executed according + * to {@link SnapshotBackedWriteTransaction.TransactionReadyPrototype}. * * @param identifier type */ diff --git a/dom/mdsal-dom-spi/src/main/java/org/opendaylight/mdsal/dom/spi/store/SnapshotBackedTransaction.java b/dom/mdsal-dom-spi/src/main/java/org/opendaylight/mdsal/dom/spi/store/SnapshotBackedTransaction.java new file mode 100644 index 0000000000..d982343fa3 --- /dev/null +++ b/dom/mdsal-dom-spi/src/main/java/org/opendaylight/mdsal/dom/spi/store/SnapshotBackedTransaction.java @@ -0,0 +1,30 @@ +/* + * Copyright (c) 2018 Pantheon Technologies, s.r.o. and others. All rights reserved. + * + * This program and the accompanying materials are made available under the + * terms of the Eclipse Public License v1.0 which accompanies this distribution, + * and is available at http://www.eclipse.org/legal/epl-v10.html + */ +package org.opendaylight.mdsal.dom.spi.store; + +import com.google.common.annotations.Beta; +import java.util.Optional; +import org.eclipse.jdt.annotation.NonNullByDefault; +import org.opendaylight.yangtools.yang.data.api.schema.tree.DataTreeSnapshot; + +/** + * Interface implemented by {@link DOMStoreTransaction}s which are backed by a {@link DataTreeSnapshot}. + * + * @author Robert Varga + */ +@Beta +@NonNullByDefault +public interface SnapshotBackedTransaction extends DOMStoreTransaction { + /** + * Returns the {@link DataTreeSnapshot} underlying this transaction. If this transaction is no longer open, + * {@link Optional#empty()} is returned. + * + * @return DataTreeSnapshot attached to this transaction if this transaction is still open. + */ + Optional getSnapshot(); +} 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 3ac0ae78c9..a6716fcac3 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 @@ -24,15 +24,14 @@ 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); @@ -170,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); -- 2.36.6