From d7d5c4d3e7eaed528961081718c47a0960517ace Mon Sep 17 00:00:00 2001 From: Tony Tkacik Date: Mon, 23 Jun 2014 16:17:08 +0200 Subject: [PATCH] Bug 1227: Removed #close() from Write Transactions. Termination of write transactions was unclear due to several terminal methods such as commit, cancel and close. Close was removed from write transactions and is only available for read-only transactions. Termination methods for write transactions are close and commit. Introduced new interfaces for ReadOnly transactions to clearly distinguish between read capability of transaction and read-only semantic (which has close method). Change-Id: I74b3fd2066a55160da3b674156fc0dc54ba14a67 Signed-off-by: Tony Tkacik --- .../md/sal/binding/api/BindingDataBroker.java | 2 +- .../api/BindingDataReadOnlyTransaction.java | 16 +++++ .../impl/AbstractForwardedTransaction.java | 4 +- .../impl/ForwardedBindingDataBroker.java | 26 ++++---- .../data/ListProcessingAndOrderingTest.java | 4 +- .../sal/common/api/data/AsyncDataBroker.java | 2 +- .../api/data/AsyncDataTransactionFactory.java | 2 +- .../api/data/AsyncReadOnlyTransaction.java | 32 ++++++++++ .../common/api/data/AsyncReadTransaction.java | 2 +- .../sal/common/api/data/AsyncTransaction.java | 9 +-- .../api/data/AsyncWriteTransaction.java | 28 ++++----- .../sal/common/api/data/TransactionChain.java | 2 +- .../md/sal/dom/api/DOMDataBroker.java | 2 +- .../dom/api/DOMDataReadOnlyTransaction.java | 9 +++ .../md/sal/dom/api/DOMTransactionChain.java | 2 +- ...tractDOMForwardedCompositeTransaction.java | 3 +- ...bstractDOMForwardedTransactionFactory.java | 6 +- .../impl/DOMForwardedReadOnlyTransaction.java | 9 ++- .../impl/DOMForwardedWriteTransaction.java | 60 ++++++++++++++----- .../BackwardsCompatibleTransaction.java | 5 +- .../dom/broker/osgi/DOMDataBrokerProxy.java | 4 +- 21 files changed, 153 insertions(+), 76 deletions(-) create mode 100644 opendaylight/md-sal/sal-binding-api/src/main/java/org/opendaylight/controller/md/sal/binding/api/BindingDataReadOnlyTransaction.java create mode 100644 opendaylight/md-sal/sal-common-api/src/main/java/org/opendaylight/controller/md/sal/common/api/data/AsyncReadOnlyTransaction.java create mode 100644 opendaylight/md-sal/sal-dom-api/src/main/java/org/opendaylight/controller/md/sal/dom/api/DOMDataReadOnlyTransaction.java diff --git a/opendaylight/md-sal/sal-binding-api/src/main/java/org/opendaylight/controller/md/sal/binding/api/BindingDataBroker.java b/opendaylight/md-sal/sal-binding-api/src/main/java/org/opendaylight/controller/md/sal/binding/api/BindingDataBroker.java index 7eee5c8b62..48286bf311 100644 --- a/opendaylight/md-sal/sal-binding-api/src/main/java/org/opendaylight/controller/md/sal/binding/api/BindingDataBroker.java +++ b/opendaylight/md-sal/sal-binding-api/src/main/java/org/opendaylight/controller/md/sal/binding/api/BindingDataBroker.java @@ -15,7 +15,7 @@ import org.opendaylight.yangtools.yang.binding.InstanceIdentifier; public interface BindingDataBroker extends AsyncDataBroker, DataObject, BindingDataChangeListener>, BindingService { @Override - BindingDataReadTransaction newReadOnlyTransaction(); + BindingDataReadOnlyTransaction newReadOnlyTransaction(); @Override BindingDataReadWriteTransaction newReadWriteTransaction(); diff --git a/opendaylight/md-sal/sal-binding-api/src/main/java/org/opendaylight/controller/md/sal/binding/api/BindingDataReadOnlyTransaction.java b/opendaylight/md-sal/sal-binding-api/src/main/java/org/opendaylight/controller/md/sal/binding/api/BindingDataReadOnlyTransaction.java new file mode 100644 index 0000000000..4af0e48ab3 --- /dev/null +++ b/opendaylight/md-sal/sal-binding-api/src/main/java/org/opendaylight/controller/md/sal/binding/api/BindingDataReadOnlyTransaction.java @@ -0,0 +1,16 @@ +/* + * Copyright (c) 2014 Cisco Systems, Inc. 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.controller.md.sal.binding.api; + +import org.opendaylight.controller.md.sal.common.api.data.AsyncReadOnlyTransaction; +import org.opendaylight.yangtools.yang.binding.DataObject; +import org.opendaylight.yangtools.yang.binding.InstanceIdentifier; + +public interface BindingDataReadOnlyTransaction extends BindingDataReadTransaction, AsyncReadOnlyTransaction, DataObject> { + +} diff --git a/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/md/sal/binding/impl/AbstractForwardedTransaction.java b/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/md/sal/binding/impl/AbstractForwardedTransaction.java index a935a33a5e..3fac0dc93a 100644 --- a/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/md/sal/binding/impl/AbstractForwardedTransaction.java +++ b/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/md/sal/binding/impl/AbstractForwardedTransaction.java @@ -180,8 +180,8 @@ public class AbstractForwardedTransaction> doRead(final DOMDataReadTransaction readTransaction, diff --git a/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/md/sal/binding/impl/ForwardedBindingDataBroker.java b/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/md/sal/binding/impl/ForwardedBindingDataBroker.java index 5ab088e20e..f23c107070 100644 --- a/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/md/sal/binding/impl/ForwardedBindingDataBroker.java +++ b/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/md/sal/binding/impl/ForwardedBindingDataBroker.java @@ -8,14 +8,14 @@ package org.opendaylight.controller.md.sal.binding.impl; import org.opendaylight.controller.md.sal.binding.api.BindingDataBroker; -import org.opendaylight.controller.md.sal.binding.api.BindingDataReadTransaction; +import org.opendaylight.controller.md.sal.binding.api.BindingDataReadOnlyTransaction; import org.opendaylight.controller.md.sal.binding.api.BindingDataReadWriteTransaction; import org.opendaylight.controller.md.sal.binding.api.BindingDataWriteTransaction; import org.opendaylight.controller.md.sal.common.api.TransactionStatus; import org.opendaylight.controller.md.sal.common.api.data.AsyncTransaction; import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType; import org.opendaylight.controller.md.sal.dom.api.DOMDataBroker; -import org.opendaylight.controller.md.sal.dom.api.DOMDataReadTransaction; +import org.opendaylight.controller.md.sal.dom.api.DOMDataReadOnlyTransaction; import org.opendaylight.controller.md.sal.dom.api.DOMDataReadWriteTransaction; import org.opendaylight.controller.md.sal.dom.api.DOMDataWriteTransaction; import org.opendaylight.controller.sal.core.api.model.SchemaService; @@ -47,7 +47,7 @@ public class ForwardedBindingDataBroker extends AbstractForwardedDataBroker impl } @Override - public BindingDataReadTransaction newReadOnlyTransaction() { + public BindingDataReadOnlyTransaction newReadOnlyTransaction() { return new BindingDataReadTransactionImpl(getDelegate().newReadOnlyTransaction(),getCodec()); } @@ -73,17 +73,12 @@ public class ForwardedBindingDataBroker extends AbstractForwardedDataBroker impl return getDelegate().getIdentifier(); } - @Override - public void close() { - getDelegate().close(); - } - } - private class BindingDataReadTransactionImpl extends AbstractBindingTransaction implements - BindingDataReadTransaction { + private class BindingDataReadTransactionImpl extends AbstractBindingTransaction implements + BindingDataReadOnlyTransaction { - protected BindingDataReadTransactionImpl(final DOMDataReadTransaction delegate, + protected BindingDataReadTransactionImpl(final DOMDataReadOnlyTransaction delegate, final BindingToNormalizedNodeCodec codec) { super(delegate, codec); } @@ -93,6 +88,11 @@ public class ForwardedBindingDataBroker extends AbstractForwardedDataBroker impl final InstanceIdentifier path) { return doRead(getDelegate(), store, path); } + + @Override + public void close() { + getDelegate().close(); + } } private class BindingDataWriteTransactionImpl extends @@ -104,8 +104,8 @@ public class ForwardedBindingDataBroker extends AbstractForwardedDataBroker impl } @Override - public void cancel() { - doCancel(getDelegate()); + public boolean cancel() { + return doCancel(getDelegate()); } @Override diff --git a/opendaylight/md-sal/sal-binding-dom-it/src/test/java/org/opendaylight/controller/md/sal/binding/data/ListProcessingAndOrderingTest.java b/opendaylight/md-sal/sal-binding-dom-it/src/test/java/org/opendaylight/controller/md/sal/binding/data/ListProcessingAndOrderingTest.java index 800c1b4cc4..667887ac80 100644 --- a/opendaylight/md-sal/sal-binding-dom-it/src/test/java/org/opendaylight/controller/md/sal/binding/data/ListProcessingAndOrderingTest.java +++ b/opendaylight/md-sal/sal-binding-dom-it/src/test/java/org/opendaylight/controller/md/sal/binding/data/ListProcessingAndOrderingTest.java @@ -20,7 +20,7 @@ import java.util.concurrent.ExecutionException; import org.junit.Test; 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.dom.api.DOMDataReadTransaction; +import org.opendaylight.controller.md.sal.dom.api.DOMDataReadOnlyTransaction; import org.opendaylight.controller.sal.binding.api.data.DataModificationTransaction; import org.opendaylight.controller.sal.binding.test.AbstractDataServiceTest; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.md.sal.test.store.rev140422.Lists; @@ -139,7 +139,7 @@ public class ListProcessingAndOrderingTest extends AbstractDataServiceTest { private NormalizedNode resolveDataAsserted( final org.opendaylight.yangtools.yang.data.api.InstanceIdentifier domPath) { - try (DOMDataReadTransaction readTx = testContext.getDomAsyncDataBroker().newReadOnlyTransaction()){ + try (DOMDataReadOnlyTransaction readTx = testContext.getDomAsyncDataBroker().newReadOnlyTransaction()){ ListenableFuture>> data = readTx.read(LogicalDatastoreType.OPERATIONAL, domPath); Optional> potential = data.get(); assertTrue(potential.isPresent()); diff --git a/opendaylight/md-sal/sal-common-api/src/main/java/org/opendaylight/controller/md/sal/common/api/data/AsyncDataBroker.java b/opendaylight/md-sal/sal-common-api/src/main/java/org/opendaylight/controller/md/sal/common/api/data/AsyncDataBroker.java index fb429e5fd1..3351bcaaf7 100644 --- a/opendaylight/md-sal/sal-common-api/src/main/java/org/opendaylight/controller/md/sal/common/api/data/AsyncDataBroker.java +++ b/opendaylight/md-sal/sal-common-api/src/main/java/org/opendaylight/controller/md/sal/common/api/data/AsyncDataBroker.java @@ -133,7 +133,7 @@ public interface AsyncDataBroker

