]> Cypherpunks repositories - gostls13.git/commitdiff
runtime: test mutex contention stacks and counts
authorRhys Hiltner <rhys.hiltner@gmail.com>
Tue, 23 Apr 2024 21:16:04 +0000 (14:16 -0700)
committerGopher Robot <gobot@golang.org>
Wed, 24 Apr 2024 13:36:48 +0000 (13:36 +0000)
Fully testing the runtime's profiles and metrics for contention on its
internal mutex values involves comparing two separate clocks (cputicks
for the profile and nanotime for the metric), verifying its fractional
sampling (when MutexProfileRate is greater than 1), and observing a very
small critical section outside of the test's control (semrelease).
Flakiness (#64253) from those parts of the test have led to skipping it
entirely.

But there are portions of the mutex profiling behavior that should have
more consistent behavior: for a mutex under the test's control, the test
and the runtime should be able to agree that the test successfully
induced contention, and should agree on the call stack that caused the
contention. Allow those more consistent parts to run.

For #64253

Change-Id: I7f368d3265a5c003da2765164276fab616eb9959
Reviewed-on: https://go-review.googlesource.com/c/go/+/581296
LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com>
Reviewed-by: Michael Knyszek <mknyszek@google.com>
Reviewed-by: Joedian Reid <joedian@google.com>
Auto-Submit: Rhys Hiltner <rhys.hiltner@gmail.com>

src/runtime/metrics_test.go

index 1d99b86fe6b7c06ff20acd7b5f140242b193e42e..859bc712f16e30990f53178af272c41a9934de60 100644 (file)
@@ -948,8 +948,6 @@ func TestSchedPauseMetrics(t *testing.T) {
 }
 
 func TestRuntimeLockMetricsAndProfile(t *testing.T) {
-       testenv.SkipFlaky(t, 64253)
-
        old := runtime.SetMutexProfileFraction(0) // enabled during sub-tests
        defer runtime.SetMutexProfileFraction(old)
        if old != 0 {
@@ -1181,12 +1179,17 @@ func TestRuntimeLockMetricsAndProfile(t *testing.T) {
                        }
 
                        const slop = 1.5 // account for nanotime vs cputicks
-                       if profileGrowth > slop*metricGrowth || metricGrowth > slop*profileGrowth {
-                               t.Errorf("views differ by more than %fx", slop)
-                       }
+                       t.Run("compare timers", func(t *testing.T) {
+                               testenv.SkipFlaky(t, 64253)
+                               if profileGrowth > slop*metricGrowth || metricGrowth > slop*profileGrowth {
+                                       t.Errorf("views differ by more than %fx", slop)
+                               }
+                       })
                })
 
                t.Run("sample-2", func(t *testing.T) {
+                       testenv.SkipFlaky(t, 64253)
+
                        old := runtime.SetMutexProfileFraction(2)
                        defer runtime.SetMutexProfileFraction(old)
 
@@ -1218,6 +1221,8 @@ func TestRuntimeLockMetricsAndProfile(t *testing.T) {
        })
 
        t.Run("runtime.semrelease", func(t *testing.T) {
+               testenv.SkipFlaky(t, 64253)
+
                old := runtime.SetMutexProfileFraction(1)
                defer runtime.SetMutexProfileFraction(old)