X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?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=c4abb391e64b94e59a5058d018d887af3e55d680;hb=5997e14efab9c12e7be2b7fb83f7efe16c2bfe7c;hp=664e7fd26fcb85f8fedbb2ae1f36c0fe2c2ea8ac;hpb=1b462903a7e74d65a953070504bc72fdccbcc7af;p=controller.git 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 664e7fd26f..c4abb391e6 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,7 +9,6 @@ package org.opendaylight.controller.clustering.it.provider.impl; import com.google.common.util.concurrent.CheckedFuture; -import com.google.common.util.concurrent.FutureCallback; import com.google.common.util.concurrent.Futures; import com.google.common.util.concurrent.ListenableFuture; import com.google.common.util.concurrent.SettableFuture; @@ -19,11 +18,12 @@ import java.util.LinkedHashSet; import java.util.List; import java.util.Set; import java.util.SplittableRandom; +import java.util.concurrent.ExecutionException; import java.util.concurrent.Executors; import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.ScheduledFuture; import java.util.concurrent.TimeUnit; -import javax.annotation.Nullable; +import java.util.concurrent.TimeoutException; 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; @@ -41,10 +41,13 @@ import org.opendaylight.yangtools.yang.common.RpcError; import org.opendaylight.yangtools.yang.common.RpcResult; import org.opendaylight.yangtools.yang.common.RpcResultBuilder; import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier; +import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.NodeIdentifier; +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.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; @@ -57,6 +60,8 @@ public class WriteTransactionsHandler implements Runnable { private static final QName ID_INTS = QName.create("tag:opendaylight.org,2017:controller:yang:lowlevel:target", "2017-02-15", "id-ints"); + private static final QName ID_INT = + QName.create("tag:opendaylight.org,2017:controller:yang:lowlevel:target", "2017-02-15", "id-int"); private static final QName ID = QName.create("tag:opendaylight.org,2017:controller:yang:lowlevel:target", "2017-02-15", "id"); private static final QName ITEM = @@ -65,6 +70,7 @@ public class WriteTransactionsHandler implements Runnable { QName.create("tag:opendaylight.org,2017:controller:yang:lowlevel:target", "2017-02-15", "number"); public static final YangInstanceIdentifier ID_INTS_YID = YangInstanceIdentifier.of(ID_INTS); + public static final YangInstanceIdentifier ID_INT_YID = ID_INTS_YID.node(ID_INT); private final DOMDataBroker domDataBroker; private final Long timeToTake; @@ -128,11 +134,14 @@ public class WriteTransactionsHandler implements Runnable { private boolean ensureListExists(final SettableFuture> settableFuture) { - final MapNode mapNode = ImmutableNodes.mapNodeBuilder(ID_INTS).build(); + final ContainerNode containerNode = ImmutableContainerNodeBuilder.create() + .withNodeIdentifier(new NodeIdentifier(ID_INTS)) + .withChild(ImmutableNodes.mapNodeBuilder(ID_INT).build()) + .build(); DOMDataWriteTransaction tx = txProvider.createTransaction(); // write only the top list - tx.merge(LogicalDatastoreType.CONFIGURATION, ID_INTS_YID, mapNode); + tx.merge(LogicalDatastoreType.CONFIGURATION, ID_INTS_YID, containerNode); try { tx.submit().checkedGet(); } catch (final OptimisticLockFailedException e) { @@ -146,11 +155,11 @@ public class WriteTransactionsHandler implements Runnable { return false; } - final MapEntryNode entry = ImmutableNodes.mapEntryBuilder(ID_INTS, ID, id) + final MapEntryNode entry = ImmutableNodes.mapEntryBuilder(ID_INT, ID, id) .withChild(ImmutableNodes.mapNodeBuilder(ITEM).build()) .build(); - idListWithKey = ID_INTS_YID.node(entry.getIdentifier()); + idListWithKey = ID_INT_YID.node(entry.getIdentifier()); tx = txProvider.createTransaction(); tx.merge(LogicalDatastoreType.CONFIGURATION, idListWithKey, entry); @@ -180,8 +189,8 @@ public class WriteTransactionsHandler implements Runnable { tx.put(LogicalDatastoreType.CONFIGURATION, itemListId, mapBuilder.build()); try { - tx.submit().checkedGet(); - } catch (final TransactionCommitFailedException e) { + tx.submit().checkedGet(125, TimeUnit.SECONDS); + } catch (final TransactionCommitFailedException | TimeoutException e) { LOG.warn("Unable to fill the initial item list.", e); settableFuture.set(RpcResultBuilder.failed() .withError(RpcError.ErrorType.APPLICATION, "Unexpected-exception", e).build()); @@ -224,32 +233,29 @@ public class WriteTransactionsHandler implements Runnable { final ListenableFuture> allFutures = Futures.allAsList(futures); - Futures.addCallback(allFutures, new FutureCallback>() { - @Override - public void onSuccess(@Nullable final List result) { - LOG.debug("All futures completed successfully."); + try { + // Timeout from cds should be 2 minutes so leave some leeway. + allFutures.get(125, TimeUnit.SECONDS); - final WriteTransactionsOutput output = new WriteTransactionsOutputBuilder() - .setAllTx(allTx) - .setInsertTx(insertTx) - .setDeleteTx(deleteTx) - .build(); + LOG.debug("All futures completed successfully."); - completionFuture.set(RpcResultBuilder.success() - .withResult(output).build()); + final WriteTransactionsOutput output = new WriteTransactionsOutputBuilder() + .setAllTx(allTx) + .setInsertTx(insertTx) + .setDeleteTx(deleteTx) + .build(); - executor.shutdown(); - } + completionFuture.set(RpcResultBuilder.success() + .withResult(output).build()); - @Override - public void onFailure(final Throwable t) { - LOG.error("Write transactions failed.", t); - completionFuture.set(RpcResultBuilder.failed() - .withError(RpcError.ErrorType.APPLICATION, "Unexpected-exception", t).build()); + executor.shutdown(); + } catch (InterruptedException | ExecutionException | TimeoutException exception) { + LOG.error("Write transactions failed.", exception); + completionFuture.set(RpcResultBuilder.failed() + .withError(RpcError.ErrorType.APPLICATION, "Unexpected-exception", exception).build()); - executor.shutdown(); - } - }); + executor.shutdown(); + } } }