-
Notifications
You must be signed in to change notification settings - Fork 1.1k
Add test to check that TX selection doesn't prioritize TXs from the same sender #6022
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Changes from 7 commits
c474dea
ee7a66f
4199ec6
3ae0747
20ad749
cc214ce
6600b49
439a0ec
4d0d375
540ef39
3aefab8
f7cba5d
42f9fcb
2d5b16f
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change | ||||
|---|---|---|---|---|---|---|
|
|
@@ -188,6 +188,8 @@ tx-pool-max-future-by-sender=321 | |||||
| tx-pool-retention-hours=999 | ||||||
| tx-pool-max-size=1234 | ||||||
| tx-pool-limit-by-account-percentage=0.017 | ||||||
| ## Experimental | ||||||
| Xtx-pool-disable-sender-grouping=false | ||||||
|
Contributor
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
Suggested change
Contributor
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. removed since, only stable options are listed here |
||||||
|
|
||||||
| # Revert Reason | ||||||
| revert-reason-enabled=false | ||||||
|
|
||||||
| Original file line number | Diff line number | Diff line change |
|---|---|---|
|
|
@@ -65,6 +65,7 @@ | |
| public abstract class AbstractPendingTransactionsTestBase { | ||
|
|
||
| protected static final int MAX_TRANSACTIONS = 5; | ||
| protected static final int MAX_TRANSACTIONS_LARGE_POOL = 15; | ||
| private static final float LIMITED_TRANSACTIONS_BY_SENDER_PERCENTAGE = 0.8f; | ||
| protected static final Supplier<SignatureAlgorithm> SIGNATURE_ALGORITHM = | ||
| Suppliers.memoize(SignatureAlgorithmFactory::getInstance); | ||
|
|
@@ -93,9 +94,33 @@ public abstract class AbstractPendingTransactionsTestBase { | |
| .build(); | ||
| protected PendingTransactions senderLimitedTransactions = | ||
| getPendingTransactions(senderLimitedConfig, Optional.empty()); | ||
| protected AbstractPendingTransactionsSorter transactionsLarge = | ||
| getPendingTransactions( | ||
| ImmutableTransactionPoolConfiguration.builder() | ||
| .txPoolMaxSize(MAX_TRANSACTIONS_LARGE_POOL) | ||
| .txPoolLimitByAccountPercentage(Fraction.fromFloat(1.0f)) | ||
| .build(), | ||
| Optional.empty()); | ||
|
|
||
| protected AbstractPendingTransactionsSorter transactionsLargeNoSenderGrouping = | ||
| getPendingTransactions( | ||
| ImmutableTransactionPoolConfiguration.builder() | ||
| .txPoolMaxSize(MAX_TRANSACTIONS_LARGE_POOL) | ||
| .txPoolLimitByAccountPercentage(Fraction.fromFloat(1.0f)) | ||
| .unstable( | ||
| ImmutableTransactionPoolConfiguration.Unstable.builder() | ||
| .disableSenderTXGrouping(true) | ||
| .build()) | ||
| .build(), | ||
| Optional.empty()); | ||
|
|
||
| protected final Transaction transaction1 = createTransaction(2); | ||
| protected final Transaction transaction2 = createTransaction(1); | ||
| protected final Transaction transaction3 = createTransaction(3); | ||
|
|
||
| protected final Transaction transaction1Sdr2 = createTransactionSender2(1); | ||
| protected final Transaction transaction2Sdr2 = createTransactionSender2(2); | ||
| protected final Transaction transaction3Sdr2 = createTransactionSender2(3); | ||
|
|
||
| protected final PendingTransactionAddedListener listener = | ||
| mock(PendingTransactionAddedListener.class); | ||
|
|
@@ -109,6 +134,7 @@ abstract AbstractPendingTransactionsSorter getPendingTransactions( | |
|
|
||
| @Test | ||
| public void shouldReturnExclusivelyLocalTransactionsWhenAppropriate() { | ||
|
|
||
| final Transaction localTransaction0 = createTransaction(0); | ||
| transactions.addTransaction(createLocalPendingTransaction(localTransaction0), Optional.empty()); | ||
| assertThat(transactions.size()).isEqualTo(1); | ||
|
|
@@ -320,6 +346,104 @@ public void shouldNotNotifyDroppedListenerWhenTransactionAddedToBlock() { | |
| verifyNoInteractions(droppedListener); | ||
| } | ||
|
|
||
| @Test | ||
| public void selectTransactionsInDefaultOrder() { | ||
| assertThat( | ||
| transactionsLarge.addTransaction( | ||
| createRemotePendingTransaction(transaction1), Optional.empty())) | ||
| .isEqualTo(ADDED); | ||
| assertThat( | ||
| transactionsLarge.addTransaction( | ||
| createRemotePendingTransaction(transaction2), Optional.empty())) | ||
| .isEqualTo(ADDED); | ||
| assertThat( | ||
| transactionsLarge.addTransaction( | ||
| createRemotePendingTransaction(transaction1Sdr2), Optional.empty())) | ||
| .isEqualTo(ADDED); | ||
| assertThat( | ||
| transactionsLarge.addTransaction( | ||
| createRemotePendingTransaction(transaction2Sdr2), Optional.empty())) | ||
| .isEqualTo(ADDED); | ||
| assertThat( | ||
| transactionsLarge.addTransaction( | ||
| createRemotePendingTransaction(transaction3Sdr2), Optional.empty())) | ||
| .isEqualTo(ADDED); | ||
| assertThat( | ||
| transactionsLarge.addTransaction( | ||
| createRemotePendingTransaction(transaction3), Optional.empty())) | ||
| .isEqualTo(ADDED); | ||
|
|
||
| final List<Transaction> parsedTransactions = Lists.newArrayList(); | ||
| transactionsLarge.selectTransactions( | ||
| pendingTx -> { | ||
| parsedTransactions.add(pendingTx.getTransaction()); | ||
|
|
||
| if (parsedTransactions.size() == 6) { | ||
| return TransactionSelectionResult.BLOCK_OCCUPANCY_ABOVE_THRESHOLD; | ||
| } | ||
| return SELECTED; | ||
| }); | ||
|
|
||
| assertThat(parsedTransactions.size()).isEqualTo(6); | ||
|
|
||
| assertThat(parsedTransactions.get(0)).isEqualTo(transaction1Sdr2); | ||
| assertThat(parsedTransactions.get(1)).isEqualTo(transaction2Sdr2); | ||
| assertThat(parsedTransactions.get(2)).isEqualTo(transaction3Sdr2); | ||
| assertThat(parsedTransactions.get(3)) | ||
| .isEqualTo(transaction2); // Transaction 2 is actually the lowest nonce for this sender | ||
|
Contributor
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. since the name of the tx is misleading with its nonce, you could consider to rename
Contributor
Author
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Fixed |
||
| assertThat(parsedTransactions.get(4)) | ||
| .isEqualTo(transaction1); // Transaction 1 is the next nonce for the sender | ||
| assertThat(parsedTransactions.get(5)) | ||
| .isEqualTo(transaction3); // Transaction 3 is the next nonce for the sender | ||
| } | ||
|
|
||
| @Test | ||
| public void selectTransactionsInOrderNoGroupBySender() { | ||
| assertThat( | ||
| transactionsLargeNoSenderGrouping.addTransaction( | ||
| createRemotePendingTransaction(transaction2), Optional.empty())) | ||
| .isEqualTo(ADDED); | ||
| assertThat( | ||
| transactionsLargeNoSenderGrouping.addTransaction( | ||
| createRemotePendingTransaction(transaction1Sdr2), Optional.empty())) | ||
| .isEqualTo(ADDED); | ||
| assertThat( | ||
| transactionsLargeNoSenderGrouping.addTransaction( | ||
| createRemotePendingTransaction(transaction2Sdr2), Optional.empty())) | ||
| .isEqualTo(ADDED); | ||
| assertThat( | ||
| transactionsLargeNoSenderGrouping.addTransaction( | ||
| createRemotePendingTransaction(transaction1), Optional.empty())) | ||
| .isEqualTo(ADDED); | ||
| assertThat( | ||
| transactionsLargeNoSenderGrouping.addTransaction( | ||
| createRemotePendingTransaction(transaction3Sdr2), Optional.empty())) | ||
| .isEqualTo(ADDED); | ||
| assertThat( | ||
| transactionsLargeNoSenderGrouping.addTransaction( | ||
| createRemotePendingTransaction(transaction3), Optional.empty())) | ||
| .isEqualTo(ADDED); | ||
|
|
||
| final List<Transaction> parsedTransactions = Lists.newArrayList(); | ||
| transactionsLargeNoSenderGrouping.selectTransactions( | ||
| pendingTx -> { | ||
| parsedTransactions.add(pendingTx.getTransaction()); | ||
|
|
||
| if (parsedTransactions.size() == 6) { | ||
| return TransactionSelectionResult.BLOCK_OCCUPANCY_ABOVE_THRESHOLD; | ||
| } | ||
| return SELECTED; | ||
| }); | ||
|
|
||
| assertThat(parsedTransactions.size()).isEqualTo(6); | ||
|
|
||
| // Check that by setting --tx-pool-disable-sender-grouping=true then sdr 1 hasn't monopolized | ||
| // the pool selection just because its transaction (transaction 3) is the first one to be parsed | ||
| // by the selector | ||
| assertThat(parsedTransactions.get(0)).isEqualTo(transaction1Sdr2); | ||
| assertThat(parsedTransactions.get(1)).isEqualTo(transaction2); | ||
|
matthew1001 marked this conversation as resolved.
Outdated
|
||
| } | ||
|
|
||
| @Test | ||
| public void selectTransactionsUntilSelectorRequestsNoMore() { | ||
| transactions.addTransaction(createRemotePendingTransaction(transaction1), Optional.empty()); | ||
|
|
@@ -489,6 +613,10 @@ public void shouldReplaceTransactionWithSameSenderAndNonce_multipleReplacements( | |
| transactions.addTransaction( | ||
| createRemotePendingTransaction(independentTx), Optional.empty())) | ||
| .isEqualTo(ADDED); | ||
| assertThat( | ||
|
matthew1001 marked this conversation as resolved.
Outdated
|
||
| transactions.addTransaction( | ||
| createRemotePendingTransaction(independentTx), Optional.empty())) | ||
| .isEqualTo(ADDED); | ||
|
|
||
| // All tx's except the last duplicate should be removed | ||
| replacedTransactions.forEach(this::assertTransactionNotPending); | ||
|
|
@@ -659,9 +787,18 @@ protected Transaction createTransaction(final long transactionNumber) { | |
| return new TransactionTestFixture() | ||
| .value(Wei.of(transactionNumber)) | ||
| .nonce(transactionNumber) | ||
| .gasPrice(Wei.of(0)) | ||
| .createTransaction(KEYS1); | ||
| } | ||
|
|
||
| protected Transaction createTransactionSender2(final long transactionNumber) { | ||
| return new TransactionTestFixture() | ||
| .value(Wei.of(transactionNumber)) | ||
| .nonce(transactionNumber) | ||
| .gasPrice(Wei.of(0)) | ||
| .createTransaction(KEYS2); | ||
| } | ||
|
|
||
| private PendingTransaction createRemotePendingTransaction( | ||
| final Transaction transaction, final long addedAt) { | ||
| return PendingTransaction.newPendingTransaction(transaction, false, false, addedAt); | ||
|
|
||
Uh oh!
There was an error while loading. Please reload this page.