Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion controllers/node_handler.go
Original file line number Diff line number Diff line change
Expand Up @@ -83,7 +83,7 @@ func ApplyProfiles(ctx context.Context, params reconcileParameters, data *state.
if err == nil {
continue
}
if errors.Is(err, retryErr) {
if errors.As(err, &retryErr) {

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Btw since go 1.26.0 we have new errors.AsType() func

if retryErr, ok := errors.AsType[*plugin.RetryError](err); ok {
    ...
}

Maybe you find it pretty :)

profilesWithRetryError[ps.Profile.Name] = struct{}{}
} else {
errs = append(errs, err)
Expand Down
3 changes: 2 additions & 1 deletion plugin/impl/eviction.go
Original file line number Diff line number Diff line change
Expand Up @@ -94,7 +94,8 @@ func (e *Eviction) Trigger(params plugin.Parameters) error {
ForceEviction: e.ForceEviction,
})
if err != nil {
return err
params.Log.Error(err, "Drain encountered errors; will retry next reconcile", "node", params.Node.Name)
return &plugin.RetryError{Message: err.Error()}
}
if !drained {
params.Log.Info("Drain still in progress; will continue in next reconcile", "node", params.Node.Name)
Expand Down
21 changes: 20 additions & 1 deletion plugin/plugin_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ func TestPlugins(t *testing.T) {
RunSpecs(t, "Plugin Suite")
}

var _ = Describe("CheckError", func() {
var _ = Describe("ChainError", func() {
chainErr := ChainError{
Message: "msg",
Err: errors.New("err"),
Expand All @@ -35,6 +35,25 @@ var _ = Describe("CheckError", func() {
})
})

var _ = Describe("RetryError", func() {
It("is extractable via errors.As through ChainError wrapping", func() {
retryErr := &RetryError{Message: "drain still in progress"}
wrapped := &ChainError{Message: "trigger chain failed", Err: retryErr}

var extracted *RetryError
Expect(errors.As(wrapped, &extracted)).To(BeTrue())
Expect(extracted.Message).To(Equal("drain still in progress"))
})

It("is not matched by errors.Is with a different instance", func() {
retryErr := &RetryError{Message: "some error"}
wrapped := &ChainError{Message: "trigger chain failed", Err: retryErr}

// errors.Is uses pointer identity for types without Is() method
Expect(errors.Is(wrapped, &RetryError{})).To(BeFalse())
})
})

var _ = Describe("Registry", func() {
var emptyConfig *ucfgwrap.Config

Expand Down
3 changes: 2 additions & 1 deletion state/state.go
Original file line number Diff line number Diff line change
Expand Up @@ -192,7 +192,8 @@ func Apply(state NodeState, node *v1.Node, data *Data, params plugin.Parameters)
}
if stateInfo.Previous != stateInfo.Current {
err := state.Enter(params, data)
if errors.Is(err, &plugin.RetryError{}) {
var retryErr *plugin.RetryError
if errors.As(err, &retryErr) {
return result, err
}
if err != nil {
Expand Down
Loading