summaryrefslogtreecommitdiff
path: root/internal
diff options
context:
space:
mode:
authorPaul Buetow <paul@buetow.org>2026-03-10 07:57:31 +0200
committerPaul Buetow <paul@buetow.org>2026-03-10 07:57:31 +0200
commite9bdf85b11e9c75f19721384f1c1b34b0f2f4ea0 (patch)
tree50a25a038c5b8abdd4f7a88b0e988257acb8f34c /internal
parent0930b4c51191ec01cabc03779ef296153ed7f08a (diff)
internal: add context to BPF setup failures (task 416)
Diffstat (limited to 'internal')
-rw-r--r--internal/ior.go17
-rw-r--r--internal/ior_setup_test.go27
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)
+ }
+}