From 3718d0d47970c2ebe50df1ce1a46f042c44b0f86 Mon Sep 17 00:00:00 2001 From: marta-lokhova Date: Wed, 31 Jul 2024 14:29:41 -0700 Subject: [PATCH] Harden handling of tx size upgrades in herder and add tests --- src/herder/HerderImpl.cpp | 6 +++--- src/herder/test/HerderTests.cpp | 21 +++++++++++++++++++-- 2 files changed, 22 insertions(+), 5 deletions(-) diff --git a/src/herder/HerderImpl.cpp b/src/herder/HerderImpl.cpp index 559f663e95..f437142331 100644 --- a/src/herder/HerderImpl.cpp +++ b/src/herder/HerderImpl.cpp @@ -355,9 +355,6 @@ HerderImpl::processExternalized(uint64 slotIndex, StellarValue const& value, } mLedgerManager.valueExternalized(ledgerData); - - // Ensure potential upgrades are handled in overlay - maybeHandleUpgrade(); } void @@ -1099,6 +1096,9 @@ HerderImpl::lastClosedLedgerIncreased(bool latest) maybeSetupSorobanQueue( mLedgerManager.getLastClosedLedgerHeader().header.ledgerVersion); + // Ensure potential upgrades are handled in overlay + maybeHandleUpgrade(); + if (latest) { releaseAssert(isTracking()); diff --git a/src/herder/test/HerderTests.cpp b/src/herder/test/HerderTests.cpp index cd90618d08..94612051f3 100644 --- a/src/herder/test/HerderTests.cpp +++ b/src/herder/test/HerderTests.cpp @@ -3797,8 +3797,10 @@ setupUpgradeAtNextLedger(Application& app) ConfigUpgradeSetFrameConstPtr configUpgradeSet; ConfigUpgradeSet configUpgradeSetXdr; auto& configEntry = configUpgradeSetXdr.updatedEntry.emplace_back(); - configEntry.configSettingID(CONFIG_SETTING_CONTRACT_HISTORICAL_DATA_V0); - configEntry.contractHistoricalData().feeHistorical1KB = 1234; + configEntry.configSettingID(CONFIG_SETTING_CONTRACT_BANDWIDTH_V0); + configEntry.contractBandwidth().ledgerMaxTxsSizeBytes = 1'000'000; + configEntry.contractBandwidth().txMaxSizeBytes = 500'000; + configUpgradeSet = makeConfigUpgradeSet(ltx, configUpgradeSetXdr); scheduledUpgrades.mConfigUpgradeSetKey = configUpgradeSet->getKey(); @@ -4016,6 +4018,14 @@ herderExternalizesValuesWithProtocol(uint32_t version) // Ensure C processes future tx set and its fees correctly (even though // its own ledger state isn't upgraded yet) receiveLedger(fourth, herderC); + if (protocolVersionStartsFrom(version, SOROBAN_PROTOCOL_VERSION)) + { + REQUIRE(herderA.getMaxTxSize() == + 500'000 + herderA.getFlowControlExtraBuffer()); + REQUIRE(herderB.getMaxTxSize() == + 500'000 + herderB.getFlowControlExtraBuffer()); + REQUIRE(herderC.getMaxTxSize() < herderA.getMaxTxSize()); + } // Wait until C goes out of sync, and processes future slots simulation->crankUntil([&]() { return !lmC.isSynced(); }, @@ -4074,6 +4084,13 @@ herderExternalizesValuesWithProtocol(uint32_t version) auto lcl = lmC.getLastClosedLedgerNum(); REQUIRE(lcl == herderC.trackingConsensusLedgerIndex()); + // C properly upgraded max tx size despite externalizing out-of-order + if (protocolVersionStartsFrom(version, SOROBAN_PROTOCOL_VERSION)) + { + REQUIRE(herderC.getMaxTxSize() == + 500'000 + herderC.getFlowControlExtraBuffer()); + } + // Ensure that C sent out a nomination message for the next consensus // round simulation->crankUntil(