forked from TrueCloudLab/frostfs-node
[#493] node: Connect to main chain
Establish client connection with main chain node on storage node startup. Client is configured simlarly to morph client. Signed-off-by: Leonard Lyubich <leonard@nspcc.ru>
This commit is contained in:
parent
1fa49bca9c
commit
6339f1a468
2 changed files with 47 additions and 21 deletions
|
@ -80,6 +80,9 @@ const (
|
||||||
cfgMorphNotifyRPCAddress = "morph.notification_endpoint"
|
cfgMorphNotifyRPCAddress = "morph.notification_endpoint"
|
||||||
cfgMorphNotifyDialTimeout = "morph.dial_timeout"
|
cfgMorphNotifyDialTimeout = "morph.dial_timeout"
|
||||||
|
|
||||||
|
cfgMainChainRPCAddress = "mainchain.rpc_endpoint"
|
||||||
|
cfgMainChainDialTimeout = "mainchain.dial_timeout"
|
||||||
|
|
||||||
// config keys for cfgAccounting
|
// config keys for cfgAccounting
|
||||||
cfgAccountingContract = "accounting.scripthash"
|
cfgAccountingContract = "accounting.scripthash"
|
||||||
cfgAccountingFee = "accounting.fee"
|
cfgAccountingFee = "accounting.fee"
|
||||||
|
@ -219,6 +222,8 @@ type cfg struct {
|
||||||
closers []func()
|
closers []func()
|
||||||
|
|
||||||
cfgReputation cfgReputation
|
cfgReputation cfgReputation
|
||||||
|
|
||||||
|
mainChainClient *client.Client
|
||||||
}
|
}
|
||||||
|
|
||||||
type cfgGRPC struct {
|
type cfgGRPC struct {
|
||||||
|
|
|
@ -4,6 +4,7 @@ import (
|
||||||
"context"
|
"context"
|
||||||
"errors"
|
"errors"
|
||||||
"fmt"
|
"fmt"
|
||||||
|
"time"
|
||||||
|
|
||||||
"github.com/nspcc-dev/neo-go/pkg/core/block"
|
"github.com/nspcc-dev/neo-go/pkg/core/block"
|
||||||
"github.com/nspcc-dev/neo-go/pkg/util"
|
"github.com/nspcc-dev/neo-go/pkg/util"
|
||||||
|
@ -27,31 +28,51 @@ var (
|
||||||
func initMorphComponents(c *cfg) {
|
func initMorphComponents(c *cfg) {
|
||||||
var err error
|
var err error
|
||||||
|
|
||||||
addresses := c.viper.GetStringSlice(cfgMorphRPCAddress)
|
fn := func(endpointCfg, dialTOCfg string, handler func(*client.Client)) {
|
||||||
if len(addresses) == 0 {
|
addresses := c.viper.GetStringSlice(endpointCfg)
|
||||||
fatalOnErr(errNoRPCEndpoints)
|
if len(addresses) == 0 {
|
||||||
}
|
fatalOnErr(errNoRPCEndpoints)
|
||||||
|
|
||||||
crand := rand.New() // math/rand with cryptographic source
|
|
||||||
crand.Shuffle(len(addresses), func(i, j int) {
|
|
||||||
addresses[i], addresses[j] = addresses[j], addresses[i]
|
|
||||||
})
|
|
||||||
|
|
||||||
for i := range addresses {
|
|
||||||
c.cfgMorph.client, err = client.New(c.key, addresses[i])
|
|
||||||
if err == nil {
|
|
||||||
c.log.Info("neo RPC connection established",
|
|
||||||
zap.String("endpoint", addresses[i]))
|
|
||||||
|
|
||||||
break
|
|
||||||
}
|
}
|
||||||
|
|
||||||
c.log.Info("failed to establish neo RPC connection, trying another",
|
crand := rand.New() // math/rand with cryptographic source
|
||||||
zap.String("endpoint", addresses[i]),
|
crand.Shuffle(len(addresses), func(i, j int) {
|
||||||
zap.String("error", err.Error()))
|
addresses[i], addresses[j] = addresses[j], addresses[i]
|
||||||
|
})
|
||||||
|
|
||||||
|
var dialTimeout time.Duration
|
||||||
|
|
||||||
|
if dialTOCfg != "" {
|
||||||
|
dialTimeout = c.viper.GetDuration(dialTOCfg)
|
||||||
|
}
|
||||||
|
|
||||||
|
for i := range addresses {
|
||||||
|
cli, err := client.New(c.key, addresses[i], client.WithDialTimeout(dialTimeout))
|
||||||
|
if err == nil {
|
||||||
|
c.log.Info("neo RPC connection established",
|
||||||
|
zap.String("endpoint", addresses[i]))
|
||||||
|
|
||||||
|
handler(cli)
|
||||||
|
|
||||||
|
break
|
||||||
|
}
|
||||||
|
|
||||||
|
c.log.Info("failed to establish neo RPC connection, trying another",
|
||||||
|
zap.String("endpoint", addresses[i]),
|
||||||
|
zap.String("error", err.Error()))
|
||||||
|
}
|
||||||
|
|
||||||
|
fatalOnErr(err)
|
||||||
}
|
}
|
||||||
|
|
||||||
fatalOnErr(err)
|
// replace to a separate initialing block during refactoring
|
||||||
|
// since current function initializes sidechain components
|
||||||
|
fn(cfgMainChainRPCAddress, cfgMainChainDialTimeout, func(cli *client.Client) {
|
||||||
|
c.mainChainClient = cli
|
||||||
|
})
|
||||||
|
|
||||||
|
fn(cfgMorphRPCAddress, "", func(cli *client.Client) {
|
||||||
|
c.cfgMorph.client = cli
|
||||||
|
})
|
||||||
|
|
||||||
staticClient, err := client.NewStatic(
|
staticClient, err := client.NewStatic(
|
||||||
c.cfgMorph.client,
|
c.cfgMorph.client,
|
||||||
|
|
Loading…
Reference in a new issue