aboutsummaryrefslogtreecommitdiff
path: root/src/internal/trace
diff options
context:
space:
mode:
authorMichael Anthony Knyszek <mknyszek@google.com>2025-08-15 23:30:08 +0000
committerGopher Robot <gobot@golang.org>2025-08-15 18:10:28 -0700
commit77f911e31c243a8302c086d64dbef340b0c999b8 (patch)
tree5efb42c3e53299b5df6e4017178e8f9be8e7810c /src/internal/trace
parent786be1d2bff0192288dfc2832e5012ad6b0816be (diff)
downloadgo-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.go12
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)
}