diff --git a/src/overlay/FlowControl.cpp b/src/overlay/FlowControl.cpp index 9623cd3b86..0f5288bf30 100644 --- a/src/overlay/FlowControl.cpp +++ b/src/overlay/FlowControl.cpp @@ -468,8 +468,16 @@ FlowControl::addMsgAndMaybeTrimQueue(std::shared_ptr msg) size_t dropped = 0; - uint32_t const limit = - mAppConnector.getLedgerManager().getLastMaxTxSetSizeOps(); + auto& lm = mAppConnector.getLedgerManager(); + 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 db40df590e..a3f8eca446 100644 --- a/src/overlay/TxAdverts.cpp +++ b/src/overlay/TxAdverts.cpp @@ -66,6 +66,22 @@ TxAdverts::startAdvertTimer() }); } +size_t +TxAdverts::getTxLimit() +{ + auto& lm = mApp.getLedgerManager(); + size_t classic = lm.getLastMaxTxSetSizeOps(); + if (protocolVersionStartsFrom( + lm.getLastClosedLedgerHeader().header.ledgerVersion, + SOROBAN_PROTOCOL_VERSION)) + { + + return classic + + lm.getLastClosedSorobanNetworkConfig().ledgerMaxTxCount(); + } + return classic; +} + void TxAdverts::queueOutgoingAdvert(Hash const& txHash) { @@ -108,7 +124,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 +140,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/OverlayTests.cpp b/src/overlay/test/OverlayTests.cpp index e83182ec03..1962db35fe 100644 --- a/src/overlay/test/OverlayTests.cpp +++ b/src/overlay/test/OverlayTests.cpp @@ -938,7 +938,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 +1050,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; 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")