From e41e74b5fcdc86fca9686f7c7ca397322c979a2d Mon Sep 17 00:00:00 2001 From: Alex Vanin Date: Tue, 5 Oct 2021 14:53:18 +0300 Subject: [PATCH] [#872] services/container: Ignore passed routes in load router Higher level solution for original issue with lost announcements from single node container. Signed-off-by: Alex Vanin --- cmd/neofs-node/container.go | 17 ++++++++++++++++- .../announcement/load/route/placement/calls.go | 11 ++++++++++- 2 files changed, 26 insertions(+), 2 deletions(-) diff --git a/cmd/neofs-node/container.go b/cmd/neofs-node/container.go index dabcdefd2..b57b983e8 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 ae11ab434..7b4164da9 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