diff --git a/relayer/chain/relaychain/connection.go b/relayer/chain/relaychain/connection.go index bdc92b76a0..3f20b491f8 100644 --- a/relayer/chain/relaychain/connection.go +++ b/relayer/chain/relaychain/connection.go @@ -7,6 +7,7 @@ import ( "context" "fmt" "sort" + "time" gsrpc "github.com/snowfork/go-substrate-rpc-client/v4" "github.com/snowfork/go-substrate-rpc-client/v4/types" @@ -65,6 +66,33 @@ func (co *Connection) Connect(_ context.Context) error { return nil } +func (co *Connection) ConnectWithHeartBeat(ctx context.Context, heartBeat time.Duration) error { + err := co.Connect(ctx) + if err != nil { + return err + } + + ticker := time.NewTicker(heartBeat) + + go func() { + defer ticker.Stop() + for { + select { + case <-ctx.Done(): + return + case <-ticker.C: + _, err := co.API().RPC.System.Version() + if err != nil { + log.WithField("endpoint", co.endpoint).Error("Connection heartbeat failed") + return + } + } + } + }() + + return nil +} + func (co *Connection) Close() { // TODO: Fix design issue in GSRPC preventing on-demand closing of connections } diff --git a/relayer/relays/beacon/main.go b/relayer/relays/beacon/main.go index 1e6c1937c8..231185caad 100644 --- a/relayer/relays/beacon/main.go +++ b/relayer/relays/beacon/main.go @@ -37,7 +37,7 @@ func (r *Relay) Start(ctx context.Context, eg *errgroup.Group) error { paraconn := parachain.NewConnection(r.config.Sink.Parachain.Endpoint, r.keypair.AsKeyringPair()) - err := paraconn.ConnectWithHeartBeat(ctx, 60*time.Second) + err := paraconn.ConnectWithHeartBeat(ctx, 30*time.Second) if err != nil { return err } diff --git a/relayer/relays/beefy/main.go b/relayer/relays/beefy/main.go index 209e33e5d8..b379ce7461 100644 --- a/relayer/relays/beefy/main.go +++ b/relayer/relays/beefy/main.go @@ -3,6 +3,7 @@ package beefy import ( "context" "fmt" + "time" "golang.org/x/sync/errgroup" @@ -44,7 +45,7 @@ func NewRelay(config *Config, ethereumKeypair *secp256k1.Keypair) (*Relay, error } func (relay *Relay) Start(ctx context.Context, eg *errgroup.Group) error { - err := relay.relaychainConn.Connect(ctx) + err := relay.relaychainConn.ConnectWithHeartBeat(ctx, 30*time.Second) if err != nil { return fmt.Errorf("create relaychain connection: %w", err) } diff --git a/relayer/relays/execution/main.go b/relayer/relays/execution/main.go index a06631d9ee..099d263938 100644 --- a/relayer/relays/execution/main.go +++ b/relayer/relays/execution/main.go @@ -50,7 +50,7 @@ func (r *Relay) Start(ctx context.Context, eg *errgroup.Group) error { paraconn := parachain.NewConnection(r.config.Sink.Parachain.Endpoint, r.keypair.AsKeyringPair()) ethconn := ethereum.NewConnection(&r.config.Source.Ethereum, nil) - err := paraconn.ConnectWithHeartBeat(ctx, 20*time.Second) + err := paraconn.ConnectWithHeartBeat(ctx, 30*time.Second) if err != nil { return err } diff --git a/relayer/relays/parachain/main.go b/relayer/relays/parachain/main.go index 5ce1c1b9c6..d66da938fd 100644 --- a/relayer/relays/parachain/main.go +++ b/relayer/relays/parachain/main.go @@ -3,6 +3,7 @@ package parachain import ( "context" "fmt" + "time" "golang.org/x/sync/errgroup" @@ -66,7 +67,7 @@ func NewRelay(config *Config, keypair *secp256k1.Keypair) (*Relay, error) { } func (relay *Relay) Start(ctx context.Context, eg *errgroup.Group) error { - err := relay.parachainConn.Connect(ctx) + err := relay.parachainConn.ConnectWithHeartBeat(ctx, 30*time.Second) if err != nil { return err }