[#607] placement: Make traverser to return list of address groups

Make placement `Traverser.Next` method to return ``[]network.AddressGroup`
in order to support multiple addresses of the storeage nodes.

Signed-off-by: Leonard Lyubich <leonard@nspcc.ru>
remotes/fyrchik/meta-pebble
Leonard Lyubich 2021-06-22 18:22:40 +03:00 committed by Leonard Lyubich
parent 8ac3c62518
commit b3dd9a3254
6 changed files with 15 additions and 17 deletions

View File

@ -3,7 +3,6 @@ package getsvc
import (
"context"
"github.com/nspcc-dev/neofs-node/pkg/network"
"go.uber.org/zap"
)
@ -79,7 +78,7 @@ func (exec *execCtx) processCurrentEpoch() bool {
// TODO: consider parallel execution
// TODO: consider optimization: if status == SPLIT we can continue until
// we reach the best result - split info with linking object ID.
if exec.processNode(ctx, network.GroupFromAddress(addrs[i])) {
if exec.processNode(ctx, addrs[i]) {
exec.log.Debug("completing the operation")
return true
}

View File

@ -110,7 +110,7 @@ loop:
if err := t.workerPool.Submit(func() {
defer wg.Done()
if err := f(network.GroupFromAddress(addr)); err != nil {
if err := f(addr); err != nil {
svcutil.LogServiceError(t.log, "PUT", addr, err)
return
}

View File

@ -3,7 +3,6 @@ package searchsvc
import (
"context"
"github.com/nspcc-dev/neofs-node/pkg/network"
"go.uber.org/zap"
)
@ -77,7 +76,7 @@ func (exec *execCtx) processCurrentEpoch() bool {
}
// TODO: consider parallel execution
exec.processNode(ctx, network.GroupFromAddress(addrs[i]))
exec.processNode(ctx, addrs[i])
}
}

View File

@ -7,9 +7,9 @@ import (
)
// LogServiceError writes debug error message of object service to provided logger.
func LogServiceError(l *logger.Logger, req string, node network.Address, err error) {
func LogServiceError(l *logger.Logger, req string, node network.AddressGroup, err error) {
l.Debug("object service error",
zap.Stringer("node", node),
zap.String("node", network.StringifyGroup(node)),
zap.String("request", req),
zap.String("error", err.Error()),
)

View File

@ -122,7 +122,7 @@ func flatNodes(ns []netmap.Nodes) []netmap.Nodes {
// Next returns next unprocessed address of the object placement.
//
// Returns nil if no nodes left or traversal operation succeeded.
func (t *Traverser) Next() []network.Address {
func (t *Traverser) Next() []network.AddressGroup {
t.mtx.Lock()
defer t.mtx.Unlock()
@ -139,10 +139,10 @@ func (t *Traverser) Next() []network.Address {
count = len(t.vectors[0])
}
addrs := make([]network.Address, count)
addrs := make([]network.AddressGroup, count)
for i := 0; i < count; i++ {
err := addrs[i].FromString(t.vectors[0][i].Address())
err := addrs[i].FromIterator(t.vectors[0][i])
if err != nil {
// TODO: log error
return nil

View File

@ -65,12 +65,12 @@ func testPlacement(t *testing.T, ss, rs []int) ([]netmap.Nodes, *container.Conta
return nodes, container.New(container.WithPolicy(policy))
}
func assertSameAddress(t *testing.T, ni *netmap.NodeInfo, addr network.Address) {
var netAddr network.Address
func assertSameAddress(t *testing.T, ni *netmap.NodeInfo, addr network.AddressGroup) {
var netAddr network.AddressGroup
err := netAddr.FromString(ni.Address())
err := netAddr.FromIterator(ni)
require.NoError(t, err)
require.True(t, netAddr.Equal(addr))
require.True(t, netAddr.Intersects(addr))
}
func TestTraverserObjectScenarios(t *testing.T) {
@ -124,12 +124,12 @@ func TestTraverserObjectScenarios(t *testing.T) {
require.NotNil(t, tr.Next())
}
var n network.Address
var n network.AddressGroup
err = n.FromString(nodes[1][0].Address())
err = n.FromIterator(nodes[1][0])
require.NoError(t, err)
require.Equal(t, []network.Address{n}, tr.Next())
require.Equal(t, []network.AddressGroup{n}, tr.Next())
})
t.Run("put scenario", func(t *testing.T) {