diff --git a/cmd/neofs-node/container.go b/cmd/neofs-node/container.go index dabcdefd2a..b57b983e8b 100644 --- a/cmd/neofs-node/container.go +++ b/cmd/neofs-node/container.go @@ -228,6 +228,16 @@ func (*morphLoadWriter) Close() error { return nil } +type nopLoadWriter struct{} + +func (nopLoadWriter) Put(containerSDK.UsedSpaceAnnouncement) error { + return nil +} + +func (nopLoadWriter) Close() error { + return nil +} + type remoteLoadAnnounceProvider struct { key *ecdsa.PrivateKey @@ -241,10 +251,15 @@ type remoteLoadAnnounceProvider struct { } func (r *remoteLoadAnnounceProvider) InitRemote(srv loadroute.ServerInfo) (loadcontroller.WriterProvider, error) { - if srv == nil || r.netmapKeys.IsLocalKey(srv.PublicKey()) { + if srv == nil { return r.deadEndProvider, nil } + if r.netmapKeys.IsLocalKey(srv.PublicKey()) { + // if local => return no-op writer + return loadcontroller.SimpleWriterProvider(new(nopLoadWriter)), nil + } + var info client.NodeInfo err := client.NodeInfoFromRawNetmapElement(&info, srv) diff --git a/pkg/services/container/announcement/load/route/placement/calls.go b/pkg/services/container/announcement/load/route/placement/calls.go index ae11ab4346..7b4164da95 100644 --- a/pkg/services/container/announcement/load/route/placement/calls.go +++ b/pkg/services/container/announcement/load/route/placement/calls.go @@ -1,6 +1,7 @@ package placementrouter import ( + "bytes" "fmt" "github.com/nspcc-dev/neofs-api-go/pkg/container" @@ -30,7 +31,15 @@ func (b *Builder) NextStage(a container.UsedSpaceAnnouncement, passed []loadrout continue } - res = append(res, placement[i][0]) + target := placement[i][0] + + if len(passed) == 1 && bytes.Equal(passed[0].PublicKey(), target.PublicKey()) { + // add nil element so the announcement will be saved in local memory + res = append(res, nil) + } else { + // add element with remote node to send announcement to + res = append(res, target) + } } return res, nil