From: Devin Avery Date: Fri, 27 Jun 2014 15:52:38 +0000 (+0000) Subject: Merge "Bug 1227: Removed #close() from Write Transactions." X-Git-Tag: release/helium~594 X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?p=controller.git;a=commitdiff_plain;h=3ce420ccd45e7530c2c2158bd57462fd5859a879;hp=f5639ec4d80dc50b71f306137dd7aa9f077973b2 Merge "Bug 1227: Removed #close() from Write Transactions." --- 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