@@ -7,24 +7,24 @@ import (
77 "math"
88 "time"
99
10- "github.com/onflow/flow-go/module/component"
11-
1210 pebbleDB "github.com/cockroachdb/pebble"
13-
11+ "github.com/onflow/flow-evm-gateway/metrics"
1412 "github.com/onflow/flow-go-sdk/access"
1513 "github.com/onflow/flow-go-sdk/access/grpc"
1614 "github.com/onflow/flow-go-sdk/crypto"
1715 "github.com/onflow/flow-go/fvm/environment"
1816 "github.com/onflow/flow-go/fvm/evm"
1917 flowGo "github.com/onflow/flow-go/model/flow"
18+ "github.com/onflow/flow-go/module/component"
19+ flowMetrics "github.com/onflow/flow-go/module/metrics"
20+ "github.com/onflow/flow-go/module/util"
2021 gethTypes "github.com/onflow/go-ethereum/core/types"
2122 "github.com/rs/zerolog"
2223 "github.com/sethvargo/go-limiter/memorystore"
2324 grpcOpts "google.golang.org/grpc"
2425
2526 "github.com/onflow/flow-evm-gateway/api"
2627 "github.com/onflow/flow-evm-gateway/config"
27- "github.com/onflow/flow-evm-gateway/metrics"
2828 "github.com/onflow/flow-evm-gateway/models"
2929 errs "github.com/onflow/flow-evm-gateway/models/errors"
3030 "github.com/onflow/flow-evm-gateway/services/ingestion"
@@ -57,9 +57,10 @@ type Bootstrap struct {
5757 publishers * Publishers
5858 collector metrics.Collector
5959 server * api.Server
60- metrics * metrics .Server
60+ metrics * flowMetrics .Server
6161 events * ingestion.Engine
6262 profiler * api.ProfileServer
63+ db * pebbleDB.DB
6364}
6465
6566func New (config * config.Config ) (* Bootstrap , error ) {
@@ -72,7 +73,7 @@ func New(config *config.Config) (*Bootstrap, error) {
7273 return nil , err
7374 }
7475
75- storages , err := setupStorage (config , client , logger )
76+ db , storages , err := setupStorage (config , client , logger )
7677 if err != nil {
7778 return nil , err
7879 }
@@ -83,6 +84,7 @@ func New(config *config.Config) (*Bootstrap, error) {
8384 Transaction : models .NewPublisher [* gethTypes.Transaction ](),
8485 Logs : models .NewPublisher [[]* gethTypes.Log ](),
8586 },
87+ db : db ,
8688 storages : storages ,
8789 logger : logger ,
8890 config : config ,
@@ -334,15 +336,14 @@ func (b *Bootstrap) StopAPIServer() {
334336 b .server .Stop ()
335337}
336338
337- func (b * Bootstrap ) StartMetricsServer (_ context.Context ) error {
339+ func (b * Bootstrap ) StartMetricsServer (ctx context.Context ) error {
338340 b .logger .Info ().Msg ("bootstrap starting metrics server" )
339341
340- b .metrics = metrics .NewServer (b .logger , b .config .MetricsPort )
341- started , err := b .metrics .Start ( )
342+ b .metrics = flowMetrics .NewServer (b .logger , uint ( b .config .MetricsPort ) )
343+ err := util . WaitClosed ( ctx , b .metrics .Ready () )
342344 if err != nil {
343345 return fmt .Errorf ("failed to start metrics server: %w" , err )
344346 }
345- <- started
346347
347348 return nil
348349}
@@ -352,7 +353,7 @@ func (b *Bootstrap) StopMetricsServer() {
352353 return
353354 }
354355 b .logger .Warn ().Msg ("shutting down metrics server" )
355- b .metrics .Stop ()
356+ <- b .metrics .Done ()
356357}
357358
358359func (b * Bootstrap ) StartProfilerServer (_ context.Context ) error {
@@ -388,15 +389,25 @@ func (b *Bootstrap) StopProfilerServer() {
388389}
389390
390391func (b * Bootstrap ) StopDB () {
391- if b .storages == nil || b . storages . Storage == nil {
392+ if b .db == nil {
392393 return
393394 }
394- err := b .storages . Storage .Close ()
395+ err := b .db .Close ()
395396 if err != nil {
396397 b .logger .Err (err ).Msg ("PebbleDB graceful shutdown failed" )
397398 }
398399}
399400
401+ func (b * Bootstrap ) StopClient () {
402+ if b .client == nil {
403+ return
404+ }
405+ err := b .client .Close ()
406+ if err != nil {
407+ b .logger .Err (err ).Msg ("CrossSporkClient graceful shutdown failed" )
408+ }
409+ }
410+
400411// StartEngine starts provided engine and panics if there are startup errors.
401412func StartEngine (
402413 ctx context.Context ,
@@ -466,12 +477,13 @@ func setupStorage(
466477 config * config.Config ,
467478 client * requester.CrossSporkClient ,
468479 logger zerolog.Logger ,
469- ) (* Storages , error ) {
480+ ) (* pebbleDB. DB , * Storages , error ) {
470481 // create pebble storage from the provided database root directory
471- store , err := pebble .New (config .DatabaseDir , logger )
482+ db , err := pebble .OpenDB (config .DatabaseDir )
472483 if err != nil {
473- return nil , err
484+ return nil , nil , err
474485 }
486+ store := pebble .New (db , logger )
475487
476488 blocks := pebble .NewBlocks (store , config .FlowNetworkID )
477489 storageAddress := evm .StorageAccountAddress (config .FlowNetworkID )
@@ -481,7 +493,7 @@ func setupStorage(
481493 if config .ForceStartCadenceHeight != 0 {
482494 logger .Warn ().Uint64 ("height" , config .ForceStartCadenceHeight ).Msg ("force setting starting Cadence height!!!" )
483495 if err := blocks .SetLatestCadenceHeight (config .ForceStartCadenceHeight , nil ); err != nil {
484- return nil , err
496+ return nil , nil , err
485497 }
486498 }
487499
@@ -500,12 +512,12 @@ func setupStorage(
500512 evmBlokcHeight := uint64 (0 )
501513 cadenceBlock , err := client .GetBlockHeaderByHeight (context .Background (), cadenceHeight )
502514 if err != nil {
503- return nil , fmt .Errorf ("could not fetch provided cadence height, make sure it's correct: %w" , err )
515+ return nil , nil , fmt .Errorf ("could not fetch provided cadence height, make sure it's correct: %w" , err )
504516 }
505517
506518 snapshot , err := registerStore .GetSnapshotAt (evmBlokcHeight )
507519 if err != nil {
508- return nil , fmt .Errorf ("could not get register snapshot at block height %d: %w" , 0 , err )
520+ return nil , nil , fmt .Errorf ("could not get register snapshot at block height %d: %w" , 0 , err )
509521 }
510522
511523 delta := storage .NewRegisterDelta (snapshot )
@@ -516,16 +528,16 @@ func setupStorage(
516528 accountStatus .ToBytes (),
517529 )
518530 if err != nil {
519- return nil , fmt .Errorf ("could not set account status: %w" , err )
531+ return nil , nil , fmt .Errorf ("could not set account status: %w" , err )
520532 }
521533
522534 err = registerStore .Store (delta .GetUpdates (), evmBlokcHeight , batch )
523535 if err != nil {
524- return nil , fmt .Errorf ("could not store register updates: %w" , err )
536+ return nil , nil , fmt .Errorf ("could not store register updates: %w" , err )
525537 }
526538
527539 if err := blocks .InitHeights (cadenceHeight , cadenceBlock .ID , batch ); err != nil {
528- return nil , fmt .Errorf (
540+ return nil , nil , fmt .Errorf (
529541 "failed to init the database for block height: %d and ID: %s, with : %w" ,
530542 cadenceHeight ,
531543 cadenceBlock .ID ,
@@ -535,7 +547,7 @@ func setupStorage(
535547
536548 err = batch .Commit (pebbleDB .Sync )
537549 if err != nil {
538- return nil , fmt .Errorf ("could not commit register updates: %w" , err )
550+ return nil , nil , fmt .Errorf ("could not commit register updates: %w" , err )
539551 }
540552
541553 logger .Info ().
@@ -546,7 +558,7 @@ func setupStorage(
546558 // // TODO(JanezP): verify storage account owner is correct
547559 //}
548560
549- return & Storages {
561+ return db , & Storages {
550562 Storage : store ,
551563 Blocks : blocks ,
552564 Registers : registerStore ,
@@ -591,6 +603,7 @@ func Run(ctx context.Context, cfg *config.Config, ready component.ReadyFunc) err
591603 boot .StopEventIngestion ()
592604 boot .StopMetricsServer ()
593605 boot .StopAPIServer ()
606+ boot .StopClient ()
594607 boot .StopDB ()
595608
596609 return nil
0 commit comments