Browse Source

Fix context.Canceled wrapping in compaction

We need to make sure that `tsdb_errors.NewMulti` handles the errors.Is()
calls properly, like it's done in grafana/dskit.

Also we need to check that `errors.Is(err, context.Canceled)`, not that
`err == context.Canceled`.

Signed-off-by: Oleg Zaytsev <mail@olegzaytsev.com>
pull/12179/head
Oleg Zaytsev 2 years ago
parent
commit
344c630857
No known key found for this signature in database
GPG Key ID: 7E9FE9FD48F512EF
  1. 2
      tsdb/compact.go
  2. 14
      tsdb/errors/errors.go

2
tsdb/compact.go

@ -471,7 +471,7 @@ func (c *LeveledCompactor) Compact(dest string, dirs []string, open []*Block) (u
} }
errs := tsdb_errors.NewMulti(err) errs := tsdb_errors.NewMulti(err)
if err != context.Canceled { if !errors.Is(err, context.Canceled) {
for _, b := range bs { for _, b := range bs {
if err := b.setCompactionFailed(); err != nil { if err := b.setCompactionFailed(); err != nil {
errs.Add(errors.Wrapf(err, "setting compaction failed for block: %s", b.Dir())) errs.Add(errors.Wrapf(err, "setting compaction failed for block: %s", b.Dir()))

14
tsdb/errors/errors.go

@ -16,6 +16,7 @@ package errors
import ( import (
"bytes" "bytes"
"errors"
"fmt" "fmt"
"io" "io"
) )
@ -79,6 +80,19 @@ func (es nonNilMultiError) Error() string {
return buf.String() return buf.String()
} }
// Is attempts to match the provided error against errors in the error list.
//
// This function allows errors.Is to traverse the values stored in the MultiError.
// It returns true if any of the errors in the list match the target.
func (es nonNilMultiError) Is(target error) bool {
for _, err := range es.errs {
if errors.Is(err, target) {
return true
}
}
return false
}
// CloseAll closes all given closers while recording error in MultiError. // CloseAll closes all given closers while recording error in MultiError.
func CloseAll(cs []io.Closer) error { func CloseAll(cs []io.Closer) error {
errs := NewMulti() errs := NewMulti()

Loading…
Cancel
Save