From 0dce35c93f74283e6e3ac6ba778314ba9b328073 Mon Sep 17 00:00:00 2001 From: Robert Varga Date: Thu, 5 Dec 2019 22:41:22 +0100 Subject: [PATCH] Use ArrayDeque for TransactionInvokerImpl.pendingTransactions Rework the copy logic to operate on pure Iterator, disconnecting us from the List API. This makes the choice of interface/implementation a much broader one -- and pick Queue/ArrayDeque. It is a much better structure for the job at hand. JIRA: OVSDB-428 Change-Id: I22a4da6f4194d10e0932470bf2054441a9c1d3c1 Signed-off-by: Robert Varga --- .../md/TransactionInvokerImpl.java | 19 +++++++++++++++---- .../md/TransactionInvokerImplTest.java | 3 +-- 2 files changed, 16 insertions(+), 6 deletions(-) diff --git a/southbound/southbound-impl/src/main/java/org/opendaylight/ovsdb/southbound/transactions/md/TransactionInvokerImpl.java b/southbound/southbound-impl/src/main/java/org/opendaylight/ovsdb/southbound/transactions/md/TransactionInvokerImpl.java index 1bd39f7eb..4c78ecefd 100644 --- a/southbound/southbound-impl/src/main/java/org/opendaylight/ovsdb/southbound/transactions/md/TransactionInvokerImpl.java +++ b/southbound/southbound-impl/src/main/java/org/opendaylight/ovsdb/southbound/transactions/md/TransactionInvokerImpl.java @@ -12,11 +12,14 @@ import com.google.common.util.concurrent.FutureCallback; import com.google.common.util.concurrent.Futures; import com.google.common.util.concurrent.MoreExecutors; import com.google.common.util.concurrent.ThreadFactoryBuilder; +import java.util.ArrayDeque; import java.util.ArrayList; import java.util.Collections; import java.util.HashMap; +import java.util.Iterator; import java.util.List; import java.util.Map; +import java.util.Queue; import java.util.concurrent.BlockingQueue; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; @@ -48,7 +51,7 @@ public class TransactionInvokerImpl implements TransactionInvoker,TransactionCha @GuardedBy("this") private final Map transactionToCommand = new HashMap<>(); @GuardedBy("this") - private final List pendingTransactions = new ArrayList<>(); + private final Queue pendingTransactions = new ArrayDeque<>(); private BindingTransactionChain chain; @@ -162,10 +165,18 @@ public class TransactionInvokerImpl implements TransactionInvoker,TransactionCha AsyncTransaction transaction = failedTransactionQueue.poll(); List commands = new ArrayList<>(); if (transaction != null) { - int index = pendingTransactions.lastIndexOf(transaction); - for (ReadWriteTransaction tx : pendingTransactions.subList(index, pendingTransactions.size())) { - commands.add(transactionToCommand.get(tx)); + // Process all pending transactions, looking for the failed one... + final Iterator it = pendingTransactions.iterator(); + while (it.hasNext()) { + final ReadWriteTransaction current = it.next(); + if (transaction.equals(current)) { + // .. collect current and all remaining pending transactions + commands.add(transactionToCommand.get(current)); + it.forEachRemaining(tx -> commands.add(transactionToCommand.get(tx))); + break; + } } + resetTransactionQueue(); } return commands; diff --git a/southbound/southbound-impl/src/test/java/org/opendaylight/ovsdb/southbound/transactions/md/TransactionInvokerImplTest.java b/southbound/southbound-impl/src/test/java/org/opendaylight/ovsdb/southbound/transactions/md/TransactionInvokerImplTest.java index 64b97551d..06a52f760 100644 --- a/southbound/southbound-impl/src/test/java/org/opendaylight/ovsdb/southbound/transactions/md/TransactionInvokerImplTest.java +++ b/southbound/southbound-impl/src/test/java/org/opendaylight/ovsdb/southbound/transactions/md/TransactionInvokerImplTest.java @@ -21,7 +21,6 @@ import com.google.common.collect.ImmutableList; import java.util.ArrayList; import java.util.Collections; import java.util.HashMap; -import java.util.List; import java.util.Map; import java.util.Queue; import java.util.concurrent.ExecutorService; @@ -125,7 +124,7 @@ public class TransactionInvokerImplTest { final ReadWriteTransaction transaction = mock(ReadWriteTransaction.class); invoker.recordPendingTransaction(command, transaction); - List testPendingTransactions = getInternalState(invoker, "pendingTransactions"); + Queue testPendingTransactions = getInternalState(invoker, "pendingTransactions"); assertEquals(1, testPendingTransactions.size()); assertTrue(testPendingTransactions.contains(transaction)); -- 2.36.6