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>
This commit is contained in:
Michael Anthony Knyszek 2025-08-15 23:30:08 +00:00 committed by Gopher Robot
parent 786be1d2bf
commit 77f911e31c

View file

@ -31,6 +31,7 @@ type Reader struct {
cpuSamples []cpuSample cpuSamples []cpuSample
order ordering order ordering
syncs int syncs int
readGenErr error
done bool done bool
// Spill state. // Spill state.
@ -153,9 +154,18 @@ func (r *Reader) ReadEvent() (e Event, err error) {
if r.version < version.Go126 { if r.version < version.Go126 {
return r.nextGenWithSpill() return r.nextGenWithSpill()
} }
if r.readGenErr != nil {
return Event{}, r.readGenErr
}
gen, err := readGeneration(r.r, r.version) gen, err := readGeneration(r.r, r.version)
if err != nil { 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) return r.installGen(gen)
} }