-
Notifications
You must be signed in to change notification settings - Fork 17.3k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
internal/trace/v2: resolve syscall parsing ambiguity
After landing the new execution tracer, the Windows builders failed with some new errors. Currently the GoSyscallBegin event has no indicator that its the target of a ProcSteal event. This can lead to an ambiguous situation that is unresolvable if timestamps are broken. For instance, if the tracer sees the ProcSteal event while a goroutine has been observed to be in a syscall (one that, for instance, did not actually lose its P), it will proceed with the ProcSteal incorrectly. This is a little abstract. For a more concrete example, see the go122-syscall-steal-proc-ambiguous test. This change resolves this ambiguity by interleaving GoSyscallBegin events into how Ps are sequenced. Because a ProcSteal has a sequence number (it has to, it's stopping a P from a distance) it necessarily has to synchronize with a precise ProcStart event. This change basically just extends this synchronization to GoSyscallBegin, so the ProcSteal can't advance until _exactly the right_ syscall has been entered. This change removes the test skip, since it and CL 541695 fix the two main issues observed on Windows platforms. For #60773. Fixes #64061. Change-Id: I069389cd7fe1ea903edf42d79912f6e2bcc23f62 Reviewed-on: https://go-review.googlesource.com/c/go/+/541696 Auto-Submit: Michael Knyszek <mknyszek@google.com> Reviewed-by: Michael Pratt <mpratt@google.com> LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com>
- Loading branch information
Showing
19 changed files
with
4,373 additions
and
2,498 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
46 changes: 46 additions & 0 deletions
46
src/internal/trace/v2/testdata/generators/go122-syscall-steal-proc-ambiguous.go
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,46 @@ | ||
// Copyright 2023 The Go Authors. All rights reserved. | ||
// Use of this source code is governed by a BSD-style | ||
// license that can be found in the LICENSE file. | ||
|
||
// Tests syscall P stealing. | ||
// | ||
// Specifically, it tests a scenerio wherein, without a | ||
// P sequence number of GoSyscallBegin, the syscall that | ||
// a ProcSteal applies to is ambiguous. This only happens in | ||
// practice when the events aren't already properly ordered | ||
// by timestamp, since the ProcSteal won't be seen until after | ||
// the correct GoSyscallBegin appears on the frontier. | ||
|
||
package main | ||
|
||
import ( | ||
"internal/trace/v2" | ||
"internal/trace/v2/event/go122" | ||
testgen "internal/trace/v2/internal/testgen/go122" | ||
) | ||
|
||
func main() { | ||
testgen.Main(gen) | ||
} | ||
|
||
func gen(t *testgen.Trace) { | ||
t.DisableTimestamps() | ||
|
||
g := t.Generation(1) | ||
|
||
// One goroutine does a syscall without blocking, then another one where | ||
// it's P gets stolen. | ||
b0 := g.Batch(trace.ThreadID(0), 0) | ||
b0.Event("ProcStatus", trace.ProcID(0), go122.ProcRunning) | ||
b0.Event("GoStatus", trace.GoID(1), trace.ThreadID(0), go122.GoRunning) | ||
b0.Event("GoSyscallBegin", testgen.Seq(1), testgen.NoStack) | ||
b0.Event("GoSyscallEnd") | ||
b0.Event("GoSyscallBegin", testgen.Seq(2), testgen.NoStack) | ||
b0.Event("GoSyscallEndBlocked") | ||
|
||
// A running goroutine steals proc 0. | ||
b1 := g.Batch(trace.ThreadID(1), 0) | ||
b1.Event("ProcStatus", trace.ProcID(2), go122.ProcRunning) | ||
b1.Event("GoStatus", trace.GoID(2), trace.ThreadID(1), go122.GoRunning) | ||
b1.Event("ProcSteal", trace.ProcID(0), testgen.Seq(3), trace.ThreadID(0)) | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.