Skip to content

Commit

Permalink
[#778] services/object: Return the composite error of PUT operation
Browse files Browse the repository at this point in the history
In previous implementation Object service's handler returned const error in
case of failure (full or partial) of PUT operation. This did not even allow
us to roughly guess what the reason is. Not as a complete solution, but to
alleviate some cases where all nodes in a container return the same error,
it is suggested to return the error of the last server that responded.

Return latest server error from placement loop of `iteratePlacement` method
of `distributedTarget` type.

Signed-off-by: Leonard Lyubich <leonard@nspcc.ru>
  • Loading branch information
Leonard Lyubich committed Sep 8, 2021
1 parent 7405155 commit b920101
Showing 1 changed file with 8 additions and 0 deletions.
8 changes: 8 additions & 0 deletions pkg/services/object/put/distributed.go
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ import (
"errors"
"fmt"
"sync"
"sync/atomic"

"github.com/nspcc-dev/neofs-node/pkg/core/object"
svcutil "github.com/nspcc-dev/neofs-node/pkg/services/object/util"
Expand Down Expand Up @@ -93,6 +94,8 @@ func (t *distributedTarget) iteratePlacement(f func(placement.Node) error) (*tra
return nil, fmt.Errorf("(%T) could not create object placement traverser: %w", t, err)
}

var resErr atomic.Value

loop:
for {
addrs := traverser.Next()
Expand All @@ -110,6 +113,7 @@ loop:
defer wg.Done()

if err := f(addr); err != nil {
resErr.Store(err)
svcutil.LogServiceError(t.log, "PUT", addr.Addresses(), err)
return
}
Expand All @@ -128,6 +132,10 @@ loop:
}

if !traverser.Success() {
if err, ok := resErr.Load().(error); ok {
return nil, err
}

return nil, errIncompletePut
}

Expand Down

0 comments on commit b920101

Please sign in to comment.