diff options
| author | Michael Anthony Knyszek <mknyszek@google.com> | 2025-08-15 23:30:08 +0000 |
|---|---|---|
| committer | Gopher Robot <gobot@golang.org> | 2025-08-15 18:10:28 -0700 |
| commit | 77f911e31c243a8302c086d64dbef340b0c999b8 (patch) | |
| tree | 5efb42c3e53299b5df6e4017178e8f9be8e7810c /src/internal/trace | |
| parent | 786be1d2bff0192288dfc2832e5012ad6b0816be (diff) | |
| download | go-77f911e31c243a8302c086d64dbef340b0c999b8.tar.xz | |
internal/trace: emit final sync event for generation in Go 1.26+
CL 693398 returned the error from reading a generation immediately, but
this is wrong -- a Sync event must be emitted to indicate the end of the
trace before reporting the error. This caused TestCrashWhileTracing
to fail because that test has a high likelihood of producing a truncated
trace, and it expects at least 2 Sync events. The truncated trace error
would be reported before the second Sync event, which is incorrect.
Fixes #75045.
Change-Id: Ia71592c4ec56a544afc85cdb7b575e143f80e048
Cq-Include-Trybots: luci.golang.try:gotip-linux-amd64-longtest
Reviewed-on: https://go-review.googlesource.com/c/go/+/696436
Reviewed-by: Carlos Amedee <carlos@golang.org>
Auto-Submit: Michael Knyszek <mknyszek@google.com>
LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com>
Diffstat (limited to 'src/internal/trace')
| -rw-r--r-- | src/internal/trace/reader.go | 12 |
1 files changed, 11 insertions, 1 deletions
diff --git a/src/internal/trace/reader.go b/src/internal/trace/reader.go index 5a094277fb..bb9cc280f5 100644 --- a/src/internal/trace/reader.go +++ b/src/internal/trace/reader.go @@ -31,6 +31,7 @@ type Reader struct { cpuSamples []cpuSample order ordering syncs int + readGenErr error done bool // Spill state. @@ -153,9 +154,18 @@ func (r *Reader) ReadEvent() (e Event, err error) { if r.version < version.Go126 { return r.nextGenWithSpill() } + if r.readGenErr != nil { + return Event{}, r.readGenErr + } gen, err := readGeneration(r.r, r.version) if err != nil { - return Event{}, err + // Before returning an error, emit the sync event + // for the current generation and queue up the error + // for the next call. + r.readGenErr = err + r.gen = nil + r.syncs++ + return syncEvent(nil, r.lastTs, r.syncs), nil } return r.installGen(gen) } |