, D, L extends AsyncDataChange * {@inheritDoc} */ @Override - public AsyncReadTransaction newReadOnlyTransaction(); + public AsyncReadOnlyTransaction newReadOnlyTransaction(); /** * {@inheritDoc} diff --git a/opendaylight/md-sal/sal-common-api/src/main/java/org/opendaylight/controller/md/sal/common/api/data/AsyncDataTransactionFactory.java b/opendaylight/md-sal/sal-common-api/src/main/java/org/opendaylight/controller/md/sal/common/api/data/AsyncDataTransactionFactory.java index cedd883b22..a558b96b2d 100644 --- a/opendaylight/md-sal/sal-common-api/src/main/java/org/opendaylight/controller/md/sal/common/api/data/AsyncDataTransactionFactory.java +++ b/opendaylight/md-sal/sal-common-api/src/main/java/org/opendaylight/controller/md/sal/common/api/data/AsyncDataTransactionFactory.java @@ -72,7 +72,7 @@ public interface AsyncDataTransactionFactory

, D> { * * @return new read-only transaction */ - AsyncReadTransaction newReadOnlyTransaction(); + AsyncReadOnlyTransaction newReadOnlyTransaction(); /** * Allocates new read-write transaction which provides a mutable view of the data diff --git a/opendaylight/md-sal/sal-common-api/src/main/java/org/opendaylight/controller/md/sal/common/api/data/AsyncReadOnlyTransaction.java b/opendaylight/md-sal/sal-common-api/src/main/java/org/opendaylight/controller/md/sal/common/api/data/AsyncReadOnlyTransaction.java new file mode 100644 index 0000000000..ecf94cdfb1 --- /dev/null +++ b/opendaylight/md-sal/sal-common-api/src/main/java/org/opendaylight/controller/md/sal/common/api/data/AsyncReadOnlyTransaction.java @@ -0,0 +1,32 @@ +/* + * Copyright (c) 2014 Cisco Systems, Inc. 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.controller.md.sal.common.api.data; + +import org.opendaylight.yangtools.concepts.Path; + +/** + * Read-only transaction, which provides stable view of data + * and is {@link AutoCloseable} resource. + * + * @see AsyncReadTransaction + * +* @param

+ * Type of path (subtree identifier), which represents location in + * tree + * @param + * Type of data (payload), which represents data payload + */ +public interface AsyncReadOnlyTransaction

