Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Feat/l1 msg queue #1055

Draft
wants to merge 3 commits into
base: feat/l1-state-tracker
Choose a base branch
from
Draft

Conversation

NazariiDenha
Copy link

1. Purpose or design rationale of this PR

Remove existing L1MessageQueue that stores all msgs in db with new one that

  1. able to get not only L1Msgs from Finalized L1 blocks, but also load most recent L1Msgs and handle reorgs, crucial for reducing bridge latency
  2. stores L1Msgs in memory and prunes old when not needed more

Design explanation and task page

2. PR title

Your PR title must follow conventional commits (as we are doing squash merge for each PR), so it must start with one of the following types:

  • build: Changes that affect the build system or external dependencies (example scopes: yarn, eslint, typescript)
  • ci: Changes to our CI configuration files and scripts (example scopes: vercel, github, cypress)
  • docs: Documentation-only changes
  • feat: A new feature
  • fix: A bug fix
  • perf: A code change that improves performance
  • refactor: A code change that doesn't fix a bug, or add a feature, or improves performance
  • style: Changes that do not affect the meaning of the code (white-space, formatting, missing semi-colons, etc)
  • test: Adding missing tests or correcting existing tests

3. Deployment tag versioning

Has the version in params/version.go been updated?

  • This PR doesn't involve a new deployment, git tag, docker image tag, and it doesn't affect traces
  • Yes

4. Breaking change label

Does this PR have the breaking-change label?

  • This PR is not a breaking change
  • Yes

@0xmountaintop
Copy link
Member

so we are using approach 2?

@NazariiDenha
Copy link
Author

NazariiDenha commented Oct 8, 2024

so we are using approach 2?

I think both are applicable here, becausePruneMessages can be called either by client or some internal logic


for {
select {
case <-ms.ctx.Done():
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Why need to specifically handle <-ms.ctx.Done() and the subsequent select handle this again

rollup/l1/msg_storage.go Outdated Show resolved Hide resolved
EndBlockHeader *types.Header
}

type MsgStorage struct {
Copy link
Member

@georgehao georgehao Oct 9, 2024

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

add some metrics to MsgStorage eg:

  • whether the task is running
  • which head block is currently processed

}

// PruneMessages deletes all messages that are older or equal to provided index
func (ms *MsgStorage) PruneMessages(lastIndex uint64) {
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Who call this function? if no, maybe this it's called by itself periodically

rollup/l1/msg_storage.go Outdated Show resolved Hide resolved
msgs: common.NewShrinkingMap[uint64, storedL1Message](1000),
reader: reader,
}
msgStorage.unsubscribeTracker = tracker.Subscribe(LatestChainHead, func(old, new []*types.Header) {

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LatestChainHead should be configurable when we initialize the MsgStorage. This is essentially the time we wait to relay L1 messages from L1->L2.

msgStorage.newChainNotifications = append(msgStorage.newChainNotifications, newChainNotification{old, new})
})

msgStorage.Start()

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think it's better to remove the start here and make it the responsibility of the user of MsgStorage to call Start. This way we can avoid asynchronicity in unit tests when testing MsgStorage

Comment on lines +154 to +174
var indexesToDelete []uint64
for _, msg := range msgs {
contains := false
for _, header := range old {
if header.Hash() == msg.headerHash {
contains = true
break
}
}
if contains {
indexesToDelete = append(indexesToDelete, msg.l1msg.QueueIndex)
}
}
if len(indexesToDelete) > 0 {
ms.msgsMu.Lock()
for _, index := range indexesToDelete {
ms.msgs.Delete(index)
}
ms.msgsMu.Unlock()
}
}

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

How about storing an additional map L1 blockNum -> L1 message indexes. then we just need to iterate once and delete. this should be rare but it could be quite costly depending on how big msgs and old are

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

4 participants