Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
N
nebula
Project
Project
Details
Activity
Releases
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
exchain
nebula
Commits
3b29035a
Unverified
Commit
3b29035a
authored
Nov 29, 2023
by
Hamdi Allam
Committed by
GitHub
Nov 29, 2023
Browse files
Options
Browse Files
Download
Plain Diff
Merge pull request #8331 from ethereum-optimism/indexer.startup
fix(indexer): speed up startup times avoiding inner joins
parents
97b45584
19b50943
Changes
2
Hide whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
24 additions
and
27 deletions
+24
-27
bridge_transactions.go
indexer/database/bridge_transactions.go
+18
-27
20230523_create_schema.sql
indexer/migrations/20230523_create_schema.sql
+6
-0
No files found.
indexer/database/bridge_transactions.go
View file @
3b29035a
...
...
@@ -108,11 +108,8 @@ func (db *bridgeTransactionsDB) L1TransactionDeposit(sourceHash common.Hash) (*L
}
func
(
db
*
bridgeTransactionsDB
)
L1LatestBlockHeader
()
(
*
L1BlockHeader
,
error
)
{
// Latest Transaction Deposit
l1Query
:=
db
.
gorm
.
Table
(
"l1_transaction_deposits"
)
.
Order
(
"l1_transaction_deposits.timestamp DESC"
)
l1Query
=
l1Query
.
Joins
(
"INNER JOIN l1_contract_events ON l1_contract_events.guid = l1_transaction_deposits.initiated_l1_event_guid"
)
l1Query
=
l1Query
.
Joins
(
"INNER JOIN l1_block_headers ON l1_block_headers.hash = l1_contract_events.block_hash"
)
l1Query
=
l1Query
.
Select
(
"l1_block_headers.*"
)
// L1: Latest Transaction Deposit
l1Query
:=
db
.
gorm
.
Where
(
"timestamp = (?)"
,
db
.
gorm
.
Table
(
"l1_transaction_deposits"
)
.
Select
(
"MAX(timestamp)"
))
var
l1Header
L1BlockHeader
result
:=
l1Query
.
Take
(
&
l1Header
)
...
...
@@ -128,21 +125,18 @@ func (db *bridgeTransactionsDB) L1LatestBlockHeader() (*L1BlockHeader, error) {
func
(
db
*
bridgeTransactionsDB
)
L1LatestFinalizedBlockHeader
()
(
*
L1BlockHeader
,
error
)
{
// A Proven, Finalized Event or Relayed Message
provenQuery
:=
db
.
gorm
.
Table
(
"l2_transaction_withdrawals"
)
.
Order
(
"timestamp DESC"
)
.
Limit
(
1
)
provenQuery
=
provenQuery
.
Joins
(
"INNER JOIN l1_contract_events ON l1_contract_events.guid = l2_transaction_withdrawals.proven_l1_event_guid"
)
provenQuery
=
provenQuery
.
Order
(
"l1_contract_events.timestamp DESC"
)
.
Select
(
"l1_contract_events.*"
)
finalizedQuery
:=
db
.
gorm
.
Table
(
"l2_transaction_withdrawals"
)
.
Order
(
"timestamp DESC"
)
.
Limit
(
1
)
finalizedQuery
=
finalizedQuery
.
Joins
(
"INNER JOIN l1_contract_events ON l1_contract_events.guid = l2_transaction_withdrawals.finalized_l1_event_guid"
)
finalizedQuery
=
finalizedQuery
.
Select
(
"l1_contract_events.*"
)
latestProvenWithdrawal
:=
db
.
gorm
.
Table
(
"l2_transaction_withdrawals"
)
.
Where
(
"proven_l1_event_guid IS NOT NULL"
)
.
Order
(
"timestamp DESC"
)
.
Limit
(
1
)
provenQuery
:=
db
.
gorm
.
Table
(
"l1_contract_events"
)
.
Where
(
"guid = (?)"
,
latestProvenWithdrawal
.
Select
(
"proven_l1_event_guid"
))
relayedQuery
:=
db
.
gorm
.
Table
(
"l2_bridge_messages"
)
.
Order
(
"timestamp DESC"
)
.
Limit
(
1
)
relayedQuery
=
relayedQuery
.
Joins
(
"INNER JOIN l1_contract_events ON l1_contract_events.guid = l2_bridge_messages.relayed_message_event_guid"
)
relayedQuery
=
relayedQuery
.
Select
(
"l1_contract_events.*"
)
latestFinalizedWithdrawal
:=
db
.
gorm
.
Table
(
"l2_transaction_withdrawals"
)
.
Where
(
"finalized_l1_event_guid IS NOT NULL"
)
.
Order
(
"timestamp DESC"
)
.
Limit
(
1
)
finalizedQuery
:=
db
.
gorm
.
Table
(
"l1_contract_events"
)
.
Where
(
"guid = (?)"
,
latestFinalizedWithdrawal
.
Select
(
"finalized_l1_event_guid"
))
l1Query
:=
db
.
gorm
.
Table
(
"((?) UNION (?) UNION (?)) AS finalized_bridge_events"
,
provenQuery
,
finalizedQuery
,
relayedQuery
)
l1Query
=
l1Query
.
Joins
(
"INNER JOIN l1_block_headers ON l1_block_headers.hash = finalized_bridge_events.block_hash"
)
l1Query
=
l1Query
.
Order
(
"finalized_bridge_events.timestamp DESC"
)
.
Select
(
"l1_block_headers.*"
)
latestRelayedWithdrawal
:=
db
.
gorm
.
Table
(
"l2_bridge_messages"
)
.
Where
(
"relayed_message_event_guid IS NOT NULL"
)
.
Order
(
"timestamp DESC"
)
.
Limit
(
1
)
relayedQuery
:=
db
.
gorm
.
Table
(
"l1_contract_events"
)
.
Where
(
"guid = (?)"
,
latestRelayedWithdrawal
.
Select
(
"relayed_message_event_guid"
))
events
:=
db
.
gorm
.
Table
(
"((?) UNION (?) UNION (?)) AS events"
,
provenQuery
,
finalizedQuery
,
relayedQuery
)
l1Query
:=
db
.
gorm
.
Where
(
"hash = (?)"
,
events
.
Select
(
"block_hash"
)
.
Order
(
"timestamp DESC"
)
.
Limit
(
1
))
var
l1Header
L1BlockHeader
result
:=
l1Query
.
Take
(
&
l1Header
)
...
...
@@ -227,11 +221,8 @@ func (db *bridgeTransactionsDB) MarkL2TransactionWithdrawalFinalizedEvent(withdr
}
func
(
db
*
bridgeTransactionsDB
)
L2LatestBlockHeader
()
(
*
L2BlockHeader
,
error
)
{
// L2: Latest Withdrawal
l2Query
:=
db
.
gorm
.
Table
(
"l2_transaction_withdrawals"
)
.
Order
(
"timestamp DESC"
)
l2Query
=
l2Query
.
Joins
(
"INNER JOIN l2_contract_events ON l2_contract_events.guid = l2_transaction_withdrawals.initiated_l2_event_guid"
)
l2Query
=
l2Query
.
Joins
(
"INNER JOIN l2_block_headers ON l2_block_headers.hash = l2_contract_events.block_hash"
)
l2Query
=
l2Query
.
Select
(
"l2_block_headers.*"
)
// L2: Block With The Latest Withdrawal
l2Query
:=
db
.
gorm
.
Where
(
"timestamp = (?)"
,
db
.
gorm
.
Table
(
"l2_transaction_withdrawals"
)
.
Select
(
"MAX(timestamp)"
))
var
l2Header
L2BlockHeader
result
:=
l2Query
.
Take
(
&
l2Header
)
...
...
@@ -247,13 +238,13 @@ func (db *bridgeTransactionsDB) L2LatestBlockHeader() (*L2BlockHeader, error) {
func
(
db
*
bridgeTransactionsDB
)
L2LatestFinalizedBlockHeader
()
(
*
L2BlockHeader
,
error
)
{
// Only a Relayed message since we dont track L1 deposit inclusion status.
relayedQuery
:=
db
.
gorm
.
Table
(
"l1_bridge_messages
"
)
.
Order
(
"timestamp DESC"
)
.
Limit
(
1
)
relayedQuery
=
relayedQuery
.
Joins
(
"INNER JOIN l2_contract_events ON l2_contract_events.guid = l1_bridge_messages.relayed_message_event_guid"
)
relayedQuery
=
relayedQuery
.
Joins
(
"INNER JOIN l2_block_headers ON l2_block_headers.hash = l2_contract_events.block_hash"
)
relayedQuery
=
relayedQuery
.
Select
(
"l2_block_headers.*"
)
latestRelayedDeposit
:=
db
.
gorm
.
Table
(
"l1_bridge_messages"
)
.
Where
(
"relayed_message_event_guid IS NOT NULL
"
)
.
Order
(
"timestamp DESC"
)
.
Limit
(
1
)
relayedQuery
:=
db
.
gorm
.
Table
(
"l2_contract_events"
)
.
Where
(
"guid = (?)"
,
latestRelayedDeposit
.
Select
(
"relayed_message_event_guid"
)
)
l2Query
:=
db
.
gorm
.
Where
(
"hash = (?)"
,
relayedQuery
.
Select
(
"block_hash"
)
)
var
l2Header
L2BlockHeader
result
:=
relayed
Query
.
Take
(
&
l2Header
)
result
:=
l2
Query
.
Take
(
&
l2Header
)
if
result
.
Error
!=
nil
{
if
errors
.
Is
(
result
.
Error
,
gorm
.
ErrRecordNotFound
)
{
return
nil
,
nil
...
...
indexer/migrations/20230523_create_schema.sql
View file @
3b29035a
...
...
@@ -133,6 +133,8 @@ CREATE TABLE IF NOT EXISTS l2_transaction_withdrawals (
);
CREATE
INDEX
IF
NOT
EXISTS
l2_transaction_withdrawals_timestamp
ON
l2_transaction_withdrawals
(
timestamp
);
CREATE
INDEX
IF
NOT
EXISTS
l2_transaction_withdrawals_initiated_l2_event_guid
ON
l2_transaction_withdrawals
(
initiated_l2_event_guid
);
CREATE
INDEX
IF
NOT
EXISTS
l2_transaction_withdrawals_proven_l1_event_guid
ON
l2_transaction_withdrawals
(
proven_l1_event_guid
);
CREATE
INDEX
IF
NOT
EXISTS
l2_transaction_withdrawals_finalized_l1_event_guid
ON
l2_transaction_withdrawals
(
finalized_l1_event_guid
);
CREATE
INDEX
IF
NOT
EXISTS
l2_transaction_withdrawals_from_address
ON
l2_transaction_withdrawals
(
from_address
);
-- CrossDomainMessenger
...
...
@@ -154,6 +156,8 @@ CREATE TABLE IF NOT EXISTS l1_bridge_messages(
);
CREATE
INDEX
IF
NOT
EXISTS
l1_bridge_messages_timestamp
ON
l1_bridge_messages
(
timestamp
);
CREATE
INDEX
IF
NOT
EXISTS
l1_bridge_messages_transaction_source_hash
ON
l1_bridge_messages
(
transaction_source_hash
);
CREATE
INDEX
IF
NOT
EXISTS
l1_bridge_messages_transaction_sent_message_event_guid
ON
l1_bridge_messages
(
sent_message_event_guid
);
CREATE
INDEX
IF
NOT
EXISTS
l1_bridge_messages_transaction_relayed_message_event_guid
ON
l1_bridge_messages
(
relayed_message_event_guid
);
CREATE
INDEX
IF
NOT
EXISTS
l1_bridge_messages_from_address
ON
l1_bridge_messages
(
from_address
);
CREATE
TABLE
IF
NOT
EXISTS
l2_bridge_messages
(
...
...
@@ -174,6 +178,8 @@ CREATE TABLE IF NOT EXISTS l2_bridge_messages(
);
CREATE
INDEX
IF
NOT
EXISTS
l2_bridge_messages_timestamp
ON
l2_bridge_messages
(
timestamp
);
CREATE
INDEX
IF
NOT
EXISTS
l2_bridge_messages_transaction_withdrawal_hash
ON
l2_bridge_messages
(
transaction_withdrawal_hash
);
CREATE
INDEX
IF
NOT
EXISTS
l2_bridge_messages_transaction_sent_message_event_guid
ON
l2_bridge_messages
(
sent_message_event_guid
);
CREATE
INDEX
IF
NOT
EXISTS
l2_bridge_messages_transaction_relayed_message_event_guid
ON
l2_bridge_messages
(
relayed_message_event_guid
);
CREATE
INDEX
IF
NOT
EXISTS
l2_bridge_messages_from_address
ON
l2_bridge_messages
(
from_address
);
/**
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment