X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?p=controller.git;a=blobdiff_plain;f=opendaylight%2Fmd-sal%2Fsamples%2Fclustering-test-app%2Fprovider%2Fsrc%2Fmain%2Fjava%2Forg%2Fopendaylight%2Fcontroller%2Fclustering%2Fit%2Fprovider%2Fimpl%2FWriteTransactionsHandler.java;h=6354f8497f0e6be7170472ca606c1c30f8287dc6;hp=b0503b240611176458732b95194681d6e598d8dc;hb=abaef4a5ae37f27542155457fe7306a4662b1eeb;hpb=3859df9beca8f13f1ff2b2744ed3470a1715bec3 diff --git a/opendaylight/md-sal/samples/clustering-test-app/provider/src/main/java/org/opendaylight/controller/clustering/it/provider/impl/WriteTransactionsHandler.java b/opendaylight/md-sal/samples/clustering-test-app/provider/src/main/java/org/opendaylight/controller/clustering/it/provider/impl/WriteTransactionsHandler.java index b0503b2406..6354f8497f 100644 --- a/opendaylight/md-sal/samples/clustering-test-app/provider/src/main/java/org/opendaylight/controller/clustering/it/provider/impl/WriteTransactionsHandler.java +++ b/opendaylight/md-sal/samples/clustering-test-app/provider/src/main/java/org/opendaylight/controller/clustering/it/provider/impl/WriteTransactionsHandler.java @@ -9,6 +9,7 @@ package org.opendaylight.controller.clustering.it.provider.impl; import static java.util.Objects.requireNonNull; +import com.google.common.util.concurrent.FluentFuture; import com.google.common.util.concurrent.ListenableFuture; import com.google.common.util.concurrent.SettableFuture; import java.util.LinkedHashSet; @@ -19,15 +20,15 @@ import java.util.concurrent.ExecutionException; import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeoutException; import java.util.concurrent.atomic.AtomicLong; -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.common.api.data.OptimisticLockFailedException; -import org.opendaylight.controller.md.sal.common.api.data.TransactionChain; -import org.opendaylight.controller.md.sal.common.api.data.TransactionChainListener; -import org.opendaylight.controller.md.sal.common.api.data.TransactionCommitFailedException; -import org.opendaylight.controller.md.sal.dom.api.DOMDataBroker; -import org.opendaylight.controller.md.sal.dom.api.DOMDataWriteTransaction; -import org.opendaylight.controller.md.sal.dom.api.DOMTransactionChain; +import org.eclipse.jdt.annotation.NonNull; +import org.opendaylight.mdsal.common.api.CommitInfo; +import org.opendaylight.mdsal.common.api.LogicalDatastoreType; +import org.opendaylight.mdsal.common.api.OptimisticLockFailedException; +import org.opendaylight.mdsal.dom.api.DOMDataBroker; +import org.opendaylight.mdsal.dom.api.DOMDataTreeTransaction; +import org.opendaylight.mdsal.dom.api.DOMDataTreeWriteTransaction; +import org.opendaylight.mdsal.dom.api.DOMTransactionChain; +import org.opendaylight.mdsal.dom.api.DOMTransactionChainListener; import org.opendaylight.yang.gen.v1.tag.opendaylight.org._2017.controller.yang.lowlevel.control.rev170215.WriteTransactionsInput; import org.opendaylight.yang.gen.v1.tag.opendaylight.org._2017.controller.yang.lowlevel.control.rev170215.WriteTransactionsOutput; import org.opendaylight.yang.gen.v1.tag.opendaylight.org._2017.controller.yang.lowlevel.control.rev170215.WriteTransactionsOutputBuilder; @@ -39,14 +40,15 @@ import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.NodeIdent import org.opendaylight.yangtools.yang.data.api.schema.ContainerNode; import org.opendaylight.yangtools.yang.data.api.schema.MapEntryNode; import org.opendaylight.yangtools.yang.data.api.schema.MapNode; +import org.opendaylight.yangtools.yang.data.api.schema.SystemMapNode; +import org.opendaylight.yangtools.yang.data.api.schema.builder.CollectionNodeBuilder; import org.opendaylight.yangtools.yang.data.impl.schema.ImmutableNodes; -import org.opendaylight.yangtools.yang.data.impl.schema.builder.api.CollectionNodeBuilder; import org.opendaylight.yangtools.yang.data.impl.schema.builder.impl.ImmutableContainerNodeBuilder; import org.slf4j.Logger; import org.slf4j.LoggerFactory; public abstract class WriteTransactionsHandler extends AbstractTransactionHandler { - private static final class Chained extends WriteTransactionsHandler implements TransactionChainListener { + private static final class Chained extends WriteTransactionsHandler implements DOMTransactionChainListener { private final SplittableRandom random = new SplittableRandom(); private final DOMTransactionChain transactionChain; @@ -57,7 +59,7 @@ public abstract class WriteTransactionsHandler extends AbstractTransactionHandle } @Override - DOMDataWriteTransaction createTransaction() { + DOMDataTreeWriteTransaction createTransaction() { return transactionChain.newWriteOnlyTransaction(); } @@ -67,15 +69,15 @@ public abstract class WriteTransactionsHandler extends AbstractTransactionHandle } @Override - public void onTransactionChainFailed(final TransactionChain chain, - final AsyncTransaction transaction, final Throwable cause) { + public void onTransactionChainFailed(final DOMTransactionChain chain, final DOMDataTreeTransaction transaction, + final Throwable cause) { // This is expected to happen frequently in isolation testing. LOG.debug("Transaction chain failed.", cause); // Do not return RPC here, rely on transaction failure to call runFailed. } @Override - public void onTransactionChainSuccessful(final TransactionChain chain) { + public void onTransactionChainSuccessful(final DOMTransactionChain chain) { LOG.debug("Transaction chain closed successfully."); } } @@ -92,7 +94,7 @@ public abstract class WriteTransactionsHandler extends AbstractTransactionHandle } @Override - DOMDataWriteTransaction createTransaction() { + DOMDataTreeWriteTransaction createTransaction() { return dataBroker.newWriteOnlyTransaction(); } @@ -141,27 +143,35 @@ public abstract class WriteTransactionsHandler extends AbstractTransactionHandle .withChild(ImmutableNodes.mapNodeBuilder(ID_INT).build()) .build(); - DOMDataWriteTransaction tx = domDataBroker.newWriteOnlyTransaction(); + DOMDataTreeWriteTransaction tx = domDataBroker.newWriteOnlyTransaction(); // write only the top list tx.merge(LogicalDatastoreType.CONFIGURATION, ID_INTS_YID, containerNode); try { - tx.submit().checkedGet(INIT_TX_TIMEOUT_SECONDS, TimeUnit.SECONDS); - } catch (final OptimisticLockFailedException e) { - // when multiple write-transactions are executed concurrently we need to ignore this. - // If we get optimistic lock here it means id-ints already exists and we can continue. - LOG.debug("Got an optimistic lock when writing initial top level list element.", e); - } catch (final TransactionCommitFailedException | TimeoutException e) { + tx.commit().get(INIT_TX_TIMEOUT_SECONDS, TimeUnit.SECONDS); + } catch (InterruptedException | TimeoutException e) { LOG.error("Error writing top-level path {}: {}", ID_INTS_YID, containerNode, e); return RpcResultBuilder.failed().withError(RpcError.ErrorType.APPLICATION, String.format("Could not start write transactions - error writing top-level path %s: %s", ID_INTS_YID, containerNode), e).buildFuture(); + } catch (ExecutionException e) { + final Throwable cause = e.getCause(); + if (cause instanceof OptimisticLockFailedException) { + // when multiple write-transactions are executed concurrently we need to ignore this. + // If we get optimistic lock here it means id-ints already exists and we can continue. + LOG.debug("Got an optimistic lock when writing initial top level list element.", e); + } else { + LOG.error("Error writing top-level path {}: {}", ID_INTS_YID, containerNode, e); + return RpcResultBuilder.failed().withError(RpcError.ErrorType.APPLICATION, + String.format("Could not start write transactions - error writing top-level path %s: %s", + ID_INTS_YID, containerNode), e).buildFuture(); + } } tx = domDataBroker.newWriteOnlyTransaction(); tx.merge(LogicalDatastoreType.CONFIGURATION, idListItem, entry); try { - tx.submit().get(INIT_TX_TIMEOUT_SECONDS, TimeUnit.SECONDS); + tx.commit().get(INIT_TX_TIMEOUT_SECONDS, TimeUnit.SECONDS); } catch (InterruptedException | ExecutionException | TimeoutException e) { LOG.error("Error writing top-level path {}: {}", idListItem, entry, e); return RpcResultBuilder.failed().withError(RpcError.ErrorType.APPLICATION, @@ -171,7 +181,7 @@ public abstract class WriteTransactionsHandler extends AbstractTransactionHandle LOG.debug("Filling the item list with initial values."); - final CollectionNodeBuilder mapBuilder = ImmutableNodes.mapNodeBuilder(ITEM); + final CollectionNodeBuilder mapBuilder = ImmutableNodes.mapNodeBuilder(ITEM); final YangInstanceIdentifier itemListId = idListItem.node(ITEM); tx = domDataBroker.newWriteOnlyTransaction(); @@ -179,7 +189,7 @@ public abstract class WriteTransactionsHandler extends AbstractTransactionHandle tx.put(LogicalDatastoreType.CONFIGURATION, itemListId, itemListNode); try { - tx.submit().get(INIT_TX_TIMEOUT_SECONDS, TimeUnit.SECONDS); + tx.commit().get(INIT_TX_TIMEOUT_SECONDS, TimeUnit.SECONDS); } catch (InterruptedException | ExecutionException | TimeoutException e) { LOG.error("Error filling initial item list path {}: {}", itemListId, itemListNode, e); return RpcResultBuilder.failed().withError(RpcError.ErrorType.APPLICATION, @@ -188,7 +198,7 @@ public abstract class WriteTransactionsHandler extends AbstractTransactionHandle } final WriteTransactionsHandler handler; - if (input.isChainedTransactions()) { + if (input.getChainedTransactions()) { handler = new Chained(domDataBroker, idListItem, input); } else { handler = new Simple(domDataBroker, idListItem, input); @@ -201,13 +211,13 @@ public abstract class WriteTransactionsHandler extends AbstractTransactionHandle } @Override - ListenableFuture execWrite(final long txId) { + FluentFuture execWrite(final long txId) { final int i = nextInt(MAX_ITEM + 1); final YangInstanceIdentifier entryId = idListItem.node(ITEM).node(YangInstanceIdentifier.NodeIdentifierWithPredicates.of(ITEM, NUMBER, i)); - final DOMDataWriteTransaction tx = createTransaction(); + final DOMDataTreeWriteTransaction tx = createTransaction(); if (usedValues.contains(i)) { LOG.debug("Deleting item: {}", i); @@ -223,7 +233,7 @@ public abstract class WriteTransactionsHandler extends AbstractTransactionHandle usedValues.add(i); } - return tx.submit(); + return tx.commit(); } @Override @@ -250,7 +260,7 @@ public abstract class WriteTransactionsHandler extends AbstractTransactionHandle .withError(RpcError.ErrorType.APPLICATION, cause).build()); } - abstract DOMDataWriteTransaction createTransaction(); + abstract DOMDataTreeWriteTransaction createTransaction(); abstract int nextInt(int bound); }