[#1681] ir/netmap: Check MAINTENANCE state in UpdateState

Storage node can be requested to be switched into `MAINTENANCE` state.
Inner Ring should accept such requests only if network configuration
allows it.

Make `Processor` of Netmap contract's notifications to depend on
`state.NetworkSettings`. Make `Processor.processUpdatePeer` to call
`MaintenanceModeAllowed` if notification event relates to `MAINTENANCE`
mode`. Share singe `state.NetworkSettings` provider in Inner Ring
application.

Signed-off-by: Leonard Lyubich <leonard@nspcc.ru>
This commit is contained in:
Leonard Lyubich 2022-09-19 20:34:53 +04:00 committed by fyrchik
parent bdb8243a5a
commit 6a2ec21641
3 changed files with 30 additions and 2 deletions

View file

@ -690,8 +690,10 @@ func New(ctx context.Context, log *zap.Logger, cfg *viper.Viper, errChan chan<-
} }
} }
netSettings := (*networkSettings)(server.netmapClient)
var netMapCandidateStateValidator statevalidation.NetMapCandidateValidator var netMapCandidateStateValidator statevalidation.NetMapCandidateValidator
netMapCandidateStateValidator.SetNetworkSettings((*networkSettings)(server.netmapClient)) netMapCandidateStateValidator.SetNetworkSettings(netSettings)
// create netmap processor // create netmap processor
server.netmapProcessor, err = netmap.New(&netmap.Params{ server.netmapProcessor, err = netmap.New(&netmap.Params{
@ -722,6 +724,8 @@ func New(ctx context.Context, log *zap.Logger, cfg *viper.Viper, errChan chan<-
), ),
NotaryDisabled: server.sideNotaryConfig.disabled, NotaryDisabled: server.sideNotaryConfig.disabled,
SubnetContract: &server.contracts.subnet, SubnetContract: &server.contracts.subnet,
NodeStateSettings: netSettings,
}) })
if err != nil { if err != nil {
return nil, err return nil, err

View file

@ -107,14 +107,29 @@ func (np *Processor) processUpdatePeer(ev netmapEvent.UpdatePeer) {
var err error var err error
if ev.Maintenance() {
err = np.nodeStateSettings.MaintenanceModeAllowed()
if err != nil {
np.log.Info("prevent switching node to maintenance state",
zap.Error(err),
)
return
}
}
if nr := ev.NotaryRequest(); nr != nil { if nr := ev.NotaryRequest(); nr != nil {
err = np.netmapClient.Morph().NotarySignAndInvokeTX(nr.MainTransaction) err = np.netmapClient.Morph().NotarySignAndInvokeTX(nr.MainTransaction)
} else { } else {
prm := netmapclient.UpdatePeerPrm{} prm := netmapclient.UpdatePeerPrm{}
if ev.Online() { switch {
case ev.Online():
prm.SetOnline() prm.SetOnline()
case ev.Maintenance():
prm.SetMaintenance()
} }
prm.SetKey(ev.PublicKey().Bytes()) prm.SetKey(ev.PublicKey().Bytes())
err = np.netmapClient.UpdatePeerState(prm) err = np.netmapClient.UpdatePeerState(prm)

View file

@ -6,6 +6,7 @@ import (
"github.com/nspcc-dev/neo-go/pkg/core/mempoolevent" "github.com/nspcc-dev/neo-go/pkg/core/mempoolevent"
"github.com/nspcc-dev/neo-go/pkg/util" "github.com/nspcc-dev/neo-go/pkg/util"
"github.com/nspcc-dev/neofs-node/pkg/innerring/processors/netmap/nodevalidation/state"
"github.com/nspcc-dev/neofs-node/pkg/morph/client/container" "github.com/nspcc-dev/neofs-node/pkg/morph/client/container"
nmClient "github.com/nspcc-dev/neofs-node/pkg/morph/client/netmap" nmClient "github.com/nspcc-dev/neofs-node/pkg/morph/client/netmap"
"github.com/nspcc-dev/neofs-node/pkg/morph/event" "github.com/nspcc-dev/neofs-node/pkg/morph/event"
@ -74,6 +75,8 @@ type (
nodeValidator NodeValidator nodeValidator NodeValidator
notaryDisabled bool notaryDisabled bool
nodeStateSettings state.NetworkSettings
} }
// Params of the processor constructor. // Params of the processor constructor.
@ -97,6 +100,8 @@ type (
NodeValidator NodeValidator NodeValidator NodeValidator
NotaryDisabled bool NotaryDisabled bool
NodeStateSettings state.NetworkSettings
} }
) )
@ -132,6 +137,8 @@ func New(p *Params) (*Processor, error) {
return nil, errors.New("ir/netmap: node validator is not set") return nil, errors.New("ir/netmap: node validator is not set")
case p.SubnetContract == nil: case p.SubnetContract == nil:
return nil, errors.New("ir/netmap: subnet contract script hash is not set") return nil, errors.New("ir/netmap: subnet contract script hash is not set")
case p.NodeStateSettings == nil:
return nil, errors.New("ir/netmap: node state settings is not set")
} }
p.Log.Debug("netmap worker pool", zap.Int("size", p.PoolSize)) p.Log.Debug("netmap worker pool", zap.Int("size", p.PoolSize))
@ -162,6 +169,8 @@ func New(p *Params) (*Processor, error) {
nodeValidator: p.NodeValidator, nodeValidator: p.NodeValidator,
notaryDisabled: p.NotaryDisabled, notaryDisabled: p.NotaryDisabled,
nodeStateSettings: p.NodeStateSettings,
}, nil }, nil
} }