From 3d49b683c6095a9a2681e84f05adfbb8d82882e8 Mon Sep 17 00:00:00 2001 From: "Bryan C. Mills" Date: Tue, 10 Jan 2023 11:49:37 -0500 Subject: [PATCH] context: eliminate arbitrary timeouts in examples MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ExampleWithDeadline and ExampleWithTimeout used an arbitrary 1-second timeout for a “blocked” select case, which could fail if the test goroutine happens to be descheduled for over a second, or perhaps if an NTP synchronization happens to jump by a second at just the right time. Either case is plausible, especially on a heavily-loaded or slow machine (as is often the case for builders for unusual ports). Instead of an arbitrary timeout, use a “ready” channel that is never actually ready. Fixes #57594. Change-Id: I9ff68f50b041a3382e7b267c28c5259e886a9d23 Reviewed-on: https://go-review.googlesource.com/c/go/+/460999 TryBot-Result: Gopher Robot Auto-Submit: Bryan Mills Reviewed-by: Ian Lance Taylor Reviewed-by: Sameer Ajmani Run-TryBot: Bryan Mills --- src/context/example_test.go | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/src/context/example_test.go b/src/context/example_test.go index 72ac5d2e49c..7779f5f1b35 100644 --- a/src/context/example_test.go +++ b/src/context/example_test.go @@ -12,6 +12,8 @@ import ( const shortDuration = 1 * time.Millisecond // a reasonable duration to block in an example +var neverReady = make(chan struct{}) // never closed + // This example demonstrates the use of a cancelable context to prevent a // goroutine leak. By the end of the example function, the goroutine started // by gen will return without leaking. @@ -66,8 +68,8 @@ func ExampleWithDeadline() { defer cancel() select { - case <-time.After(1 * time.Second): - fmt.Println("overslept") + case <-neverReady: + fmt.Println("ready") case <-ctx.Done(): fmt.Println(ctx.Err()) } @@ -85,8 +87,8 @@ func ExampleWithTimeout() { defer cancel() select { - case <-time.After(1 * time.Second): - fmt.Println("overslept") + case <-neverReady: + fmt.Println("ready") case <-ctx.Done(): fmt.Println(ctx.Err()) // prints "context deadline exceeded" }