Skip to content

Commit

Permalink
Attempt to rollback failed merges
Browse files Browse the repository at this point in the history
  • Loading branch information
jproberts committed Aug 10, 2022
1 parent 3e83a00 commit 6c1281a
Showing 1 changed file with 15 additions and 4 deletions.
19 changes: 15 additions & 4 deletions src/cmd/go/internal/test/cover.go
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,8 @@ import (

var coverMerge struct {
f *os.File
sync.Mutex // for f.Write
fsize int64 // size of valid data written to f
sync.Mutex // for f.Write
}

// initCoverProfile initializes the test coverage profile.
Expand All @@ -36,11 +37,12 @@ func initCoverProfile() {
if err != nil {
base.Fatalf("%v", err)
}
_, err = fmt.Fprintf(f, "mode: %s\n", testCoverMode)
n, err := fmt.Fprintf(f, "mode: %s\n", testCoverMode)
if err != nil {
base.Fatalf("%v", err)
}
coverMerge.f = f
coverMerge.fsize += int64(n)
}

// mergeCoverProfile merges file into the profile stored in testCoverProfile.
Expand All @@ -67,17 +69,26 @@ func mergeCoverProfile(file string) error {
if err != nil || string(buf) != expect {
return errMalformedCoverProfile
}
_, err = io.Copy(coverMerge.f, r)
m, err := io.Copy(coverMerge.f, r)
if err != nil {
return fmt.Errorf("saving coverage profile: %v\n", err)
if m > 0 {
// Attempt to rollback partial write.
coverMerge.f.Seek(coverMerge.fsize, 0)
}
return fmt.Errorf("saving coverage profile: %w", err)
}
coverMerge.fsize += m
return nil
}

func closeCoverProfile() {
if coverMerge.f == nil {
return
}
// Discard any partially written data from a failed merge.
if err := coverMerge.f.Truncate(coverMerge.fsize); err != nil {
base.Errorf("closing coverage profile: %v", err)
}
if err := coverMerge.f.Close(); err != nil {
base.Errorf("closing coverage profile: %v", err)
}
Expand Down

0 comments on commit 6c1281a

Please sign in to comment.