rate: extend maximum-delay slop to all platforms
I initially added some timing slop for specific platforms based on the
failures we had seen so far (and a theory explaining at least some of
those failures). But now we've seen overruns on other platforms too,
so perhaps we should use the same factors everywhere.
Fixes #43055 (I hope).
Change-Id: Ib6035b55acd9d17acc7ad78065abf5f1e3f9dfe7
Reviewed-on: https://go-review.googlesource.com/c/time/+/399535
Run-TryBot: Bryan Mills <bcmills@google.com>
TryBot-Result: Gopher Robot <gobot@golang.org>
Auto-Submit: Bryan Mills <bcmills@google.com>
Reviewed-by: Ian Lance Taylor <iant@google.com>
diff --git a/rate/rate_test.go b/rate/rate_test.go
index 57dd1a7..5d5fabf 100644
--- a/rate/rate_test.go
+++ b/rate/rate_test.go
@@ -434,19 +434,19 @@
// The actual time spend waiting will be INCREASED by the amount of scheduling
// slop in the platform's sleep syscall, plus the amount of time spent executing
// straight-line code before measuring the elapsed duration.
- // (The latter is surely less than half a d.)
- maxD := wantD
- switch runtime.GOOS {
- case "netbsd", "openbsd", "android", "plan9":
- // NetBSD and OpenBSD tend to overshoot sleeps by a wide margin due to a
- // suspected platform bug; see https://go.dev/issue/44067 and
- // https://go.dev/issue/50189.
- //
- // Android and plan9 were empirically observed to overshoot too.
- // Android might be trying to conserve power.
- // For plan9, I (bcmills) am not sure what the problem would be.
- maxD = (wantD*3 + 1) / 2 // 150% of wantD, rounded up.
- }
+ //
+ // The latter is surely less than half a d, but the former is empirically
+ // sometimes larger on a number of platforms for a number of reasons.
+ // NetBSD and OpenBSD tend to overshoot sleeps by a wide margin due to a
+ // suspected platform bug; see https://go.dev/issue/44067 and
+ // https://go.dev/issue/50189.
+ // Longer delays were also also observed on slower builders with Linux kernels
+ // (linux-ppc64le-buildlet, android-amd64-emu), and on Solaris and Plan 9.
+ //
+ // Since d is already fairly generous, we take 150% of wantD rounded up —
+ // that's at least enough to account for the overruns we've seen so far in
+ // practice.
+ maxD := (wantD*3 + 1) / 2
return gotD <= maxD
}