Skip to content

Commit 2eac4ee

Browse files
tholcmanAskAlexSharov
authored andcommitted
rpc bottleneck: block files mutex (e2) (erigontech#11155) (node-real#440)
for erigontech#11090 thank you [tholcman](https://github.com/tholcman) for finding Co-authored-by: Alex Sharov <[email protected]>
1 parent 41289f4 commit 2eac4ee

File tree

2 files changed

+131
-70
lines changed

2 files changed

+131
-70
lines changed

turbo/snapshotsync/freezeblocks/block_reader.go

Lines changed: 75 additions & 66 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import (
1010
"sort"
1111
"time"
1212

13+
borsnaptype "github.com/ledgerwatch/erigon/polygon/bor/snaptype"
1314
"github.com/ledgerwatch/log/v3"
1415

1516
"github.com/ledgerwatch/erigon-lib/common/hexutility"
@@ -395,12 +396,11 @@ func (r *BlockReader) HeaderByNumber(ctx context.Context, tx kv.Getter, blockHei
395396
}
396397
}
397398

398-
view := r.sn.View()
399-
defer view.Close()
400-
seg, ok := view.HeadersSegment(blockHeight)
399+
seg, ok, release := r.sn.ViewSingleFile(coresnaptype.Headers, blockHeight)
401400
if !ok {
402401
return
403402
}
403+
defer release()
404404

405405
h, _, err = r.headerFromSnapshot(blockHeight, seg, nil)
406406
if err != nil {
@@ -419,9 +419,8 @@ func (r *BlockReader) HeaderByHash(ctx context.Context, tx kv.Getter, hash commo
419419
return h, nil
420420
}
421421

422-
view := r.sn.View()
423-
defer view.Close()
424-
segments := view.Headers()
422+
segments, release := r.sn.ViewType(coresnaptype.Headers)
423+
defer release()
425424

426425
buf := make([]byte, 128)
427426
for i := len(segments) - 1; i >= 0; i-- {
@@ -451,12 +450,11 @@ func (r *BlockReader) CanonicalHash(ctx context.Context, tx kv.Getter, blockHeig
451450
return h, nil
452451
}
453452

454-
view := r.sn.View()
455-
defer view.Close()
456-
seg, ok := view.HeadersSegment(blockHeight)
453+
seg, ok, release := r.sn.ViewSingleFile(coresnaptype.Headers, blockHeight)
457454
if !ok {
458455
return
459456
}
457+
defer release()
460458

461459
header, _, err := r.headerFromSnapshot(blockHeight, seg, nil)
462460
if err != nil {
@@ -486,12 +484,12 @@ func (r *BlockReader) Header(ctx context.Context, tx kv.Getter, hash common.Hash
486484
}
487485
}
488486

489-
view := r.sn.View()
490-
defer view.Close()
491-
seg, ok := view.HeadersSegment(blockHeight)
487+
seg, ok, release := r.sn.ViewSingleFile(coresnaptype.Headers, blockHeight)
492488
if !ok {
493489
return
494490
}
491+
defer release()
492+
495493
h, _, err = r.headerFromSnapshot(blockHeight, seg, nil)
496494
if err != nil {
497495
return h, err
@@ -526,40 +524,46 @@ func (r *BlockReader) BodyWithTransactions(ctx context.Context, tx kv.Getter, ha
526524
}
527525
}
528526

529-
view := r.sn.View()
530-
defer view.Close()
531-
532-
var baseTxnID uint64
533-
var txsAmount uint32
534-
var buf []byte
535-
seg, ok := view.BodiesSegment(blockHeight)
527+
seg, ok, release := r.sn.ViewSingleFile(coresnaptype.Bodies, blockHeight)
536528
if !ok {
537529
if dbgLogs {
538530
log.Info(dbgPrefix + "no bodies file for this block num")
539531
}
540532
return nil, nil
541533
}
542-
body, baseTxnID, txsAmount, buf, err = r.bodyFromSnapshot(blockHeight, seg, buf)
534+
defer release()
535+
536+
var baseTxnID uint64
537+
var txCount uint32
538+
var buf []byte
539+
body, baseTxnID, txCount, buf, err = r.bodyFromSnapshot(blockHeight, seg, buf)
543540
if err != nil {
544541
return nil, err
545542
}
543+
release()
544+
546545
if body == nil {
547546
if dbgLogs {
548547
log.Info(dbgPrefix + "got nil body from file")
549548
}
550549
return nil, nil
551550
}
552-
txnSeg, ok := view.TxsSegment(blockHeight)
551+
552+
txnSeg, ok, release := r.sn.ViewSingleFile(coresnaptype.Transactions, blockHeight)
553553
if !ok {
554554
if dbgLogs {
555555
log.Info(dbgPrefix+"no transactions file for this block num", "r.sn.BlocksAvailable()", r.sn.BlocksAvailable(), "r.sn.idxMax", r.sn.idxMax.Load(), "r.sn.segmetntsMax", r.sn.segmentsMax.Load())
556556
}
557557
return nil, nil
558558
}
559-
txs, senders, err := r.txsFromSnapshot(baseTxnID, txsAmount, txnSeg, buf)
559+
defer release()
560+
561+
txs, senders, err := r.txsFromSnapshot(baseTxnID, txCount, txnSeg, buf)
560562
if err != nil {
561563
return nil, err
562564
}
565+
release()
566+
563567
if txs == nil {
564568
if dbgLogs {
565569
log.Info(dbgPrefix + "got nil txs from file")
@@ -606,13 +610,13 @@ func (r *BlockReader) Body(ctx context.Context, tx kv.Getter, hash common.Hash,
606610
body, _, txAmount = rawdb.ReadBody(tx, hash, blockHeight)
607611
return body, txAmount, nil
608612
}
609-
view := r.sn.View()
610-
defer view.Close()
611613

612-
seg, ok := view.BodiesSegment(blockHeight)
614+
seg, ok, release := r.sn.ViewSingleFile(coresnaptype.Bodies, blockHeight)
613615
if !ok {
614616
return
615617
}
618+
defer release()
619+
616620
body, _, txAmount, _, err = r.bodyFromSnapshot(blockHeight, seg, nil)
617621
if err != nil {
618622
return nil, 0, err
@@ -676,15 +680,14 @@ func (r *BlockReader) blockWithSenders(ctx context.Context, tx kv.Getter, hash c
676680
return
677681
}
678682

679-
view := r.sn.View()
680-
defer view.Close()
681-
seg, ok := view.HeadersSegment(blockHeight)
683+
seg, ok, release := r.sn.ViewSingleFile(coresnaptype.Headers, blockHeight)
682684
if !ok {
683685
if dbgLogs {
684686
log.Info(dbgPrefix + "no header files for this block num")
685687
}
686688
return
687689
}
690+
defer release()
688691

689692
var buf []byte
690693
h, buf, err := r.headerFromSnapshot(blockHeight, seg, buf)
@@ -697,21 +700,26 @@ func (r *BlockReader) blockWithSenders(ctx context.Context, tx kv.Getter, hash c
697700
}
698701
return
699702
}
703+
release()
700704

701705
var b *types.Body
702706
var baseTxnId uint64
703707
var txsAmount uint32
704-
bodySeg, ok := view.BodiesSegment(blockHeight)
708+
bodySeg, ok, release := r.sn.ViewSingleFile(coresnaptype.Bodies, blockHeight)
705709
if !ok {
706710
if dbgLogs {
707711
log.Info(dbgPrefix + "no bodies file for this block num")
708712
}
709713
return
710714
}
715+
defer release()
716+
711717
b, baseTxnId, txsAmount, buf, err = r.bodyFromSnapshot(blockHeight, bodySeg, buf)
712718
if err != nil {
713719
return nil, nil, err
714720
}
721+
release()
722+
715723
if b == nil {
716724
if dbgLogs {
717725
log.Info(dbgPrefix + "got nil body from file")
@@ -730,18 +738,21 @@ func (r *BlockReader) blockWithSenders(ctx context.Context, tx kv.Getter, hash c
730738
return block, senders, nil
731739
}
732740

733-
txnSeg, ok := view.TxsSegment(blockHeight)
741+
txnSeg, ok, release := r.sn.ViewSingleFile(coresnaptype.Transactions, blockHeight)
734742
if !ok {
735743
if dbgLogs {
736744
log.Info(dbgPrefix+"no transactions file for this block num", "r.sn.BlocksAvailable()", r.sn.BlocksAvailable(), "r.sn.indicesReady", r.sn.indicesReady.Load())
737745
}
738746
return
739747
}
748+
defer release()
740749
var txs []types.Transaction
741750
txs, senders, err = r.txsFromSnapshot(baseTxnId, txsAmount, txnSeg, buf)
742751
if err != nil {
743752
return nil, nil, err
744753
}
754+
release()
755+
745756
block = types.NewBlockFromStorage(hash, h, txs, b.Uncles, b.Withdrawals)
746757
if len(senders) != block.Transactions().Len() {
747758
if dbgLogs {
@@ -997,18 +1008,18 @@ func (r *BlockReader) TxnByIdxInBlock(ctx context.Context, tx kv.Getter, blockNu
9971008
return rawdb.TxnByIdxInBlock(tx, canonicalHash, blockNum, txIdxInBlock)
9981009
}
9991010

1000-
view := r.sn.View()
1001-
defer view.Close()
1002-
seg, ok := view.BodiesSegment(blockNum)
1011+
seg, ok, release := r.sn.ViewSingleFile(coresnaptype.Bodies, blockNum)
10031012
if !ok {
10041013
return
10051014
}
1015+
defer release()
10061016

10071017
var b *types.BodyForStorage
10081018
b, _, err = r.bodyForStorageFromSnapshot(blockNum, seg, nil)
10091019
if err != nil {
10101020
return nil, err
10111021
}
1022+
release()
10121023
if b == nil {
10131024
return
10141025
}
@@ -1018,10 +1029,12 @@ func (r *BlockReader) TxnByIdxInBlock(ctx context.Context, tx kv.Getter, blockNu
10181029
return nil, nil
10191030
}
10201031

1021-
txnSeg, ok := view.TxsSegment(blockNum)
1032+
txnSeg, ok, release := r.sn.ViewSingleFile(coresnaptype.Transactions, blockNum)
10221033
if !ok {
10231034
return
10241035
}
1036+
defer release()
1037+
10251038
// +1 because block has system-txn in the beginning of block
10261039
return r.txnByID(b.BaseTxId+1+uint64(txIdxInBlock), txnSeg, nil)
10271040
}
@@ -1036,10 +1049,9 @@ func (r *BlockReader) TxnLookup(_ context.Context, tx kv.Getter, txnHash common.
10361049
return *n, true, nil
10371050
}
10381051

1039-
view := r.sn.View()
1040-
defer view.Close()
1041-
1042-
_, blockNum, ok, err := r.txnByHash(txnHash, view.Txs(), nil)
1052+
txns, release := r.sn.ViewType(coresnaptype.Transactions)
1053+
defer release()
1054+
_, blockNum, ok, err := r.txnByHash(txnHash, txns, nil)
10431055
if err != nil {
10441056
return 0, false, err
10451057
}
@@ -1048,13 +1060,11 @@ func (r *BlockReader) TxnLookup(_ context.Context, tx kv.Getter, txnHash common.
10481060
}
10491061

10501062
func (r *BlockReader) FirstTxnNumNotInSnapshots() uint64 {
1051-
view := r.sn.View()
1052-
defer view.Close()
1053-
1054-
sn, ok := view.TxsSegment(r.sn.BlocksAvailable())
1063+
sn, ok, release := r.sn.ViewSingleFile(coresnaptype.Transactions, r.sn.BlocksAvailable())
10551064
if !ok {
10561065
return 0
10571066
}
1067+
defer release()
10581068

10591069
lastTxnID := sn.Index(coresnaptype.Indexes.TxnHash).BaseDataID() + uint64(sn.Count())
10601070
return lastTxnID
@@ -1268,10 +1278,10 @@ func (r *BlockReader) BorStartEventID(ctx context.Context, tx kv.Tx, hash common
12681278
}
12691279

12701280
borTxHash := bortypes.ComputeBorTxHash(blockHeight, hash)
1271-
view := r.borSn.View()
1272-
defer view.Close()
12731281

1274-
segments := view.Events()
1282+
segments, release := r.borSn.ViewType(borsnaptype.BorEvents)
1283+
defer release()
1284+
12751285
for i := len(segments) - 1; i >= 0; i-- {
12761286
sn := segments[i]
12771287
if sn.from > blockHeight {
@@ -1349,9 +1359,10 @@ func (r *BlockReader) EventsByBlock(ctx context.Context, tx kv.Tx, hash common.H
13491359
return result, nil
13501360
}
13511361
borTxHash := bortypes.ComputeBorTxHash(blockHeight, hash)
1352-
view := r.borSn.View()
1353-
defer view.Close()
1354-
segments := view.Events()
1362+
1363+
segments, release := r.borSn.ViewType(borsnaptype.BorEvents)
1364+
defer release()
1365+
13551366
var buf []byte
13561367
result := []rlp.RawValue{}
13571368
for i := len(segments) - 1; i >= 0; i-- {
@@ -1389,10 +1400,9 @@ func (r *BlockReader) EventsByBlock(ctx context.Context, tx kv.Tx, hash common.H
13891400

13901401
// EventsByIdFromSnapshot returns the list of records limited by time, or the number of records along with a bool value to signify if the records were limited by time
13911402
func (r *BlockReader) EventsByIdFromSnapshot(from uint64, to time.Time, limit int) ([]*heimdall.EventRecordWithTime, bool, error) {
1392-
view := r.borSn.View()
1393-
defer view.Close()
1403+
segments, release := r.borSn.ViewType(borsnaptype.BorEvents)
1404+
defer release()
13941405

1395-
segments := view.Events()
13961406
var buf []byte
13971407
var result []*heimdall.EventRecordWithTime
13981408
stateContract := bor.GenesisContractStateReceiverABI()
@@ -1469,9 +1479,9 @@ func (r *BlockReader) LastFrozenEventId() uint64 {
14691479
return 0
14701480
}
14711481

1472-
view := r.borSn.View()
1473-
defer view.Close()
1474-
segments := view.Events()
1482+
segments, release := r.borSn.ViewType(borsnaptype.BorEvents)
1483+
defer release()
1484+
14751485
if len(segments) == 0 {
14761486
return 0
14771487
}
@@ -1526,9 +1536,9 @@ func (r *BlockReader) LastFrozenSpanId() uint64 {
15261536
return 0
15271537
}
15281538

1529-
view := r.borSn.View()
1530-
defer view.Close()
1531-
segments := view.Spans()
1539+
segments, release := r.borSn.ViewType(borsnaptype.BorSpans)
1540+
defer release()
1541+
15321542
if len(segments) == 0 {
15331543
return 0
15341544
}
@@ -1570,9 +1580,9 @@ func (r *BlockReader) Span(ctx context.Context, tx kv.Getter, spanId uint64) ([]
15701580
}
15711581
return common.Copy(v), nil
15721582
}
1573-
view := r.borSn.View()
1574-
defer view.Close()
1575-
segments := view.Spans()
1583+
segments, release := r.borSn.ViewType(borsnaptype.BorSpans)
1584+
defer release()
1585+
15761586
for i := len(segments) - 1; i >= 0; i-- {
15771587
sn := segments[i]
15781588
idx := sn.Index()
@@ -1674,9 +1684,9 @@ func (r *BlockReader) Checkpoint(ctx context.Context, tx kv.Getter, checkpointId
16741684
return common.Copy(v), nil
16751685
}
16761686

1677-
view := r.borSn.View()
1678-
defer view.Close()
1679-
segments := view.Checkpoints()
1687+
segments, release := r.borSn.ViewType(borsnaptype.BorCheckpoints)
1688+
defer release()
1689+
16801690
for i := len(segments) - 1; i >= 0; i-- {
16811691
sn := segments[i]
16821692
index := sn.Index()
@@ -1700,9 +1710,8 @@ func (r *BlockReader) LastFrozenCheckpointId() uint64 {
17001710
return 0
17011711
}
17021712

1703-
view := r.borSn.View()
1704-
defer view.Close()
1705-
segments := view.Checkpoints()
1713+
segments, release := r.borSn.ViewType(borsnaptype.BorCheckpoints)
1714+
defer release()
17061715
if len(segments) == 0 {
17071716
return 0
17081717
}

0 commit comments

Comments
 (0)