diff options
| author | Paul Buetow <paul@buetow.org> | 2026-03-10 07:57:31 +0200 |
|---|---|---|
| committer | Paul Buetow <paul@buetow.org> | 2026-03-10 07:57:31 +0200 |
| commit | e9bdf85b11e9c75f19721384f1c1b34b0f2f4ea0 (patch) | |
| tree | 50a25a038c5b8abdd4f7a88b0e988257acb8f34c /internal | |
| parent | 0930b4c51191ec01cabc03779ef296153ed7f08a (diff) | |
internal: add context to BPF setup failures (task 416)
Diffstat (limited to 'internal')
| -rw-r--r-- | internal/ior.go | 17 | ||||
| -rw-r--r-- | internal/ior_setup_test.go | 27 |
2 files changed, 39 insertions, 5 deletions
diff --git a/internal/ior.go b/internal/ior.go index 9f58821..ad46feb 100644 --- a/internal/ior.go +++ b/internal/ior.go @@ -308,31 +308,38 @@ func newLogger(verbose bool) func(...any) { return func(args ...any) { _, _ = fmt.Println(args...) } } +func setupBPFModuleError(stage string, err error) error { + if err == nil { + return nil + } + return fmt.Errorf("setup BPF module: %s: %w", stage, err) +} + func setupBPFModule(parentCtx context.Context, cfg flags.Config) (*bpf.Module, *probemanager.Manager, func(), error) { releaseBindings := func() {} bpfModule, err := bpf.NewModuleFromFile("ior.bpf.o") if err != nil { - return nil, nil, releaseBindings, err + return nil, nil, releaseBindings, setupBPFModuleError("load module from file", err) } if err := resizeBPFMaps(cfg, bpfModule); err != nil { bpfModule.Close() - return nil, nil, releaseBindings, err + return nil, nil, releaseBindings, setupBPFModuleError("resize maps", err) } if err := setBPFGlobals(cfg, bpfModule); err != nil { bpfModule.Close() - return nil, nil, releaseBindings, err + return nil, nil, releaseBindings, setupBPFModuleError("set globals", err) } if err := bpfModule.BPFLoadObject(); err != nil { bpfModule.Close() - return nil, nil, releaseBindings, err + return nil, nil, releaseBindings, setupBPFModuleError("load object", err) } mgr := probemanager.NewManager(libbpfTracepointModule{module: bpfModule}) if err := mgr.AttachAll(cfg.ShouldIAttachTracepoint, tracepoints.List); err != nil { mgr.Close() bpfModule.Close() - return nil, nil, releaseBindings, err + return nil, nil, releaseBindings, setupBPFModuleError("attach probes", err) } if bindings, ok := tui.RuntimeBindingsFromContext(parentCtx); ok { bindings.SetProbeManager(mgr) diff --git a/internal/ior_setup_test.go b/internal/ior_setup_test.go new file mode 100644 index 0000000..9c8b1b3 --- /dev/null +++ b/internal/ior_setup_test.go @@ -0,0 +1,27 @@ +package internal + +import ( + "errors" + "testing" +) + +func TestSetupBPFModuleErrorWrapsStage(t *testing.T) { + cause := errors.New("boom") + + err := setupBPFModuleError("load object", cause) + if err == nil { + t.Fatalf("expected wrapped error") + } + if got, want := err.Error(), "setup BPF module: load object: boom"; got != want { + t.Fatalf("wrapped error = %q, want %q", got, want) + } + if !errors.Is(err, cause) { + t.Fatalf("expected wrapped error to retain original cause") + } +} + +func TestSetupBPFModuleErrorNil(t *testing.T) { + if err := setupBPFModuleError("attach probes", nil); err != nil { + t.Fatalf("expected nil error passthrough, got %v", err) + } +} |
