From 63fa03652f85f7d753bda8db4d204f3699ebaaa0 Mon Sep 17 00:00:00 2001 From: Reuben Bond Date: Mon, 16 Feb 2026 13:37:09 -0800 Subject: [PATCH] Fix flaky GrainTimer_Change timer assertion Replace fixed-delay assertion with bounded polling so dispose_timer callback completion is observed reliably before asserting tick count. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- test/DefaultCluster.Tests/TimerOrleansTest.cs | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/test/DefaultCluster.Tests/TimerOrleansTest.cs b/test/DefaultCluster.Tests/TimerOrleansTest.cs index 0a673542aea..79349fc3a0d 100644 --- a/test/DefaultCluster.Tests/TimerOrleansTest.cs +++ b/test/DefaultCluster.Tests/TimerOrleansTest.cs @@ -354,9 +354,17 @@ public async Task GrainTimer_Change() var grain3 = GrainFactory.GetGrain(GetRandomGrainId()); await grain3.StartTimer(testName, delay, "dispose_timer"); - await Task.Delay(wait); + var grain3Timeout = wait.Multiply(2); + var grain3Stopwatch = Stopwatch.StartNew(); + var grain3TickCount = await grain3.GetTickCount(); + while (grain3Stopwatch.Elapsed < grain3Timeout && grain3TickCount < 1) + { + await Task.Delay(TimeSpan.FromMilliseconds(200)); + grain3TickCount = await grain3.GetTickCount(); + } + Assert.Null(await grain3.GetException()); // Should be no exceptions during timer callback - Assert.Equal(1, await grain3.GetTickCount()); + Assert.Equal(1, grain3TickCount); await grain.StopTimer(testName); }