summaryrefslogtreecommitdiff
path: root/internal/tui
diff options
context:
space:
mode:
Diffstat (limited to 'internal/tui')
-rw-r--r--internal/tui/dashboard/model.go13
-rw-r--r--internal/tui/tui.go17
-rw-r--r--internal/tui/tui_test.go13
3 files changed, 31 insertions, 12 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()
}
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()
}
diff --git a/internal/tui/tui_test.go b/internal/tui/tui_test.go
index 5f007e4..d76ccde 100644
--- a/internal/tui/tui_test.go
+++ b/internal/tui/tui_test.go
@@ -459,8 +459,8 @@ type fakeDashboardSource struct {
snap *statsengine.Snapshot
}
-func (f fakeDashboardSource) Snapshot() *statsengine.Snapshot {
- return f.snap
+func (f fakeDashboardSource) Snapshot() (*statsengine.Snapshot, error) {
+ return f.snap, nil
}
type fakeResettableDashboardSource struct {
@@ -468,8 +468,8 @@ type fakeResettableDashboardSource struct {
resetCalls int
}
-func (f *fakeResettableDashboardSource) Snapshot() *statsengine.Snapshot {
- return f.snap
+func (f *fakeResettableDashboardSource) Snapshot() (*statsengine.Snapshot, error) {
+ return f.snap, nil
}
func (f *fakeResettableDashboardSource) Reset() {
@@ -484,7 +484,10 @@ func TestDashboardRefreshPicksLateBoundSource(t *testing.T) {
want := &statsengine.Snapshot{TotalSyscalls: 77}
runtime.SetDashboardSnapshotSource(fakeDashboardSource{snap: want})
- got := source.Snapshot()
+ got, err := source.Snapshot()
+ if err != nil {
+ t.Fatalf("unexpected snapshot error: %v", err)
+ }
if got != want {
t.Fatalf("expected late-bound source to use latest runtime source")
}