From 4590d81e7c02de94197b825a162411b23ba75634 Mon Sep 17 00:00:00 2001 From: Daniel Rebelsky <4641927+drebelsky@users.noreply.github.com> Date: Tue, 9 Sep 2025 09:50:45 -0700 Subject: [PATCH 1/4] Include Soroban limits in pull-mode calculation --- src/overlay/TxAdverts.cpp | 17 +++++++++++++---- src/overlay/TxAdverts.h | 6 ++++++ src/overlay/test/TxAdvertsTests.cpp | 2 +- 3 files changed, 20 insertions(+), 5 deletions(-) diff --git a/src/overlay/TxAdverts.cpp b/src/overlay/TxAdverts.cpp index db40df590e..aec795d2a8 100644 --- a/src/overlay/TxAdverts.cpp +++ b/src/overlay/TxAdverts.cpp @@ -66,6 +66,14 @@ TxAdverts::startAdvertTimer() }); } +size_t +TxAdverts::getTxLimit() +{ + auto& lm = mApp.getLedgerManager(); + return lm.getLastMaxTxSetSizeOps() + + lm.getLastClosedSorobanNetworkConfig().ledgerMaxTxCount(); +} + void TxAdverts::queueOutgoingAdvert(Hash const& txHash) { @@ -108,7 +116,8 @@ void TxAdverts::retryIncomingAdvert(std::list& list) { mTxHashesToRetry.splice(mTxHashesToRetry.end(), list); - while (size() > mApp.getLedgerManager().getLastMaxTxSetSizeOps()) + size_t const limit = getTxLimit(); + while (size() > limit) { popIncomingAdvert(); } @@ -123,11 +132,11 @@ TxAdverts::queueIncomingAdvert(TxAdvertVector const& txHashes, uint32_t seq) } auto it = txHashes.begin(); - size_t const limit = mApp.getLedgerManager().getLastMaxTxSetSizeOps(); + size_t const limit = getTxLimit(); if (txHashes.size() > limit) { - // If txHashes has more than getLastMaxTxSetSizeOps txns, then - // the first (txHashes.size() - getLastMaxTxSetSizeOps) txns will be + // If txHashes has more than limit txns, then + // the first (txHashes.size() - limit) txns will be // popped in the while loop below. Therefore, we won't even bother // pushing them. it += txHashes.size() - limit; diff --git a/src/overlay/TxAdverts.h b/src/overlay/TxAdverts.h index 9a8490f987..4da5d46731 100644 --- a/src/overlay/TxAdverts.h +++ b/src/overlay/TxAdverts.h @@ -41,6 +41,12 @@ class TxAdverts void rememberHash(Hash const& hash, uint32_t ledgerSeq); void flushAdvert(); void startAdvertTimer(); +#ifdef BUILD_TESTS + public: +#endif + // Get the maximum size for transaction hashes to process, considering both + // Soroban and classic limits + size_t getTxLimit(); public: TxAdverts(Application& app); diff --git a/src/overlay/test/TxAdvertsTests.cpp b/src/overlay/test/TxAdvertsTests.cpp index b28cd4cdb6..c8e270d350 100644 --- a/src/overlay/test/TxAdvertsTests.cpp +++ b/src/overlay/test/TxAdvertsTests.cpp @@ -24,7 +24,7 @@ TEST_CASE("advert queue", "[flood][pullmode][acceptance]") flushed = true; }); - auto limit = app->getLedgerManager().getLastMaxTxSetSizeOps(); + auto limit = pullMode.getTxLimit(); auto getHash = [](auto i) { return sha256(std::to_string(i)); }; SECTION("incoming adverts") From 8b4c41cdbb3d1490abceb30c1816b26338f6c100 Mon Sep 17 00:00:00 2001 From: Daniel Rebelsky <4641927+drebelsky@users.noreply.github.com> Date: Tue, 9 Sep 2025 10:16:13 -0700 Subject: [PATCH 2/4] Include Soroban limits in flood-mode calculation --- src/overlay/FlowControl.cpp | 4 +++- src/overlay/test/OverlayTests.cpp | 11 +++++++++-- 2 files changed, 12 insertions(+), 3 deletions(-) diff --git a/src/overlay/FlowControl.cpp b/src/overlay/FlowControl.cpp index 9623cd3b86..af5a69871e 100644 --- a/src/overlay/FlowControl.cpp +++ b/src/overlay/FlowControl.cpp @@ -468,8 +468,10 @@ FlowControl::addMsgAndMaybeTrimQueue(std::shared_ptr msg) size_t dropped = 0; + auto& lm = mAppConnector.getLedgerManager(); uint32_t const limit = - mAppConnector.getLedgerManager().getLastMaxTxSetSizeOps(); + lm.getLastMaxTxSetSizeOps() + + lm.getLastClosedSorobanNetworkConfig().ledgerMaxTxCount(); auto& om = mOverlayMetrics; if (type == TRANSACTION) { diff --git a/src/overlay/test/OverlayTests.cpp b/src/overlay/test/OverlayTests.cpp index e83182ec03..e3bd4f15f3 100644 --- a/src/overlay/test/OverlayTests.cpp +++ b/src/overlay/test/OverlayTests.cpp @@ -828,6 +828,7 @@ TEST_CASE("peers during auth", "[overlay][connections]") testutil::shutdownWorkScheduler(*app1); } +// TEST_CASE("outbound queue filtering", "[overlay][flowcontrol]") { auto networkID = sha256(getTestConfig().NETWORK_PASSPHRASE); @@ -938,7 +939,10 @@ TEST_CASE("outbound queue filtering", "[overlay][flowcontrol]") } SECTION("txs, limit reached") { - uint32_t limit = node->getLedgerManager().getLastMaxTxSetSizeOps(); + auto& lm = node->getLedgerManager(); + uint32_t limit = + lm.getLastMaxTxSetSizeOps() + + lm.getLastClosedSorobanNetworkConfig().ledgerMaxTxCount(); StellarMessage msg; msg.type(TRANSACTION); auto byteSize = @@ -1047,7 +1051,10 @@ TEST_CASE("outbound queue filtering", "[overlay][flowcontrol]") { // Adverts/demands aren't affected by the byte limit peer->getFlowControl()->setOutboundQueueLimit(1); - uint32_t limit = node->getLedgerManager().getLastMaxTxSetSizeOps(); + auto& lm = node->getLedgerManager(); + uint32_t limit = + lm.getLastMaxTxSetSizeOps() + + lm.getLastClosedSorobanNetworkConfig().ledgerMaxTxCount(); for (uint32_t i = 0; i < limit + 10; ++i) { StellarMessage adv, dem, txn; From a33acb8c4c169efc0c274e5ebc3cff85b9c64cff Mon Sep 17 00:00:00 2001 From: Daniel Rebelsky <4641927+drebelsky@users.noreply.github.com> Date: Tue, 9 Sep 2025 10:29:28 -0700 Subject: [PATCH 3/4] remove extraneous extra line --- src/overlay/test/OverlayTests.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/src/overlay/test/OverlayTests.cpp b/src/overlay/test/OverlayTests.cpp index e3bd4f15f3..1962db35fe 100644 --- a/src/overlay/test/OverlayTests.cpp +++ b/src/overlay/test/OverlayTests.cpp @@ -828,7 +828,6 @@ TEST_CASE("peers during auth", "[overlay][connections]") testutil::shutdownWorkScheduler(*app1); } -// TEST_CASE("outbound queue filtering", "[overlay][flowcontrol]") { auto networkID = sha256(getTestConfig().NETWORK_PASSPHRASE); From 15444851b412e6870e4d4ec4794488c546019f29 Mon Sep 17 00:00:00 2001 From: Daniel Rebelsky <4641927+drebelsky@users.noreply.github.com> Date: Wed, 10 Sep 2025 11:30:35 -0700 Subject: [PATCH 4/4] Handle limits pre Soroban --- src/overlay/FlowControl.cpp | 12 +++++++++--- src/overlay/TxAdverts.cpp | 12 ++++++++++-- 2 files changed, 19 insertions(+), 5 deletions(-) diff --git a/src/overlay/FlowControl.cpp b/src/overlay/FlowControl.cpp index af5a69871e..0f5288bf30 100644 --- a/src/overlay/FlowControl.cpp +++ b/src/overlay/FlowControl.cpp @@ -469,9 +469,15 @@ FlowControl::addMsgAndMaybeTrimQueue(std::shared_ptr msg) size_t dropped = 0; auto& lm = mAppConnector.getLedgerManager(); - uint32_t const limit = - lm.getLastMaxTxSetSizeOps() + - lm.getLastClosedSorobanNetworkConfig().ledgerMaxTxCount(); + uint32_t limit = lm.getLastMaxTxSetSizeOps(); + + if (protocolVersionStartsFrom( + lm.getLastClosedLedgerHeader().header.ledgerVersion, + SOROBAN_PROTOCOL_VERSION)) + { + limit = saturatingAdd( + limit, lm.getLastClosedSorobanNetworkConfig().ledgerMaxTxCount()); + } auto& om = mOverlayMetrics; if (type == TRANSACTION) { diff --git a/src/overlay/TxAdverts.cpp b/src/overlay/TxAdverts.cpp index aec795d2a8..a3f8eca446 100644 --- a/src/overlay/TxAdverts.cpp +++ b/src/overlay/TxAdverts.cpp @@ -70,8 +70,16 @@ size_t TxAdverts::getTxLimit() { auto& lm = mApp.getLedgerManager(); - return lm.getLastMaxTxSetSizeOps() + - lm.getLastClosedSorobanNetworkConfig().ledgerMaxTxCount(); + size_t classic = lm.getLastMaxTxSetSizeOps(); + if (protocolVersionStartsFrom( + lm.getLastClosedLedgerHeader().header.ledgerVersion, + SOROBAN_PROTOCOL_VERSION)) + { + + return classic + + lm.getLastClosedSorobanNetworkConfig().ledgerMaxTxCount(); + } + return classic; } void