fix: use injected now() instead of time.Now() in summary methods #1672
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Hi!
This PR should fix #1666
How the problem with
TestSummaryDecay
manifests?When you run
go test -run TestSummaryDecay
normally on laptop it is always pass.But on CI it (sometimes) fails.
Looks like it takes very performance constrained environment to reveal problem. Lets recreate one.
How to reproduce locally
Run something like
stress -c 14
and while it running executego test -run TestSummaryDecay
again:OK, its reproduces
Root cause analysis and proposed solution
The testis failing due to its dependency on real-time progression and the
Summary
implementation's direct use oftime.Now()
. By modifying theSummary
implementation to utilize the injectednow
function fromSummaryOpts
and adjusting the test to control time progression, we eliminate the flakiness and make the test deterministic.RCA
Dependency on Real Time: The test relied on actual system time, using
time.Sleep
andtime.Ticker
to simulate time progression. This made the test susceptible to failures due to variations in execution speed, CPU scheduling, and other external factors beyond our control.Injected now Function Not Utilized: Although
SummaryOpts
includes anow
function intended for testing purposes, theSummary
implementation did not use this injected function. Instead, it directly calledtime.Now()
, ignoring the custom time function provided inSummaryOpts
.Mismatch Between Test and Implementation: The test attempted to control time progression by advancing a mock
now
variable. However, since theSummary
implementation continued to use the actual system time, there was a discrepancy between the test's simulated time and theSummary
's internal time references, causing the test to fail consistently.Results
Test is now stable and deterministic even if all CPUs are busy.