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 <tcere@cisco.com>
package org.opendaylight.controller.clustering.it.provider.impl;
import com.google.common.util.concurrent.CheckedFuture;
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;
import com.google.common.util.concurrent.Futures;
import com.google.common.util.concurrent.ListenableFuture;
import com.google.common.util.concurrent.SettableFuture;
import java.util.List;
import java.util.Set;
import java.util.SplittableRandom;
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 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;
import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
import org.opendaylight.mdsal.common.api.TransactionCommitFailedException;
import org.opendaylight.mdsal.dom.api.DOMDataTreeCursorAwareTransaction;
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.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.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.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;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
final ListenableFuture<List<Void>> allFutures = Futures.allAsList(futures);
final ListenableFuture<List<Void>> allFutures = Futures.allAsList(futures);
- Futures.addCallback(allFutures, new FutureCallback<List<Void>>() {
- @Override
- public void onSuccess(@Nullable final List<Void> 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.<ProduceTransactionsOutput>success()
- .withResult(output).build());
- executor.shutdown();
- }
+ completionFuture.set(RpcResultBuilder.<ProduceTransactionsOutput>success()
+ .withResult(output).build());
- @Override
- public void onFailure(final Throwable t) {
- LOG.error("Write transactions failed.", t);
- completionFuture.set(RpcResultBuilder.<ProduceTransactionsOutput>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.<ProduceTransactionsOutput>failed()
+ .withError(RpcError.ErrorType.APPLICATION, "Unexpected-exception", exception).build());
+ executor.shutdown();
+ } finally {
+ try {
+ itemProducer.close();
+ } catch (final DOMDataTreeProducerException e) {
+ LOG.warn("Failure while closing item producer.", e);
package org.opendaylight.controller.clustering.it.provider.impl;
import com.google.common.util.concurrent.CheckedFuture;
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;
import com.google.common.util.concurrent.Futures;
import com.google.common.util.concurrent.ListenableFuture;
import com.google.common.util.concurrent.SettableFuture;
import java.util.List;
import java.util.Set;
import java.util.SplittableRandom;
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 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;
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.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.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;
import org.opendaylight.yangtools.yang.data.impl.schema.builder.impl.ImmutableContainerNodeBuilder;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
final ListenableFuture<List<Void>> allFutures = Futures.allAsList(futures);
final ListenableFuture<List<Void>> allFutures = Futures.allAsList(futures);
- Futures.addCallback(allFutures, new FutureCallback<List<Void>>() {
- @Override
- public void onSuccess(@Nullable final List<Void> 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.<WriteTransactionsOutput>success()
- .withResult(output).build());
+ final WriteTransactionsOutput output = new WriteTransactionsOutputBuilder()
+ .setAllTx(allTx)
+ .setInsertTx(insertTx)
+ .setDeleteTx(deleteTx)
+ .build();
- executor.shutdown();
- }
+ completionFuture.set(RpcResultBuilder.<WriteTransactionsOutput>success()
+ .withResult(output).build());
- @Override
- public void onFailure(final Throwable t) {
- LOG.error("Write transactions failed.", t);
- completionFuture.set(RpcResultBuilder.<WriteTransactionsOutput>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.<WriteTransactionsOutput>failed()
+ .withError(RpcError.ErrorType.APPLICATION, "Unexpected-exception", exception).build());
- executor.shutdown();
- }
- });
+ executor.shutdown();
+ }