diff options
| author | Paul Buetow <paul@buetow.org> | 2026-05-13 14:41:28 +0300 |
|---|---|---|
| committer | Paul Buetow <paul@buetow.org> | 2026-05-13 14:41:28 +0300 |
| commit | de3405c275898c8cd528a636dbd40e1b685cfaa5 (patch) | |
| tree | 53711959800677aa694e18331476add24a21b8ef /internal/tui/tui.go | |
| parent | d392eebe5bd127e1573734321b0cabaad4182d7c (diff) | |
use errgroup instead of WaitGroup for concurrent snapshot builders
Replace sync.WaitGroup with errgroup.Group in buildSubSnapshots so errors from
sub-builders (buildSyscallSnapshots, buildFileSnapshots, buildProcessSnapshots,
buildHistogramSnapshot) are captured and propagated rather than silently dropped.
Change Engine.Snapshot() to return (*Snapshot, error), update runtime.SnapshotSource
and dashboard.SnapshotSource interfaces accordingly, and adjust all callers in
tui.go, dashboard/model.go, and the test helpers.
Each sub-builder now returns (result, error); the error return is currently
always nil but establishes the contract for future validation. The per-type
Snapshot() convenience methods (histogram, syscall, file, process) panic on
error since they are internal helpers where failure would be a programming bug.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Diffstat (limited to 'internal/tui/tui.go')
| -rw-r--r-- | internal/tui/tui.go | 17 |
1 files changed, 12 insertions, 5 deletions
diff --git a/internal/tui/tui.go b/internal/tui/tui.go index eee4252..2cebaf2 100644 --- a/internal/tui/tui.go +++ b/internal/tui/tui.go @@ -225,6 +225,9 @@ func (r *runtimeBindings) advanceFilterEpoch() uint64 { return r.filterEpoch.Add(1) } +// resetDashboardSnapshotSource resets the dashboard snapshot source if it +// implements the resettable interface, then returns a fresh snapshot. Errors +// from Snapshot are silently dropped since callers handle a nil snapshot. func (r *runtimeBindings) resetDashboardSnapshotSource() *statsengine.Snapshot { src := r.dashboardSnapshotSource() if src == nil { @@ -232,10 +235,11 @@ func (r *runtimeBindings) resetDashboardSnapshotSource() *statsengine.Snapshot { } if resettable, ok := src.(interface { Reset() - Snapshot() *statsengine.Snapshot + Snapshot() (*statsengine.Snapshot, error) }); ok { resettable.Reset() - return resettable.Snapshot() + snap, _ := resettable.Snapshot() + return snap } return nil } @@ -1216,13 +1220,16 @@ type lateBoundDashboardSource struct { runtime *runtimeBindings } -func (s lateBoundDashboardSource) Snapshot() *statsengine.Snapshot { +// Snapshot returns a point-in-time dashboard snapshot from the underlying +// source, or (nil, nil) when no source is available. Errors are forwarded to +// the caller so they can decide how to handle a failed snapshot build. +func (s lateBoundDashboardSource) Snapshot() (*statsengine.Snapshot, error) { if s.runtime == nil { - return nil + return nil, nil } source := s.runtime.dashboardSnapshotSource() if source == nil { - return nil + return nil, nil } return source.Snapshot() } |
