summaryrefslogtreecommitdiff
path: root/internal/tui/dashboard/model.go
diff options
context:
space:
mode:
authorPaul Buetow <paul@buetow.org>2026-05-13 14:41:28 +0300
committerPaul Buetow <paul@buetow.org>2026-05-13 14:41:28 +0300
commitde3405c275898c8cd528a636dbd40e1b685cfaa5 (patch)
tree53711959800677aa694e18331476add24a21b8ef /internal/tui/dashboard/model.go
parentd392eebe5bd127e1573734321b0cabaad4182d7c (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/dashboard/model.go')
-rw-r--r--internal/tui/dashboard/model.go13
1 files changed, 11 insertions, 2 deletions
diff --git a/internal/tui/dashboard/model.go b/internal/tui/dashboard/model.go
index 8a3c5d4..cc2a052 100644
--- a/internal/tui/dashboard/model.go
+++ b/internal/tui/dashboard/model.go
@@ -874,11 +874,18 @@ func (m Model) maxProcessesRows() int {
return m.snapshotOrZero().ProcessesCount()
}
+// snapshot returns the latest engine snapshot, or nil if the engine is nil or
+// returns an error. Errors are silently dropped here because the dashboard
+// renders the last successful snapshot on transient failures.
func (m Model) snapshot() *statsengine.Snapshot {
if m.engine == nil {
return nil
}
- return m.engine.Snapshot()
+ snap, err := m.engine.Snapshot()
+ if err != nil {
+ return nil
+ }
+ return snap
}
func (m Model) snapshotOrZero() statsengine.Snapshot {
@@ -893,10 +900,12 @@ func (m *Model) resetBaselineCmd() tea.Cmd {
m.liveTrie.Reset()
}
+ // Errors from Snapshot are silently dropped here; the dashboard will
+ // continue to display the last successful snapshot.
var snap *statsengine.Snapshot
if resettable, ok := m.engine.(resettableSnapshotSource); ok {
resettable.Reset()
- snap = resettable.Snapshot()
+ snap, _ = resettable.Snapshot()
} else {
snap = m.snapshot()
}