, D> extends AsyncReadTransaction, AutoCloseable { + + /** + * Closes transaction and releases all resources associated with it. + * + */ + @Override + public void close(); +} diff --git a/opendaylight/md-sal/sal-common-api/src/main/java/org/opendaylight/controller/md/sal/common/api/data/AsyncReadTransaction.java b/opendaylight/md-sal/sal-common-api/src/main/java/org/opendaylight/controller/md/sal/common/api/data/AsyncReadTransaction.java index 6cf5a5b532..e693f13330 100644 --- a/opendaylight/md-sal/sal-common-api/src/main/java/org/opendaylight/controller/md/sal/common/api/data/AsyncReadTransaction.java +++ b/opendaylight/md-sal/sal-common-api/src/main/java/org/opendaylight/controller/md/sal/common/api/data/AsyncReadTransaction.java @@ -14,7 +14,7 @@ import com.google.common.util.concurrent.ListenableFuture; /** * - * Provides a stateful read-only view of the data tree. + * Provides a stateful read view of the data tree. * *

* View of the data tree is a stable point-in-time snapshot of the current data tree state when diff --git a/opendaylight/md-sal/sal-common-api/src/main/java/org/opendaylight/controller/md/sal/common/api/data/AsyncTransaction.java b/opendaylight/md-sal/sal-common-api/src/main/java/org/opendaylight/controller/md/sal/common/api/data/AsyncTransaction.java index c7cc91528b..08ddfe6898 100644 --- a/opendaylight/md-sal/sal-common-api/src/main/java/org/opendaylight/controller/md/sal/common/api/data/AsyncTransaction.java +++ b/opendaylight/md-sal/sal-common-api/src/main/java/org/opendaylight/controller/md/sal/common/api/data/AsyncTransaction.java @@ -29,15 +29,10 @@ import org.opendaylight.yangtools.concepts.Path; * @param Type of data (payload), which represents data payload */ public interface AsyncTransaction

