From f3225736fa511575ddc754d15b0bd2e6e36f1a82 Mon Sep 17 00:00:00 2001 From: Tomas Cere Date: Fri, 5 May 2017 12:11:17 +0200 Subject: [PATCH] Make the last submit timeout after 30 seconds The low level test was waiting indefinetly for submits to finish, change this to block and timeout after one minute in case there's an unrecoverable failure on the backend which doesnt propagate to the frontend. Change-Id: I3df2465b56c701c88341ab6cc7fa37a015f1c893 Signed-off-by: Tomas Cere --- .../impl/ProduceTransactionsHandler.java | 54 +++++++++---------- .../impl/WriteTransactionsHandler.java | 43 +++++++-------- 2 files changed, 43 insertions(+), 54 deletions(-) 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 8aa2dfb03a..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,14 +40,11 @@ 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.YangInstanceIdentifier.NodeIdentifierWithPredicates; -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; @@ -194,38 +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."); - try { - itemProducer.close(); - } catch (final DOMDataTreeProducerException e) { - LOG.warn("Failure while closing item producer.", e); - } + final ProduceTransactionsOutput output = new ProduceTransactionsOutputBuilder() + .setAllTx(allTx) + .setInsertTx(insertTx) + .setDeleteTx(deleteTx) + .build(); - completionFuture.set(RpcResultBuilder.success() - .withResult(output).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(); + } finally { + try { + itemProducer.close(); + } catch (final DOMDataTreeProducerException e) { + LOG.warn("Failure while closing item producer.", e); } - }); + } } } } 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 a6f687b5b6..e4236abc7b 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; @@ -47,7 +47,6 @@ 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.api.DataContainerNodeAttrBuilder; import org.opendaylight.yangtools.yang.data.impl.schema.builder.impl.ImmutableContainerNodeBuilder; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -234,32 +233,28 @@ 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 { + allFutures.get(30, 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(); + } } } -- 2.36.6