forked from TrueCloudLab/frostfs-node
[#746] morph: Implement and use multi-client
There is a need to work with a set of Neo RPC nodes in order not to depend on the failure of some nodes while others are active. Support "multi-client" mode of morph `Client` entity. If instance is not "multi-client", it works as before. Constructor `New` creates multi-client, and each method performs iterating over the fixed set of endpoints until success. Opened client connections are cached (without eviction for now). Storage (as earlier) and IR (from now) nodes can be configured with multiple Neo endpoints. As above, `New` creates multi-client instance, so we don't need initialization changes on app-side. `Wait` and `GetDesignateHash` methods of `Client` return an error from now to detect connection errors. `NotaryEnabled` method is removed as unused. Signed-off-by: Leonard Lyubich <leonard@nspcc.ru>
This commit is contained in:
parent
f9218bf84f
commit
ad7ad12a0c
7 changed files with 345 additions and 89 deletions
|
@ -6,6 +6,7 @@ import (
|
|||
|
||||
"github.com/nspcc-dev/neo-go/pkg/core/native"
|
||||
"github.com/nspcc-dev/neo-go/pkg/crypto/keys"
|
||||
"github.com/nspcc-dev/neo-go/pkg/util"
|
||||
"github.com/nspcc-dev/neofs-node/pkg/morph/client"
|
||||
neofscontract "github.com/nspcc-dev/neofs-node/pkg/morph/client/neofs/wrapper"
|
||||
nmWrapper "github.com/nspcc-dev/neofs-node/pkg/morph/client/netmap/wrapper"
|
||||
|
@ -59,6 +60,8 @@ type (
|
|||
morphClient *client.Client
|
||||
|
||||
notaryDisabled bool
|
||||
|
||||
designate util.Uint160
|
||||
}
|
||||
|
||||
// Params of the processor constructor.
|
||||
|
@ -103,6 +106,12 @@ func New(p *Params) (*Processor, error) {
|
|||
return nil, fmt.Errorf("ir/governance: can't create worker pool: %w", err)
|
||||
}
|
||||
|
||||
// result is cached by neo-go, so we can pre-calc it
|
||||
designate, err := p.MainnetClient.GetDesignateHash()
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("could not get designate hash: %w", err)
|
||||
}
|
||||
|
||||
return &Processor{
|
||||
log: p.Log,
|
||||
pool: pool,
|
||||
|
@ -115,13 +124,14 @@ func New(p *Params) (*Processor, error) {
|
|||
mainnetClient: p.MainnetClient,
|
||||
morphClient: p.MorphClient,
|
||||
notaryDisabled: p.NotaryDisabled,
|
||||
designate: designate,
|
||||
}, nil
|
||||
}
|
||||
|
||||
// ListenerParsers for the 'event.Listener' event producer.
|
||||
func (gp *Processor) ListenerParsers() []event.ParserInfo {
|
||||
var pi event.ParserInfo
|
||||
pi.SetScriptHash(gp.mainnetClient.GetDesignateHash())
|
||||
pi.SetScriptHash(gp.designate)
|
||||
pi.SetType(event.TypeFromString(native.DesignationEventName))
|
||||
pi.SetParser(rolemanagement.ParseDesignate)
|
||||
return []event.ParserInfo{pi}
|
||||
|
@ -130,7 +140,7 @@ func (gp *Processor) ListenerParsers() []event.ParserInfo {
|
|||
// ListenerHandlers for the 'event.Listener' event producer.
|
||||
func (gp *Processor) ListenerHandlers() []event.HandlerInfo {
|
||||
var hi event.HandlerInfo
|
||||
hi.SetScriptHash(gp.mainnetClient.GetDesignateHash())
|
||||
hi.SetScriptHash(gp.designate)
|
||||
hi.SetType(event.TypeFromString(native.DesignationEventName))
|
||||
hi.SetHandler(gp.HandleAlphabetSync)
|
||||
return []event.HandlerInfo{hi}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue