Skip to content

Commit 27b4efe

Browse files
committed
Sequencer - Added sorting by ftx number before adding to the pool
1 parent 376d972 commit 27b4efe

File tree

2 files changed

+40
-0
lines changed

2 files changed

+40
-0
lines changed

besu-plugins/linea-sequencer/sequencer/src/main/java/net/consensys/linea/rpc/methods/LineaSendForcedRawTransaction.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
import com.fasterxml.jackson.annotation.JsonInclude;
1313
import com.fasterxml.jackson.annotation.JsonProperty;
1414
import java.util.ArrayList;
15+
import java.util.Comparator;
1516
import java.util.HashSet;
1617
import java.util.List;
1718
import java.util.Set;
@@ -169,6 +170,8 @@ public List<ForcedTransactionResponse> execute(final PluginRpcRequest request) {
169170
}
170171

171172
if (!forcedTransactions.isEmpty()) {
173+
forcedTransactions.sort(
174+
Comparator.comparingLong(ForcedTransaction::forcedTransactionNumber));
172175
forcedTransactionPoolService.addForcedTransactions(forcedTransactions);
173176
}
174177

besu-plugins/linea-sequencer/sequencer/src/test/java/net/consensys/linea/rpc/methods/LineaSendForcedRawTransactionTest.java

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,15 +13,18 @@
1313
import static org.mockito.ArgumentMatchers.anyList;
1414
import static org.mockito.Mockito.doAnswer;
1515
import static org.mockito.Mockito.mock;
16+
import static org.mockito.Mockito.verify;
1617
import static org.mockito.Mockito.when;
1718

19+
import java.util.ArrayList;
1820
import java.util.List;
1921
import java.util.concurrent.CountDownLatch;
2022
import java.util.concurrent.ExecutorService;
2123
import java.util.concurrent.Executors;
2224
import java.util.concurrent.Future;
2325
import java.util.concurrent.TimeUnit;
2426
import net.consensys.linea.rpc.methods.LineaSendForcedRawTransaction.ForcedTransactionResponse;
27+
import net.consensys.linea.sequencer.forced.ForcedTransaction;
2528
import net.consensys.linea.sequencer.forced.ForcedTransactionPoolService;
2629
import net.consensys.linea.sequencer.forced.LineaForcedTransactionPool;
2730
import net.consensys.linea.utils.TestTransactionFactory;
@@ -241,6 +244,40 @@ void execute_partialSuccessWhenMiddleTransactionFails() {
241244
assertThat(pool.pendingCount()).isEqualTo(2);
242245
}
243246

247+
@Test
248+
void execute_sortsTransactionsByForcedTransactionNumberBeforeAddingToPool() {
249+
final List<ForcedTransaction> capturedTransactions = new ArrayList<>();
250+
final ForcedTransactionPoolService mockPool = mock(ForcedTransactionPoolService.class);
251+
doAnswer(
252+
invocation -> {
253+
capturedTransactions.addAll(invocation.getArgument(0));
254+
return null;
255+
})
256+
.when(mockPool)
257+
.addForcedTransactions(anyList());
258+
259+
final LineaSendForcedRawTransaction methodWithMock =
260+
new LineaSendForcedRawTransaction().init(mockPool);
261+
262+
final Transaction tx1 = txFactory.createTransaction();
263+
final Transaction tx2 = txFactory.createTransaction();
264+
final Transaction tx3 = txFactory.createTransaction();
265+
266+
// Submit transactions out of order: 9, 5, 7
267+
methodWithMock.execute(
268+
request(
269+
new ForcedTxParam(9L, TestTransactionFactory.encodeTransaction(tx1), "0x1000"),
270+
new ForcedTxParam(5L, TestTransactionFactory.encodeTransaction(tx2), "0x2000"),
271+
new ForcedTxParam(7L, TestTransactionFactory.encodeTransaction(tx3), "0x3000")));
272+
273+
verify(mockPool).addForcedTransactions(anyList());
274+
assertThat(capturedTransactions).hasSize(3);
275+
// Verify they are sorted by forcedTransactionNumber: 5, 7, 9
276+
assertThat(capturedTransactions.get(0).forcedTransactionNumber()).isEqualTo(5L);
277+
assertThat(capturedTransactions.get(1).forcedTransactionNumber()).isEqualTo(7L);
278+
assertThat(capturedTransactions.get(2).forcedTransactionNumber()).isEqualTo(9L);
279+
}
280+
244281
@Test
245282
void execute_rejectsConcurrentRequests() throws Exception {
246283
// Use a mock pool that blocks to simulate slow processing

0 commit comments

Comments
 (0)