Compare commits

...

2 commits

Author SHA1 Message Date
8484462310 [#257] pool/tree: Add node address to error
All checks were successful
DCO / DCO (pull_request) Successful in 43s
Tests and linters / Tests (1.21) (pull_request) Successful in 52s
Tests and linters / Tests (1.22) (pull_request) Successful in 50s
Tests and linters / Lint (pull_request) Successful in 1m19s
Signed-off-by: Denis Kirillov <d.kirillov@yadro.com>
2024-08-20 12:47:24 +03:00
23255806d0 [#253] pool: Don't count regular FrostFS errors
Previously we count all frostfs errors like:
ObjectNotFound, EACLNotFound
because frostfs status is unconditionally resolved into built-in go errors
but handleError method handled built-in errors like internal network ones.
Since after resolving frostfs errors status is also returned we start check this first

(cherry picked from commit 203bba65a0)

Signed-off-by: Denis Kirillov <d.kirillov@yadro.com>
2024-08-20 12:47:06 +03:00
3 changed files with 39 additions and 10 deletions

View file

@ -1180,6 +1180,22 @@ func (c *clientWrapper) close() error {
} }
func (c *clientStatusMonitor) handleError(ctx context.Context, st apistatus.Status, err error) error { func (c *clientStatusMonitor) handleError(ctx context.Context, st apistatus.Status, err error) error {
if stErr := apistatus.ErrFromStatus(st); stErr != nil {
switch stErr.(type) {
case *apistatus.ServerInternal,
*apistatus.WrongMagicNumber,
*apistatus.SignatureVerification,
*apistatus.NodeUnderMaintenance:
c.incErrorRate()
}
if err == nil {
err = stErr
}
return err
}
if err != nil { if err != nil {
if needCountError(ctx, err) { if needCountError(ctx, err) {
c.incErrorRate() c.incErrorRate()
@ -1188,16 +1204,7 @@ func (c *clientStatusMonitor) handleError(ctx context.Context, st apistatus.Stat
return err return err
} }
err = apistatus.ErrFromStatus(st) return nil
switch err.(type) {
case *apistatus.ServerInternal,
*apistatus.WrongMagicNumber,
*apistatus.SignatureVerification,
*apistatus.NodeUnderMaintenance:
c.incErrorRate()
}
return err
} }
func needCountError(ctx context.Context, err error) bool { func needCountError(ctx context.Context, err error) bool {

View file

@ -609,6 +609,23 @@ func TestHandleError(t *testing.T) {
expectedError: true, expectedError: true,
countError: false, countError: false,
}, },
{
ctx: ctx,
status: new(apistatus.ObjectNotFound),
err: &apistatus.ObjectNotFound{},
expectedError: true,
countError: false,
},
{
ctx: ctx,
status: nil,
err: &apistatus.EACLNotFound{},
expectedError: true,
// we expect error be counted because status is nil
// currently we assume that DisableFrostFSErrorResolution be always false for pool
// and status be checked first in handleError
countError: true,
},
{ {
ctx: ctx, ctx: ctx,
status: new(apistatus.ServerInternal), status: new(apistatus.ServerInternal),

View file

@ -836,6 +836,11 @@ LOOP:
if startI != indexI || startJ != indexJ { if startI != indexI || startJ != indexJ {
p.setStartIndices(indexI, indexJ) p.setStartIndices(indexI, indexJ)
} }
if err != nil {
err = fmt.Errorf("address %s: %w", p.innerPools[indexI].clients[indexJ].endpoint(), err)
}
return err return err
} }