From 8ec4415ecd679353a83ffd17493f1fe9592b35ce Mon Sep 17 00:00:00 2001 From: Pedro Novais <1478752+jpnovais@users.noreply.github.com> Date: Mon, 17 Feb 2025 11:16:36 +0000 Subject: [PATCH] staterecovery: add getLogsChunkSize config option --- .../LineaSubmissionEventsClientImpl.kt | 6 +++++- .../kotlin/linea/staterecovery/StateRecoveryApp.kt | 14 ++++++++------ .../plugin/LineaStateRecoveryPlugin.kt | 3 ++- .../linea/staterecovery/plugin/PluginOptions.kt | 13 ++++++++++++- .../ManualTestWithFakeExecutionClient.kt | 2 +- 5 files changed, 28 insertions(+), 10 deletions(-) diff --git a/state-recovery/appcore/logic/src/main/kotlin/linea/staterecovery/LineaSubmissionEventsClientImpl.kt b/state-recovery/appcore/logic/src/main/kotlin/linea/staterecovery/LineaSubmissionEventsClientImpl.kt index a0d800001..99f8149d8 100644 --- a/state-recovery/appcore/logic/src/main/kotlin/linea/staterecovery/LineaSubmissionEventsClientImpl.kt +++ b/state-recovery/appcore/logic/src/main/kotlin/linea/staterecovery/LineaSubmissionEventsClientImpl.kt @@ -14,8 +14,12 @@ class LineaSubmissionEventsClientImpl( private val smartContractAddress: String, private val l1EarliestSearchBlock: BlockParameter = BlockParameter.Tag.EARLIEST, private val l1LatestSearchBlock: BlockParameter = BlockParameter.Tag.FINALIZED, - private val logsBlockChunkSize: Int = 1000 + private val logsBlockChunkSize: Int ) : LineaRollupSubmissionEventsClient { + init { + require(logsBlockChunkSize > 0) { "logsBlockChunkSize=$logsBlockChunkSize must be greater than 0" } + } + private fun findDataFinalizedEventContainingBlock( fromBlock: BlockParameter, l2BlockNumber: ULong diff --git a/state-recovery/appcore/logic/src/main/kotlin/linea/staterecovery/StateRecoveryApp.kt b/state-recovery/appcore/logic/src/main/kotlin/linea/staterecovery/StateRecoveryApp.kt index 0662c2a21..d8ed04486 100644 --- a/state-recovery/appcore/logic/src/main/kotlin/linea/staterecovery/StateRecoveryApp.kt +++ b/state-recovery/appcore/logic/src/main/kotlin/linea/staterecovery/StateRecoveryApp.kt @@ -35,9 +35,9 @@ class StateRecoveryApp( val l1EarliestSearchBlock: BlockParameter = BlockParameter.Tag.EARLIEST, val l1LatestSearchBlock: BlockParameter = BlockParameter.Tag.FINALIZED, val l1PollingInterval: Duration = 12.seconds, + val l1getLogsChunkSize: UInt, val executionClientPollingInterval: Duration = 1.seconds, val blobDecompressorVersion: BlobDecompressorVersion = BlobDecompressorVersion.V1_1_0, - val logsBlockChunkSize: UInt = 1000u, /** * The block number at which the recovery mode will start overriding the recovery start block number * this is meant for testing purposes, not production @@ -51,15 +51,17 @@ class StateRecoveryApp( // TODO: set block of V6 Upgrade l1EarliestSearchBlock = 1UL.toBlockParameter(), l1LatestSearchBlock = BlockParameter.Tag.FINALIZED, - executionClientPollingInterval = 10.seconds, - l1PollingInterval = 12.seconds + l1PollingInterval = 12.seconds, + l1getLogsChunkSize = 10_000u, + executionClientPollingInterval = 10.seconds ) val lineaSepolia = Config( smartContractAddress = "0xb218f8a4bc926cf1ca7b3423c154a0d627bdb7e5", l1EarliestSearchBlock = 7164537UL.toBlockParameter(), l1LatestSearchBlock = BlockParameter.Tag.FINALIZED, - executionClientPollingInterval = 10.seconds, - l1PollingInterval = 12.seconds + l1PollingInterval = 12.seconds, + l1getLogsChunkSize = 10_000u, + executionClientPollingInterval = 10.seconds ) } } @@ -75,7 +77,7 @@ class StateRecoveryApp( smartContractAddress = config.smartContractAddress, l1EarliestSearchBlock = config.l1EarliestSearchBlock, l1LatestSearchBlock = config.l1LatestSearchBlock, - logsBlockChunkSize = config.logsBlockChunkSize.toInt() + logsBlockChunkSize = config.l1getLogsChunkSize.toInt() ) private val log = LogManager.getLogger(this::class.java) private val blockImporterAndStateVerifier = BlockImporterAndStateVerifierV1( diff --git a/state-recovery/besu-plugin/src/main/kotlin/linea/staterecovery/plugin/LineaStateRecoveryPlugin.kt b/state-recovery/besu-plugin/src/main/kotlin/linea/staterecovery/plugin/LineaStateRecoveryPlugin.kt index 7cb961a6f..341ff1596 100644 --- a/state-recovery/besu-plugin/src/main/kotlin/linea/staterecovery/plugin/LineaStateRecoveryPlugin.kt +++ b/state-recovery/besu-plugin/src/main/kotlin/linea/staterecovery/plugin/LineaStateRecoveryPlugin.kt @@ -98,9 +98,10 @@ open class LineaStateRecoveryPlugin : BesuPlugin { blockHeaderStaticFields = blockHeaderStaticFields, appConfig = StateRecoveryApp.Config( smartContractAddress = config.l1SmartContractAddress.toString(), + l1getLogsChunkSize = config.l1GetLogsChunkSize, l1LatestSearchBlock = net.consensys.linea.BlockParameter.Tag.LATEST, - overridingRecoveryStartBlockNumber = config.overridingRecoveryStartBlockNumber, l1PollingInterval = config.l1PollingInterval, + overridingRecoveryStartBlockNumber = config.overridingRecoveryStartBlockNumber, debugForceSyncStopBlockNumber = config.debugForceSyncStopBlockNumber ) ) diff --git a/state-recovery/besu-plugin/src/main/kotlin/linea/staterecovery/plugin/PluginOptions.kt b/state-recovery/besu-plugin/src/main/kotlin/linea/staterecovery/plugin/PluginOptions.kt index f8a0f1a65..749281d41 100644 --- a/state-recovery/besu-plugin/src/main/kotlin/linea/staterecovery/plugin/PluginOptions.kt +++ b/state-recovery/besu-plugin/src/main/kotlin/linea/staterecovery/plugin/PluginOptions.kt @@ -12,6 +12,7 @@ data class PluginConfig( val l1SmartContractAddress: Address, val l1Endpoint: URI, val l1PollingInterval: kotlin.time.Duration, + val l1GetLogsChunkSize: UInt, val l1RequestSuccessBackoffDelay: kotlin.time.Duration, val l1RequestRetryConfig: RetryConfig, val blobscanEndpoint: URI, @@ -63,6 +64,13 @@ class PluginCliOptions { ) var l1PollingInterval: java.time.Duration = java.time.Duration.ofSeconds(12) + @CommandLine.Option( + names = ["--$cliOptionsPrefix-l1-get-logs-chunk-size"], + description = ["Chuck size (fromBlock..toBlock) for eth_getLogs initial search loop. Default is 10_000"], + required = false + ) + var l1GetLogsChunkSize: Int = 10_000 + @CommandLine.Option( names = ["--$cliOptionsPrefix-l1-success-backoff-delay"], description = [ @@ -172,6 +180,7 @@ class PluginCliOptions { l1SmartContractAddress = l1SmartContractAddress, l1Endpoint = l1RpcEndpoint, l1PollingInterval = l1PollingInterval.toKotlinDuration(), + l1GetLogsChunkSize = l1GetLogsChunkSize.toUInt(), l1RequestSuccessBackoffDelay = l1RequestSuccessBackoffDelay?.toKotlinDuration() ?: 1.milliseconds, l1RequestRetryConfig = RetryConfig( backoffDelay = l1RequestRetryBackoffDelay?.toKotlinDuration() ?: 1.milliseconds, @@ -180,7 +189,9 @@ class PluginCliOptions { ), blobscanEndpoint = blobscanEndpoint, blobScanRequestRetryConfig = RetryConfig( - backoffDelay = blobscanRequestRetryBackoffDelay.toKotlinDuration() + backoffDelay = blobscanRequestRetryBackoffDelay.toKotlinDuration(), + timeout = blobscanRequestRetryTimeout?.toKotlinDuration(), + maxRetries = blobscanRequestRetryLimit?.toUInt() ), shomeiEndpoint = shomeiEndpoint, overridingRecoveryStartBlockNumber = overridingRecoveryStartBlockNumber?.toULong(), diff --git a/state-recovery/test-cases/src/test/kotlin/linea/staterecovery/ManualTestWithFakeExecutionClient.kt b/state-recovery/test-cases/src/test/kotlin/linea/staterecovery/ManualTestWithFakeExecutionClient.kt index 5545609a9..c32d4d980 100644 --- a/state-recovery/test-cases/src/test/kotlin/linea/staterecovery/ManualTestWithFakeExecutionClient.kt +++ b/state-recovery/test-cases/src/test/kotlin/linea/staterecovery/ManualTestWithFakeExecutionClient.kt @@ -40,7 +40,7 @@ class TestRunner( l1PollingInterval = 5.seconds, executionClientPollingInterval = 1.seconds, smartContractAddress = StateRecoveryApp.Config.lineaSepolia.smartContractAddress, - logsBlockChunkSize = 10_000u, + l1getLogsChunkSize = 10_000u, debugForceSyncStopBlockNumber = debugForceSyncStopBlockNumber ) val appClients = createAppClients(