From e8256afc2e49b75e85b1b67350f01041e6642653 Mon Sep 17 00:00:00 2001 From: jsvisa Date: Wed, 9 Oct 2024 04:52:21 +0000 Subject: [PATCH 1/6] feat(op-batcher): loop fetch sync status Signed-off-by: jsvisa --- op-batcher/batcher/driver.go | 39 +++++++++++++++++++++++++++--------- 1 file changed, 30 insertions(+), 9 deletions(-) diff --git a/op-batcher/batcher/driver.go b/op-batcher/batcher/driver.go index 968e6de3e71..60708d24869 100644 --- a/op-batcher/batcher/driver.go +++ b/op-batcher/batcher/driver.go @@ -263,16 +263,37 @@ func (l *BatchSubmitter) calculateL2BlockRangeToStore(ctx context.Context) (eth. return eth.BlockID{}, eth.BlockID{}, fmt.Errorf("getting rollup client: %w", err) } - cCtx, cancel := context.WithTimeout(ctx, l.Config.NetworkTimeout) - defer cancel() + var ( + syncStatus *eth.SyncStatus + backoff = time.Second + maxBackoff = time.Minute + ) + for { + cCtx, cancel := context.WithTimeout(ctx, l.Config.NetworkTimeout) + syncStatus, err = rollupClient.SyncStatus(cCtx) + cancel() - syncStatus, err := rollupClient.SyncStatus(cCtx) - // Ensure that we have the sync status - if err != nil { - return eth.BlockID{}, eth.BlockID{}, fmt.Errorf("failed to get sync status: %w", err) - } - if syncStatus.HeadL1 == (eth.L1BlockRef{}) { - return eth.BlockID{}, eth.BlockID{}, errors.New("empty sync status") + // Ensure that we have the sync status + if err != nil { + return eth.BlockID{}, eth.BlockID{}, fmt.Errorf("failed to get sync status: %w", err) + } + + // If we have a head, break out of the loop + if syncStatus.HeadL1 != (eth.L1BlockRef{}) { + break + } + + // Empty sync status, implement backoff + l.Log.Info("Received empty sync status, backing off", "backoff", backoff) + select { + case <-time.After(backoff): + backoff *= 2 + if backoff > maxBackoff { + backoff = maxBackoff + } + case <-ctx.Done(): + return eth.BlockID{}, eth.BlockID{}, ctx.Err() + } } // Check last stored to see if it needs to be set on startup OR set if is lagged behind. From 152d7cbd8abc99aee85b6751e8e11b8622a0f9c5 Mon Sep 17 00:00:00 2001 From: jsvisa Date: Wed, 9 Oct 2024 04:56:13 +0000 Subject: [PATCH 2/6] feat(op-batcher): wait for l2 genesis time Signed-off-by: jsvisa --- op-batcher/batcher/driver.go | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/op-batcher/batcher/driver.go b/op-batcher/batcher/driver.go index 60708d24869..eadc9f84d07 100644 --- a/op-batcher/batcher/driver.go +++ b/op-batcher/batcher/driver.go @@ -137,6 +137,19 @@ func (l *BatchSubmitter) StartBatchSubmitting() error { l.clearState(l.shutdownCtx) l.lastStoredBlock = eth.BlockID{} + // Check L2 genesis time + genesisTime := time.Unix(int64(l.RollupConfig.Genesis.L2Time), 0) + now := time.Now() + if now.Before(genesisTime) { + l.Log.Info("Waiting for L2 genesis", "genesisTime", genesisTime) + select { + case <-time.After(time.Until(genesisTime)): + l.Log.Info("L2 genesis time reached") + case <-l.shutdownCtx.Done(): + return errors.New("batcher stopped while waiting for L2 genesis") + } + } + if l.Config.WaitNodeSync { err := l.waitNodeSync() if err != nil { From 2bb695986643aa57e600192ff6b18f759f443872 Mon Sep 17 00:00:00 2001 From: jsvisa Date: Sat, 12 Oct 2024 09:56:12 +0800 Subject: [PATCH 3/6] feat(batcher): add remaining time for tick printing Signed-off-by: jsvisa --- op-batcher/batcher/driver.go | 41 ++++++++++++++++++++++++++---------- 1 file changed, 30 insertions(+), 11 deletions(-) diff --git a/op-batcher/batcher/driver.go b/op-batcher/batcher/driver.go index eadc9f84d07..732e9fe8055 100644 --- a/op-batcher/batcher/driver.go +++ b/op-batcher/batcher/driver.go @@ -137,17 +137,8 @@ func (l *BatchSubmitter) StartBatchSubmitting() error { l.clearState(l.shutdownCtx) l.lastStoredBlock = eth.BlockID{} - // Check L2 genesis time - genesisTime := time.Unix(int64(l.RollupConfig.Genesis.L2Time), 0) - now := time.Now() - if now.Before(genesisTime) { - l.Log.Info("Waiting for L2 genesis", "genesisTime", genesisTime) - select { - case <-time.After(time.Until(genesisTime)): - l.Log.Info("L2 genesis time reached") - case <-l.shutdownCtx.Done(): - return errors.New("batcher stopped while waiting for L2 genesis") - } + if err := l.waitForL2Genesis(); err != nil { + return fmt.Errorf("error waiting for L2 genesis: %w", err) } if l.Config.WaitNodeSync { @@ -164,6 +155,34 @@ func (l *BatchSubmitter) StartBatchSubmitting() error { return nil } +// waitForL2Genesis waits for the L2 genesis time to be reached. +func (l *BatchSubmitter) waitForL2Genesis() error { + genesisTime := time.Unix(int64(l.RollupConfig.Genesis.L2Time), 0) + now := time.Now() + if now.After(genesisTime) { + return nil + } + + l.Log.Info("Waiting for L2 genesis", "genesisTime", genesisTime) + + // Create a ticker that fires every 30 seconds + ticker := time.NewTicker(30 * time.Second) + defer ticker.Stop() + + for { + select { + case <-ticker.C: + remaining := time.Until(genesisTime) + l.Log.Info("Waiting for L2 genesis", "remainingTime", remaining.Round(time.Second)) + case <-time.After(time.Until(genesisTime)): + l.Log.Info("L2 genesis time reached") + return nil + case <-l.shutdownCtx.Done(): + return errors.New("batcher stopped") + } + } +} + func (l *BatchSubmitter) StopBatchSubmittingIfRunning(ctx context.Context) error { err := l.StopBatchSubmitting(ctx) if errors.Is(err, ErrBatcherNotRunning) { From 8fbea42d55d097ccab8a07935f84abed2eb56aab Mon Sep 17 00:00:00 2001 From: jsvisa Date: Tue, 15 Oct 2024 00:08:00 +0800 Subject: [PATCH 4/6] apply code reviews Signed-off-by: jsvisa --- op-batcher/batcher/driver.go | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/op-batcher/batcher/driver.go b/op-batcher/batcher/driver.go index 732e9fe8055..e0be13d9683 100644 --- a/op-batcher/batcher/driver.go +++ b/op-batcher/batcher/driver.go @@ -169,12 +169,14 @@ func (l *BatchSubmitter) waitForL2Genesis() error { ticker := time.NewTicker(30 * time.Second) defer ticker.Stop() + genesisTrigger := time.After(time.Until(genesisTime)) + for { select { case <-ticker.C: remaining := time.Until(genesisTime) l.Log.Info("Waiting for L2 genesis", "remainingTime", remaining.Round(time.Second)) - case <-time.After(time.Until(genesisTime)): + case <-genesisTrigger: l.Log.Info("L2 genesis time reached") return nil case <-l.shutdownCtx.Done(): @@ -298,7 +300,7 @@ func (l *BatchSubmitter) calculateL2BlockRangeToStore(ctx context.Context) (eth. var ( syncStatus *eth.SyncStatus backoff = time.Second - maxBackoff = time.Minute + maxBackoff = 30 * time.Second ) for { cCtx, cancel := context.WithTimeout(ctx, l.Config.NetworkTimeout) From 46fd51bc6c8dcc060a1a8f043d49fbb7413669e4 Mon Sep 17 00:00:00 2001 From: jsvisa Date: Tue, 15 Oct 2024 08:47:25 +0800 Subject: [PATCH 5/6] use min instead of if test Signed-off-by: jsvisa --- op-batcher/batcher/driver.go | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/op-batcher/batcher/driver.go b/op-batcher/batcher/driver.go index e0be13d9683..8810114a99e 100644 --- a/op-batcher/batcher/driver.go +++ b/op-batcher/batcher/driver.go @@ -322,9 +322,7 @@ func (l *BatchSubmitter) calculateL2BlockRangeToStore(ctx context.Context) (eth. select { case <-time.After(backoff): backoff *= 2 - if backoff > maxBackoff { - backoff = maxBackoff - } + backoff = min(backoff, maxBackoff) case <-ctx.Done(): return eth.BlockID{}, eth.BlockID{}, ctx.Err() } From d8dcfc5f73ec1a5f4503e11274baa13a751045f2 Mon Sep 17 00:00:00 2001 From: jsvisa Date: Thu, 17 Oct 2024 10:15:12 +0800 Subject: [PATCH 6/6] fix(batcher): reset timer Signed-off-by: jsvisa --- op-batcher/batcher/driver.go | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/op-batcher/batcher/driver.go b/op-batcher/batcher/driver.go index 8810114a99e..3b98993deb7 100644 --- a/op-batcher/batcher/driver.go +++ b/op-batcher/batcher/driver.go @@ -302,6 +302,9 @@ func (l *BatchSubmitter) calculateL2BlockRangeToStore(ctx context.Context) (eth. backoff = time.Second maxBackoff = 30 * time.Second ) + timer := time.NewTimer(backoff) + defer timer.Stop() + for { cCtx, cancel := context.WithTimeout(ctx, l.Config.NetworkTimeout) syncStatus, err = rollupClient.SyncStatus(cCtx) @@ -320,9 +323,11 @@ func (l *BatchSubmitter) calculateL2BlockRangeToStore(ctx context.Context) (eth. // Empty sync status, implement backoff l.Log.Info("Received empty sync status, backing off", "backoff", backoff) select { - case <-time.After(backoff): + case <-timer.C: backoff *= 2 backoff = min(backoff, maxBackoff) + // Reset timer to tick of the new backoff time again + timer.Reset(backoff) case <-ctx.Done(): return eth.BlockID{}, eth.BlockID{}, ctx.Err() }