diff --git a/CHANGELOG.md b/CHANGELOG.md index 67249c581..990489f9a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -23,6 +23,7 @@ Changelog for NeoFS Node - Allow to evacuate shard data with `EvacuateShard` control RPC (#1800) - Flush write-cache when moving shard to DEGRADED mode (#1825) - Make `morph.cache_ttl` default value equal to morph block time (#1846) +- Policer marks nodes under maintenance as OK without requests (#1680) ### Fixed - Description of command `netmap nodeinfo` (#1821) diff --git a/pkg/services/policer/check.go b/pkg/services/policer/check.go index e303219a0..2bd31e272 100644 --- a/pkg/services/policer/check.go +++ b/pkg/services/policer/check.go @@ -2,6 +2,7 @@ package policer import ( "context" + "encoding/hex" "github.com/nspcc-dev/neofs-node/pkg/core/container" "github.com/nspcc-dev/neofs-node/pkg/local_object_storage/engine" @@ -142,6 +143,18 @@ func (p *Policer) processNodes(ctx *processPlacementContext, addr oid.Address, nodes []netmap.NodeInfo, shortage uint32, checkedNodes *nodeCache) { prm := new(headsvc.RemoteHeadPrm).WithObjectAddress(addr) + handleMaintenance := func(node netmap.NodeInfo) { + // consider remote nodes under maintenance as problem OK. Such + // nodes MAY not respond with object, however, this is how we + // prevent spam with new replicas. + checkedNodes.submitReplicaHolder(node) + shortage-- + + p.log.Debug("consider node under maintenance as OK", + zap.String("node", hex.EncodeToString(node.PublicKey())), + ) + } + for i := 0; shortage > 0 && i < len(nodes); i++ { select { case <-ctx.Done(): @@ -153,6 +166,8 @@ func (p *Policer) processNodes(ctx *processPlacementContext, addr oid.Address, ctx.needLocalCopy = true shortage-- + } else if nodes[i].IsMaintenance() { + handleMaintenance(nodes[i]) } else { if status := checkedNodes.processStatus(nodes[i]); status >= 0 { if status == 0 {