Also, it is documented:

% go help testflag | grep mode

-covermode set,count,atomic

    Set the mode for coverage analysis for the package[s]

When 'go test' runs in package list mode, 'go test' caches successful

%

On Sun, Oct 2, 2022 at 7:22 PM Rob Pike <r...@golang.org> wrote:

> Apologies, the cover tool calls it -mode but the go command calls it
> -covermode.
>
> go test -covermode=atomic
>
> -rob
>
>
> On Sun, Oct 2, 2022 at 3:48 PM Shulhan <m.shul...@gmail.com> wrote:
>
>> On Sun, 2 Oct 2022 10:41:17 +1100
>> Rob Pike <r...@golang.org> wrote:
>>
>> > When running coverage in a concurrent program, use the -mode=atomic
>> > flag to avoid data races in the counters. This unavoidably has a
>> > significant performance hit, but it should resolve this race.
>> >
>> > -rob
>> >
>>
>> This flag print "no test files" when running go test,
>>
>>     $ GOEXPERIMENT=coverageredesign CGO_ENABLED=1 go test -mode=atomic
>> -race -coverprofile=cover.out ./lib/dns
>>     ?       github.com/shuLhan/share        [no test files]
>>
>> Not sure I am using the flag correctly or not since I cannot find it in
>> the current documentation [1].
>>
>> [1] https://pkg.go.dev/cmd/go
>>
>> >
>> > On Sun, Oct 2, 2022 at 5:10 AM Shulhan <m.shul...@gmail.com> wrote:
>> >
>> > > Hi gophers,
>> > >
>> > > The latest Go tip always fail with data race when running with -race
>> > > and -coverprofile options.
>> > >
>> > > Here is an example of data race output,
>> > >
>> > > ----
>> > > $ CGO_ENABLED=1 go test -failfast -race -count=1
>> > > -coverprofile=cover.out ./...
>> > > ...
>> > > ==================
>> > > WARNING: DATA RACE
>> > > Read at 0x000001e5f04c by main goroutine:
>> > >
>> > >
>> internal/coverage/encodecounter.(*CoverageDataWriter).writeCounters.func2()
>> > >
>>  /home/ms/opt/go/src/internal/coverage/encodecounter/encode.go:261
>> > > +0x11c
>> > >   runtime/coverage.(*emitState).VisitFuncs()
>> > >       /home/ms/opt/go/src/runtime/coverage/emit.go:539 +0x6bc
>> > >
>>  internal/coverage/encodecounter.(*CoverageDataWriter).writeCounters()
>> > >
>>  /home/ms/opt/go/src/internal/coverage/encodecounter/encode.go:268
>> > > +0x16f
>> > >
>>  internal/coverage/encodecounter.(*CoverageDataWriter).AppendSegment()
>> > >
>>  /home/ms/opt/go/src/internal/coverage/encodecounter/encode.go:175
>> > > +0x8ea
>> > >   internal/coverage/encodecounter.(*CoverageDataWriter).Write()
>> > >       /home/ms/opt/go/src/internal/coverage/encodecounter/encode.go:71
>> > > +0x97
>> > >   runtime/coverage.(*emitState).emitCounterDataFile()
>> > >       /home/ms/opt/go/src/runtime/coverage/emit.go:573 +0x91
>> > >   runtime/coverage.emitCounterDataToDirectory()
>> > >       /home/ms/opt/go/src/runtime/coverage/emit.go:322 +0x310
>> > >   runtime/coverage.processCoverTestDir()
>> > >       /home/ms/opt/go/src/runtime/coverage/testsupport.go:39 +0x1c4
>> > >   main.coverTearDown()
>> > >       _testmain.go:179 +0x159
>> > >   testing.coverReport2()
>> > >       /home/ms/opt/go/src/testing/newcover.go:37 +0xcb
>> > >   testing.coverReport()
>> > >       /home/ms/opt/go/src/testing/cover.go:83 +0xc74
>> > >   testing.(*M).writeProfiles()
>> > >       /home/ms/opt/go/src/testing/testing.go:2053 +0xc6f
>> > >   testing.(*M).after.func1()
>> > >       /home/ms/opt/go/src/testing/testing.go:1987 +0x30
>> > >   sync.(*Once).doSlow()
>> > >       /home/ms/opt/go/src/sync/once.go:74 +0x101
>> > >   sync.(*Once).Do()
>> > >       /home/ms/opt/go/src/sync/once.go:65 +0x46
>> > >   testing.(*M).after()
>> > >       /home/ms/opt/go/src/testing/testing.go:1986 +0x55
>> > >   testing.(*M).Run.func4()
>> > >       /home/ms/opt/go/src/testing/testing.go:1761 +0x39
>> > >   runtime.deferreturn()
>> > >       /home/ms/opt/go/src/runtime/panic.go:476 +0x32
>> > >   testing.(*M).Run()
>> > >       /home/ms/opt/go/src/testing/testing.go:1771 +0xbb3
>> > >   github.com/shuLhan/share/lib/dns.TestMain()
>> > >       /home/ms/go/src/github.com/shuLhan/share/lib/dns/dns_test.go:63
>> > > +0x5db
>> > >   main.main()
>> > >       _testmain.go:192 +0x33d
>> > >
>> > > Previous write at 0x000001e5f04c by goroutine 9:
>> > >   sync/atomic.AddInt32()
>> > >       /home/ms/opt/go/src/runtime/race_amd64.s:281 +0xb
>> > >   sync/atomic.AddUint32()
>> > >       <autogenerated>:1 +0x1a
>> > >   github.com/shuLhan/share/lib/dns.(*Server).processRequest()
>> > >       /home/ms/go/src/github.com/shuLhan/share/lib/dns/server.go:593
>> > > +0xc67
>> > >   github.com/shuLhan/share/lib/dns.(*Server).ListenAndServe.func1()
>> > >       /home/ms/go/src/github.com/shuLhan/share/lib/dns/server.go:187
>> > > +0x39
>> > >
>> > > Goroutine 9 (running) created at:
>> > >   github.com/shuLhan/share/lib/dns.(*Server).ListenAndServe()
>> > >       /home/ms/go/src/github.com/shuLhan/share/lib/dns/server.go:187
>> > > +0xe6 github.com/shuLhan/share/lib/dns.TestMain.func1()
>> > >       /home/ms/go/src/github.com/shuLhan/share/lib/dns/dns_test.go:54
>> > > +0x44
>> > > ==================
>> > > ...
>> > > ----
>> > >
>> > > There are many lines like that with the same pattern.
>> > >
>> > > In the above snippet, the lib/dns/dns_test.go:63 point this code
>> > > [1],
>> > >
>> > >   os.Exit(m.Run())
>> > >
>> > > So it does not make sense if the data race is in my code.
>> > >
>> > > A quick bisect point to this commit [2].
>> > >
>>
>> Just want to be clear, I run the test using
>> GOEXPERIMENT=coverageredesign flag using Go tip commit 53773a5d08
>>
>>     $ go version
>>     go version devel go1.20-53773a5d08 Wed Sep 28 11:50:58 2022 +0000
>> linux/amd64
>>
>> Without GOEXPERIMENT flag,
>>
>>     $ CGO_ENABLED=1 go test -race -coverprofile=cover.out ./lib/dns
>>     ok      github.com/shuLhan/share/lib/dns        0.707s  coverage:
>> 56.8% of statements
>>
>> With GOEXPERIMENT=coverageredesign flag,
>>
>> ----
>> $ GOEXPERIMENT=coverageredesign CGO_ENABLED=1 go test -race ./lib/dns
>> ok      github.com/shuLhan/share/lib/dns        0.683s
>>
>> $ GOEXPERIMENT=coverageredesign CGO_ENABLED=1 go test -race
>> -coverprofile=cover.out ./lib/dns
>> dns.Server: listening for DNS over TLS at 127.0.0.1:18053
>> dns.Server: listening for DNS over TCP at 127.0.0.1:5300
>> dns.Server: listening for DNS over UDP at 127.0.0.1:5300
>> dns.Server: listening for DNS over HTTPS at 127.0.0.1:8443
>> dns: invalid IP address "localhost"
>> dns: invalid name server URI "://127.0.0.1"
>> dns: invalid IP address "localhost:53"
>> dns: invalid IP address "localhost:53"
>> PASS
>> ==================
>> WARNING: DATA RACE
>> Read at 0x000001e5f04c by main goroutine:
>>
>> internal/coverage/encodecounter.(*CoverageDataWriter).writeCounters.func2()
>>       /home/ms/opt/go/src/internal/coverage/encodecounter/encode.go:261
>> +0x11c
>>   runtime/coverage.(*emitState).VisitFuncs()
>>       /home/ms/opt/go/src/runtime/coverage/emit.go:539 +0x6bc
>>   internal/coverage/encodecounter.(*CoverageDataWriter).writeCounters()
>>       /home/ms/opt/go/src/internal/coverage/encodecounter/encode.go:268
>> +0x16f
>> ...
>> ----
>>
>

-- 
You received this message because you are subscribed to the Google Groups 
"golang-nuts" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to golang-nuts+unsubscr...@googlegroups.com.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/golang-nuts/CAOXNBZSuxKM0CT%3DQvOC1TPT-Yv6285EaJSJh%2Buh1ttsWm9ftwg%40mail.gmail.com.

Reply via email to