From 9f2f63db1419f7bd78b8d66df11b446cae62c175 Mon Sep 17 00:00:00 2001 From: Erik Darling <2136037+erikdarlingdata@users.noreply.github.com> Date: Thu, 2 Apr 2026 09:12:07 -0400 Subject: [PATCH] Fix Overview tab showing Memory Grant as 0 for all timestamps The Overview tab's memory chart only queried v_memory_stats which has no grant data, so TotalGrantedMb was always 0. The Memory tab worked because it also calls GetMemoryGrantTrendAsync() from v_memory_grant_stats. Now the Overview tab fetches grant data in parallel and aligns it to the memory trend timestamps. Fixes #776 Co-Authored-By: Claude Opus 4.6 (1M context) --- Lite/Controls/ServerTab.xaml.cs | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/Lite/Controls/ServerTab.xaml.cs b/Lite/Controls/ServerTab.xaml.cs index f3261a5a..eb870953 100644 --- a/Lite/Controls/ServerTab.xaml.cs +++ b/Lite/Controls/ServerTab.xaml.cs @@ -1121,15 +1121,16 @@ private async System.Threading.Tasks.Task RefreshOverviewAsync(int hoursBack, Da { var cpuTask = SafeQueryAsync(() => _dataService.GetCpuUtilizationAsync(_serverId, hoursBack, fromDate, toDate)); var memoryTask = SafeQueryAsync(() => _dataService.GetMemoryTrendAsync(_serverId, hoursBack, fromDate, toDate)); + var memoryGrantTask = SafeQueryAsync(() => _dataService.GetMemoryGrantTrendAsync(_serverId, hoursBack, fromDate, toDate)); var fileIoTask = SafeQueryAsync(() => _dataService.GetFileIoLatencyTrendAsync(_serverId, hoursBack, fromDate, toDate)); // Get top 5 wait types then fetch trends for each var waitStats = await SafeQueryAsync(() => _dataService.GetWaitStatsAsync(_serverId, hoursBack, fromDate, toDate)); var topWaits = waitStats.Take(5).Select(w => w.WaitType).ToList(); - await System.Threading.Tasks.Task.WhenAll(cpuTask, memoryTask, fileIoTask); + await System.Threading.Tasks.Task.WhenAll(cpuTask, memoryTask, memoryGrantTask, fileIoTask); UpdateOverviewCpuChart(cpuTask.Result); - UpdateOverviewMemoryChart(memoryTask.Result); + UpdateOverviewMemoryChart(memoryTask.Result, memoryGrantTask.Result); UpdateOverviewFileIoChart(fileIoTask.Result); await UpdateOverviewWaitStatsChartAsync(topWaits, hoursBack, fromDate, toDate); } @@ -1164,7 +1165,7 @@ private void UpdateOverviewCpuChart(List data) OverviewCpuChart.Refresh(); } - private void UpdateOverviewMemoryChart(List data) + private void UpdateOverviewMemoryChart(List data, List grantData) { ClearChart(OverviewMemoryChart); _overviewMemoryHover?.Clear(); @@ -1174,7 +1175,10 @@ private void UpdateOverviewMemoryChart(List data) var times = data.Select(d => d.CollectionTime.AddMinutes(UtcOffsetMinutes).ToOADate()).ToArray(); var bufferPool = data.Select(d => d.BufferPoolMb).ToArray(); - var grants = data.Select(d => d.TotalGrantedMb).ToArray(); + + /* Use grant data from v_memory_grant_stats, aligned to memory trend timestamps */ + var grantLookup = grantData.ToDictionary(d => d.CollectionTime, d => d.TotalGrantedMb); + var grants = data.Select(d => grantLookup.TryGetValue(d.CollectionTime, out var v) ? v : 0.0).ToArray(); var bpPlot = OverviewMemoryChart.Plot.Add.Scatter(times, bufferPool); bpPlot.LegendText = "Buffer Pool";