Skip to content

Commit 816199e

Browse files
committed
runtime: don't let readTrace spin on trace.shutdown
Issue #74045 describes a scenario in which gopark is inlined into readTrace, such that there are no preemption points. This is only a problem because readTrace spins if trace.shutdown is set, through traceReaderAvailable. However, trace.shutdown is almost certainly overkill for traceReaderAvailable. The first condition, checking whether the reader gen and the flushed gen match, should be sufficient to ensure the reader wakes up and finishes flushing all buffers. The first condition is also safe because it guarantees progress. In the case of shutdown, all the trace work that will be flushed has been flushed, and so the trace reader will exit into a regular goroutine context when it's finished. If not shutting down, then the trace reader will release doneSema, increase readerGen, and then the gopark unlockf will let it block until new work actually comes in. Fixes #74045. Change-Id: Id9b15c277cb731618488771bd484577341b68675 Reviewed-on: https://go-review.googlesource.com/c/go/+/680738 LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com> Reviewed-by: Nick Ripley <nick.ripley@datadoghq.com> Reviewed-by: Michael Pratt <mpratt@google.com> Auto-Submit: Michael Knyszek <mknyszek@google.com>
1 parent ea00461 commit 816199e

File tree

1 file changed

+2
-4
lines changed

1 file changed

+2
-4
lines changed

src/runtime/trace.go

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -956,7 +956,7 @@ func traceReader() *g {
956956
// scheduled and should be. Callers should first check that
957957
// (traceEnabled() || traceShuttingDown()) is true.
958958
func traceReaderAvailable() *g {
959-
// There are three conditions under which we definitely want to schedule
959+
// There are two conditions under which we definitely want to schedule
960960
// the reader:
961961
// - The reader is lagging behind in finishing off the last generation.
962962
// In this case, trace buffers could even be empty, but the trace
@@ -965,12 +965,10 @@ func traceReaderAvailable() *g {
965965
// - The reader has pending work to process for it's reader generation
966966
// (assuming readerGen is not lagging behind). Note that we also want
967967
// to be careful *not* to schedule the reader if there's no work to do.
968-
// - The trace is shutting down. The trace stopper blocks on the reader
969-
// to finish, much like trace advancement.
970968
//
971969
// We also want to be careful not to schedule the reader if there's no
972970
// reason to.
973-
if trace.flushedGen.Load() == trace.readerGen.Load() || trace.workAvailable.Load() || trace.shutdown.Load() {
971+
if trace.flushedGen.Load() == trace.readerGen.Load() || trace.workAvailable.Load() {
974972
return trace.reader.Load()
975973
}
976974
return nil

0 commit comments

Comments
 (0)