From ccc8c4dbe82454fae0eae9e43f14cc115f1e372c Mon Sep 17 00:00:00 2001 From: Robert Varga Date: Fri, 6 Dec 2019 14:53:44 +0100 Subject: [PATCH] Fix transaction replay logic After adding disambiguation (previous patch), it clear there is a day-0 Obi-Wan bug in the code, which would cause the last command to not be replayed. Looking at the pending queue, if the transaction failing is second, the second and third transactions should be replayed, not just the second. JIRA: OVSDB-428 Change-Id: Ifbdf5ba8bad5be6103e4666d95afd615ae7d1ab9 Signed-off-by: Robert Varga --- .../md/TransactionInvokerImpl.java | 4 +-- .../md/TransactionInvokerImplTest.java | 30 ++++++++++--------- 2 files changed, 17 insertions(+), 17 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 72ab103a5..1bd39f7eb 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 @@ -163,9 +163,7 @@ public class TransactionInvokerImpl implements TransactionInvoker,TransactionCha List commands = new ArrayList<>(); if (transaction != null) { int index = pendingTransactions.lastIndexOf(transaction); - List transactions = - pendingTransactions.subList(index, pendingTransactions.size() - 1); - for (ReadWriteTransaction tx: transactions) { + for (ReadWriteTransaction tx : pendingTransactions.subList(index, pendingTransactions.size())) { commands.add(transactionToCommand.get(tx)); } resetTransactionQueue(); 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 1196679a2..64b97551d 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 @@ -17,6 +17,7 @@ import static org.mockito.Mockito.mock; import static org.mockito.Mockito.verify; import static org.powermock.reflect.Whitebox.getInternalState; +import com.google.common.collect.ImmutableList; import java.util.ArrayList; import java.util.Collections; import java.util.HashMap; @@ -81,25 +82,26 @@ public class TransactionInvokerImplTest { @Test public void testExtractResubmitCommands() { - final ReadWriteTransaction transaction = mock(ReadWriteTransaction.class); final ReadWriteTransaction tx1 = mock(ReadWriteTransaction.class); final ReadWriteTransaction tx2 = mock(ReadWriteTransaction.class); - - final List pendingTransactions = new ArrayList<>(); - pendingTransactions.add(tx1); - pendingTransactions.add(transaction); - pendingTransactions.add(tx2); + final ReadWriteTransaction tx3 = mock(ReadWriteTransaction.class); final Map transactionToCommand = new HashMap<>(); - final TransactionCommand txCommand = mock(TransactionCommand.class); transactionToCommand.put(tx1, mock(TransactionCommand.class)); - transactionToCommand.put(tx2, mock(TransactionCommand.class)); - transactionToCommand.put(transaction, txCommand); - - final TransactionInvokerImpl invoker = new TransactionInvokerImpl(db, pendingTransactions, - Collections.singletonList(transaction), transactionToCommand); - - assertEquals(Collections.singletonList(txCommand), invoker.extractResubmitCommands()); + final TransactionCommand cmd2 = mock(TransactionCommand.class); + transactionToCommand.put(tx2, cmd2); + final TransactionCommand cmd3 = mock(TransactionCommand.class); + transactionToCommand.put(tx3, cmd3); + + final TransactionInvokerImpl invoker = new TransactionInvokerImpl(db, + // Given pending transaction order ... + ImmutableList.of(tx1, tx2, tx3), + // .. if tx2 fails ... + Collections.singletonList(tx2), + transactionToCommand); + + // .. we want to replay tx2 and tx3 + assertEquals(ImmutableList.of(cmd2, cmd3), invoker.extractResubmitCommands()); } @Test -- 2.36.6