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%2FProduceTransactionsHandler.java;h=0d49a697d6d5b1227ee704bbb5099233b07cf05c;hp=49024ef283e86ba649649e57acdcc7847c4bc9a4;hb=f3225736fa511575ddc754d15b0bd2e6e36f1a82;hpb=909db4bfbe3e4e036fc3e968ba6e2b1af150ee66 diff --git a/opendaylight/md-sal/samples/clustering-test-app/provider/src/main/java/org/opendaylight/controller/clustering/it/provider/impl/ProduceTransactionsHandler.java b/opendaylight/md-sal/samples/clustering-test-app/provider/src/main/java/org/opendaylight/controller/clustering/it/provider/impl/ProduceTransactionsHandler.java index 49024ef283..0d49a697d6 100644 --- a/opendaylight/md-sal/samples/clustering-test-app/provider/src/main/java/org/opendaylight/controller/clustering/it/provider/impl/ProduceTransactionsHandler.java +++ b/opendaylight/md-sal/samples/clustering-test-app/provider/src/main/java/org/opendaylight/controller/clustering/it/provider/impl/ProduceTransactionsHandler.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.HashSet; 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.mdsal.common.api.LogicalDatastoreType; import org.opendaylight.mdsal.common.api.TransactionCommitFailedException; import org.opendaylight.mdsal.dom.api.DOMDataTreeCursorAwareTransaction; @@ -40,6 +40,7 @@ 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.NodeIdentifierWithPredicates; 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; @@ -54,17 +55,19 @@ public class ProduceTransactionsHandler implements Runnable { //2^20 as in the model private static final int MAX_ITEM = 1048576; - private static final QName ID_INTS = + 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 = + static final QName ID_INT = + QName.create("tag:opendaylight.org,2017:controller:yang:lowlevel:target", "2017-02-15", "id-int"); + static final QName ID = QName.create("tag:opendaylight.org,2017:controller:yang:lowlevel:target", "2017-02-15", "id"); - private static final QName ITEM = + static final QName ITEM = QName.create("tag:opendaylight.org,2017:controller:yang:lowlevel:target", "2017-02-15", "item"); private static final QName NUMBER = QName.create("tag:opendaylight.org,2017:controller:yang:lowlevel:target", "2017-02-15", "number"); - private final YangInstanceIdentifier ID_INTS_YID = - YangInstanceIdentifier.create(new YangInstanceIdentifier.NodeIdentifier(ID_INTS)); + 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 DOMDataTreeService domDataTreeService; @@ -84,8 +87,8 @@ public class ProduceTransactionsHandler implements Runnable { private long insertTx = 0; private long deleteTx = 0; private ScheduledFuture scheduledFuture; - private YangInstanceIdentifier idListWithKey; private DOMDataTreeProducer itemProducer; + private YangInstanceIdentifier idListWithKey; public ProduceTransactionsHandler(final DOMDataTreeService domDataTreeService, final ProduceTransactionsInput input) { @@ -107,58 +110,16 @@ public class ProduceTransactionsHandler implements Runnable { } public void start(final SettableFuture> settableFuture) { + completionFuture = settableFuture; - if (ensureListExists(completionFuture) && fillInitialList(completionFuture)) { + if (fillInitialList(completionFuture)) { startTime = System.nanoTime(); - completionFuture = settableFuture; scheduledFuture = executor.scheduleAtFixedRate(this, 0, delay, TimeUnit.NANOSECONDS); } else { executor.shutdown(); } } - private boolean ensureListExists(final SettableFuture> settableFuture) { - - final MapEntryNode entry = ImmutableNodes.mapEntryBuilder(ID_INTS, ID, id) - .withChild(ImmutableNodes.mapNodeBuilder(ITEM).build()) - .build(); - final MapNode mapNode = - ImmutableNodes.mapNodeBuilder(ID_INTS) - .withChild(entry) - .build(); - - final DOMDataTreeProducer producer = domDataTreeService.createProducer(Collections.singleton( - new DOMDataTreeIdentifier(LogicalDatastoreType.CONFIGURATION, YangInstanceIdentifier.EMPTY))); - - final DOMDataTreeCursorAwareTransaction tx = producer.createTransaction(false); - - final DOMDataTreeWriteCursor cursor = - tx.createCursor(new DOMDataTreeIdentifier( - LogicalDatastoreType.CONFIGURATION, YangInstanceIdentifier.EMPTY)); - - idListWithKey = ID_INTS_YID.node(entry.getIdentifier()); - - cursor.merge(mapNode.getIdentifier(), mapNode); - cursor.close(); - - try { - tx.submit().checkedGet(); - } catch (TransactionCommitFailedException e) { - LOG.warn("Unable to ensure IdInts list for id: {} exists.", id, e); - settableFuture.set(RpcResultBuilder.failed() - .withError(RpcError.ErrorType.APPLICATION, "Unexpected-exception", e).build()); - return false; - } finally { - try { - producer.close(); - } catch (DOMDataTreeProducerException e) { - LOG.warn("Error while closing producer.", e); - } - } - - return true; - } - private boolean fillInitialList(final SettableFuture> settableFuture) { LOG.debug("Filling the item list with initial values."); @@ -168,6 +129,8 @@ public class ProduceTransactionsHandler implements Runnable { mapBuilder.withChild(ImmutableNodes.mapEntry(ITEM, NUMBER, i)); } + idListWithKey = ID_INT_YID.node(new NodeIdentifierWithPredicates(ID_INT, ID, id)); + itemProducer = domDataTreeService.createProducer( Collections.singleton(new DOMDataTreeIdentifier(LogicalDatastoreType.CONFIGURATION, idListWithKey))); @@ -195,7 +158,7 @@ public class ProduceTransactionsHandler implements Runnable { final int i = random.nextInt(MAX_ITEM + 1); final YangInstanceIdentifier entryId = - idListWithKey.node(ITEM).node(new YangInstanceIdentifier.NodeIdentifierWithPredicates(ITEM, NUMBER, i)); + idListWithKey.node(ITEM).node(new NodeIdentifierWithPredicates(ITEM, NUMBER, i)); final DOMDataTreeCursorAwareTransaction tx = itemProducer.createTransaction(false); final DOMDataTreeWriteCursor cursor = tx.createCursor( @@ -228,32 +191,35 @@ public class ProduceTransactionsHandler 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 { + allFutures.get(30, TimeUnit.SECONDS); - final ProduceTransactionsOutput output = new ProduceTransactionsOutputBuilder() - .setAllTx(allTx) - .setInsertTx(insertTx) - .setDeleteTx(deleteTx) - .build(); + LOG.debug("All futures completed successfully."); - completionFuture.set(RpcResultBuilder.success() - .withResult(output).build()); + final ProduceTransactionsOutput output = new ProduceTransactionsOutputBuilder() + .setAllTx(allTx) + .setInsertTx(insertTx) + .setDeleteTx(deleteTx) + .build(); - executor.shutdown(); - } - @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()); + completionFuture.set(RpcResultBuilder.success() + .withResult(output).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(); + } finally { + try { + itemProducer.close(); + } catch (final DOMDataTreeProducerException e) { + LOG.warn("Failure while closing item producer.", e); } - }); + } } } }