@@ -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
10501062func (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
13911402func (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