,D> extends // - Identifiable, - AutoCloseable { + Identifiable { @Override public Object getIdentifier(); - /** - * Closes transaction and releases all resources associated with it. - */ - @Override - public void close(); + } diff --git a/opendaylight/md-sal/sal-common-api/src/main/java/org/opendaylight/controller/md/sal/common/api/data/AsyncWriteTransaction.java b/opendaylight/md-sal/sal-common-api/src/main/java/org/opendaylight/controller/md/sal/common/api/data/AsyncWriteTransaction.java index e2734eaddc..f7eae27320 100644 --- a/opendaylight/md-sal/sal-common-api/src/main/java/org/opendaylight/controller/md/sal/common/api/data/AsyncWriteTransaction.java +++ b/opendaylight/md-sal/sal-common-api/src/main/java/org/opendaylight/controller/md/sal/common/api/data/AsyncWriteTransaction.java @@ -53,13 +53,19 @@ public interface AsyncWriteTransaction

, D> extends AsyncTransa * {@link TransactionStatus#NEW} or {@link TransactionStatus#SUBMITED} * * Invoking cancel() on {@link TransactionStatus#FAILED} or - * {@link TransactionStatus#CANCELED} will have no effect. + * {@link TransactionStatus#CANCELED} will have no effect, and transaction + * is considered cancelled. * - * @throws IllegalStateException - * If transaction status is {@link TransactionStatus#COMMITED} + * Invoking cancel() on finished transaction (future returned by {@link #commit()} + * already completed with {@link TransactionStatus#COMMITED}) will always + * fail (return false). + * + * @return false if the task could not be cancelled, + * typically because it has already completed normally; + * true otherwise * */ - public void cancel(); + public boolean cancel(); /** * Store a piece of data at specified path. This acts as an add / replace @@ -141,20 +147,6 @@ public interface AsyncWriteTransaction

, D> extends AsyncTransa */ public void delete(LogicalDatastoreType store, P path); - /** - * - * Closes transaction and resources allocated to the transaction. - * - * This call does not change Transaction status. Client SHOULD explicitly - * {@link #commit()} or {@link #cancel()} transaction. - * - * @throws IllegalStateException - * if the transaction has not been updated by invoking - * {@link #commit()} or {@link #cancel()}. - */ - @Override - public void close(); - /** * Submits transaction to be applied to update logical data tree. *

diff --git a/opendaylight/md-sal/sal-common-api/src/main/java/org/opendaylight/controller/md/sal/common/api/data/TransactionChain.java b/opendaylight/md-sal/sal-common-api/src/main/java/org/opendaylight/controller/md/sal/common/api/data/TransactionChain.java index e7e0eb0ff8..940559ef89 100644 --- a/opendaylight/md-sal/sal-common-api/src/main/java/org/opendaylight/controller/md/sal/common/api/data/TransactionChain.java +++ b/opendaylight/md-sal/sal-common-api/src/main/java/org/opendaylight/controller/md/sal/common/api/data/TransactionChain.java @@ -27,7 +27,7 @@ public interface TransactionChain

, D> extends AutoCloseable, A * @throws TransactionChainClosedException if the chain has been closed. */ @Override - public AsyncReadTransaction newReadOnlyTransaction(); + public AsyncReadOnlyTransaction newReadOnlyTransaction(); /** diff --git a/opendaylight/md-sal/sal-dom-api/src/main/java/org/opendaylight/controller/md/sal/dom/api/DOMDataBroker.java b/opendaylight/md-sal/sal-dom-api/src/main/java/org/opendaylight/controller/md/sal/dom/api/DOMDataBroker.java index c120508f87..613cf1bfe2 100644 --- a/opendaylight/md-sal/sal-dom-api/src/main/java/org/opendaylight/controller/md/sal/dom/api/DOMDataBroker.java +++ b/opendaylight/md-sal/sal-dom-api/src/main/java/org/opendaylight/controller/md/sal/dom/api/DOMDataBroker.java @@ -29,7 +29,7 @@ public interface DOMDataBroker extends * {@inheritDoc} */ @Override - DOMDataReadTransaction newReadOnlyTransaction(); + DOMDataReadOnlyTransaction newReadOnlyTransaction(); /** * {@inheritDoc} diff --git a/opendaylight/md-sal/sal-dom-api/src/main/java/org/opendaylight/controller/md/sal/dom/api/DOMDataReadOnlyTransaction.java b/opendaylight/md-sal/sal-dom-api/src/main/java/org/opendaylight/controller/md/sal/dom/api/DOMDataReadOnlyTransaction.java new file mode 100644 index 0000000000..18fb988661 --- /dev/null +++ b/opendaylight/md-sal/sal-dom-api/src/main/java/org/opendaylight/controller/md/sal/dom/api/DOMDataReadOnlyTransaction.java @@ -0,0 +1,9 @@ +package org.opendaylight.controller.md.sal.dom.api; + +import org.opendaylight.controller.md.sal.common.api.data.AsyncReadOnlyTransaction; +import org.opendaylight.yangtools.yang.data.api.InstanceIdentifier; +import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode; + +public interface DOMDataReadOnlyTransaction extends DOMDataReadTransaction, AsyncReadOnlyTransaction> { + +} diff --git a/opendaylight/md-sal/sal-dom-api/src/main/java/org/opendaylight/controller/md/sal/dom/api/DOMTransactionChain.java b/opendaylight/md-sal/sal-dom-api/src/main/java/org/opendaylight/controller/md/sal/dom/api/DOMTransactionChain.java index b894911ffa..73a0c28465 100644 --- a/opendaylight/md-sal/sal-dom-api/src/main/java/org/opendaylight/controller/md/sal/dom/api/DOMTransactionChain.java +++ b/opendaylight/md-sal/sal-dom-api/src/main/java/org/opendaylight/controller/md/sal/dom/api/DOMTransactionChain.java @@ -24,7 +24,7 @@ import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode; public interface DOMTransactionChain extends TransactionChain> { @Override - DOMDataReadTransaction newReadOnlyTransaction(); + DOMDataReadOnlyTransaction newReadOnlyTransaction(); @Override DOMDataReadWriteTransaction newReadWriteTransaction(); diff --git a/opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/controller/md/sal/dom/broker/impl/AbstractDOMForwardedCompositeTransaction.java b/opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/controller/md/sal/dom/broker/impl/AbstractDOMForwardedCompositeTransaction.java index 0c07b0684c..0be4327f7a 100644 --- a/opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/controller/md/sal/dom/broker/impl/AbstractDOMForwardedCompositeTransaction.java +++ b/opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/controller/md/sal/dom/broker/impl/AbstractDOMForwardedCompositeTransaction.java @@ -75,8 +75,7 @@ abstract class AbstractDOMForwardedCompositeTransaction builder = ImmutableMap.builder(); for (Entry store : storeTxFactories.entrySet()) { diff --git a/opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/controller/md/sal/dom/broker/impl/DOMForwardedReadOnlyTransaction.java b/opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/controller/md/sal/dom/broker/impl/DOMForwardedReadOnlyTransaction.java index d2543f02bc..f207783c29 100644 --- a/opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/controller/md/sal/dom/broker/impl/DOMForwardedReadOnlyTransaction.java +++ b/opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/controller/md/sal/dom/broker/impl/DOMForwardedReadOnlyTransaction.java @@ -8,7 +8,7 @@ package org.opendaylight.controller.md.sal.dom.broker.impl; import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType; -import org.opendaylight.controller.md.sal.dom.api.DOMDataReadTransaction; +import org.opendaylight.controller.md.sal.dom.api.DOMDataReadOnlyTransaction; import org.opendaylight.controller.sal.core.spi.data.DOMStoreReadTransaction; import org.opendaylight.yangtools.yang.data.api.InstanceIdentifier; import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode; @@ -26,7 +26,7 @@ import com.google.common.util.concurrent.ListenableFuture; */ class DOMForwardedReadOnlyTransaction extends AbstractDOMForwardedCompositeTransaction implements - DOMDataReadTransaction { + DOMDataReadOnlyTransaction { protected DOMForwardedReadOnlyTransaction(final Object identifier, final ImmutableMap backingTxs) { @@ -39,4 +39,9 @@ class DOMForwardedReadOnlyTransaction extends return getSubtransaction(store).read(path); } + @Override + public void close() { + closeSubtransactions(); + } + } 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 eeb345e9ce..f791522a2a 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 @@ -50,13 +50,31 @@ import com.google.common.util.concurrent.ListenableFuture; class DOMForwardedWriteTransaction extends AbstractDOMForwardedCompositeTransaction implements DOMDataWriteTransaction { + /** + * Implementation of real commit. + * + * Transaction can not be commited if commitImpl is null, + * so this seting this property to null is also used to + * prevent write to + * already commited / canceled transaction {@link #checkNotCanceled() + * + * + */ @GuardedBy("this") - private DOMDataCommitImplementation commitImpl; - - @GuardedBy("this") - private boolean canceled; + private volatile DOMDataCommitImplementation commitImpl; + + /** + * + * Future task of transaction commit. + * + * This value is initially null, and is once updated if transaction + * is commited {@link #commit()}. + * If this future exists, transaction MUST not be commited again + * and all modifications should fail. See {@link #checkNotCommited()}. + * + */ @GuardedBy("this") - private ListenableFuture> commitFuture; + private volatile ListenableFuture> commitFuture; protected DOMForwardedWriteTransaction(final Object identifier, final ImmutableMap backingTxs, final DOMDataCommitImplementation commitImpl) { @@ -83,15 +101,19 @@ class DOMForwardedWriteTransaction extends } @Override - public synchronized void cancel() { - checkState(!canceled, "Transaction was canceled."); - if (commitFuture != null) { - // FIXME: Implement cancelation of commit future - // when Broker impl will support cancelation. - throw new UnsupportedOperationException("Not implemented yet."); + public synchronized boolean cancel() { + // Transaction is already canceled, we are safe to return true + final boolean cancelationResult; + if (commitImpl == null && commitFuture != null) { + // Transaction is submitted, we try to cancel future. + cancelationResult = commitFuture.cancel(false); + } else if(commitImpl == null) { + return true; + } else { + cancelationResult = true; + commitImpl = null; } - canceled = true; - commitImpl = null; + return cancelationResult; } @@ -105,20 +127,26 @@ class DOMForwardedWriteTransaction extends } ImmutableList cohorts = cohortsBuilder.build(); commitFuture = commitImpl.commit(this, cohorts); + + /* + *We remove reference to Commit Implementation in order + *to prevent memory leak + */ + commitImpl = null; return commitFuture; } private void checkNotReady() { - checkNotCanceled(); checkNotCommited(); + checkNotCanceled(); } private void checkNotCanceled() { - Preconditions.checkState(!canceled, "Transaction was canceled."); + Preconditions.checkState(commitImpl != null, "Transaction was canceled."); } private void checkNotCommited() { - checkState(commitFuture == null, "Transaction was already commited."); + checkState(commitFuture == null, "Transaction was already submited."); } } \ No newline at end of file diff --git a/opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/controller/md/sal/dom/broker/impl/compat/BackwardsCompatibleTransaction.java b/opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/controller/md/sal/dom/broker/impl/compat/BackwardsCompatibleTransaction.java index 29f2af511e..b3fb7b6da8 100644 --- a/opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/controller/md/sal/dom/broker/impl/compat/BackwardsCompatibleTransaction.java +++ b/opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/controller/md/sal/dom/broker/impl/compat/BackwardsCompatibleTransaction.java @@ -24,6 +24,7 @@ import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType; import org.opendaylight.controller.md.sal.common.impl.util.compat.DataNormalizationException; import org.opendaylight.controller.md.sal.common.impl.util.compat.DataNormalizationOperation; import org.opendaylight.controller.md.sal.common.impl.util.compat.DataNormalizer; +import org.opendaylight.controller.md.sal.dom.api.DOMDataReadOnlyTransaction; import org.opendaylight.controller.md.sal.dom.api.DOMDataReadTransaction; import org.opendaylight.controller.md.sal.dom.api.DOMDataReadWriteTransaction; import org.opendaylight.controller.sal.core.api.data.DataModificationTransaction; @@ -55,10 +56,10 @@ public abstract class BackwardsCompatibleTransaction readOnlyTransaction(final DOMDataReadTransaction readTx, + public static BackwardsCompatibleTransaction readOnlyTransaction(final DOMDataReadOnlyTransaction readTx, final DataNormalizer normalizer) { - return new BackwardsCompatibleTransaction(readTx, normalizer) { + return new BackwardsCompatibleTransaction(readTx, normalizer) { @Override public TransactionStatus getStatus() { diff --git a/opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/controller/sal/dom/broker/osgi/DOMDataBrokerProxy.java b/opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/controller/sal/dom/broker/osgi/DOMDataBrokerProxy.java index b0ccfb995d..4f44f361d5 100644 --- a/opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/controller/sal/dom/broker/osgi/DOMDataBrokerProxy.java +++ b/opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/controller/sal/dom/broker/osgi/DOMDataBrokerProxy.java @@ -4,7 +4,7 @@ import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType; import org.opendaylight.controller.md.sal.common.api.data.TransactionChainListener; import org.opendaylight.controller.md.sal.dom.api.DOMDataBroker; import org.opendaylight.controller.md.sal.dom.api.DOMDataChangeListener; -import org.opendaylight.controller.md.sal.dom.api.DOMDataReadTransaction; +import org.opendaylight.controller.md.sal.dom.api.DOMDataReadOnlyTransaction; import org.opendaylight.controller.md.sal.dom.api.DOMDataReadWriteTransaction; import org.opendaylight.controller.md.sal.dom.api.DOMDataWriteTransaction; import org.opendaylight.controller.md.sal.dom.api.DOMTransactionChain; @@ -19,7 +19,7 @@ public class DOMDataBrokerProxy extends AbstractBrokerServiceProxy