From 3ea53cb08f1709b2f9bf39cfcfaa1d285256baa2 Mon Sep 17 00:00:00 2001 From: Aliaksandr Valialkin Date: Fri, 26 May 2017 01:14:30 +0300 Subject: [PATCH] sync: deflake TestPool and TestPoolNew Prevent possible goroutine rescheduling to another P between Put and Get calls by locking the goroutine to OS thread. Inspired by the CL 42770. Fixes #20198. Change-Id: I18e24fcad1630658713e6b9d80d90d7941f604be Reviewed-on: https://go-review.googlesource.com/44310 Run-TryBot: Brad Fitzpatrick Reviewed-by: Ian Lance Taylor Reviewed-by: Austin Clements --- src/sync/export_test.go | 2 ++ src/sync/pool_test.go | 11 +++++++++++ 2 files changed, 13 insertions(+) diff --git a/src/sync/export_test.go b/src/sync/export_test.go index 6ed38dad89..669076efad 100644 --- a/src/sync/export_test.go +++ b/src/sync/export_test.go @@ -7,3 +7,5 @@ package sync // Export for testing. var Runtime_Semacquire = runtime_Semacquire var Runtime_Semrelease = runtime_Semrelease +var Runtime_procPin = runtime_procPin +var Runtime_procUnpin = runtime_procUnpin diff --git a/src/sync/pool_test.go b/src/sync/pool_test.go index 5a38cbfcb6..9e5132bb18 100644 --- a/src/sync/pool_test.go +++ b/src/sync/pool_test.go @@ -23,6 +23,10 @@ func TestPool(t *testing.T) { if p.Get() != nil { t.Fatal("expected empty") } + + // Make sure that the goroutine doesn't migrate to another P + // between Put and Get calls. + Runtime_procPin() p.Put("a") p.Put("b") if g := p.Get(); g != "a" { @@ -34,6 +38,7 @@ func TestPool(t *testing.T) { if g := p.Get(); g != nil { t.Fatalf("got %#v; want nil", g) } + Runtime_procUnpin() p.Put("c") debug.SetGCPercent(100) // to allow following GC to actually run @@ -60,10 +65,16 @@ func TestPoolNew(t *testing.T) { if v := p.Get(); v != 2 { t.Fatalf("got %v; want 2", v) } + + // Make sure that the goroutine doesn't migrate to another P + // between Put and Get calls. + Runtime_procPin() p.Put(42) if v := p.Get(); v != 42 { t.Fatalf("got %v; want 42", v) } + Runtime_procUnpin() + if v := p.Get(); v != 3 { t.Fatalf("got %v; want 3", v) } -- 2.50.0