On Thu, Jun 9, 2022 at 6:24 PM Richard W.M. Jones <rjones(a)redhat.com> wrote:
On Thu, Jun 09, 2022 at 03:20:02PM +0100, Daniel P. Berrangé wrote:
> > + go test -count=1 -v
> > === RUN Test010Load
> > --- PASS: Test010Load (0.00s)
> > === RUN TestAioBuffer
> > --- PASS: TestAioBuffer (0.00s)
> > === RUN TestAioBufferFree
> > --- PASS: TestAioBufferFree (0.00s)
> > === RUN TestAioBufferBytesAfterFree
> > SIGABRT: abort
> > PC=0x3fdf6f9bac m=0 sigcode=18446744073709551610
>
> So suggesting TestAioBufferBytesAfterFree is as fault, but quite
> odd as that test case is trivial and whle it allocates some
> native memory it doesn't seem to write to it. Unless the problem
> happened in an earlier test case and we have delayed detection ?
>
> I guess I'd try throwing darts at the wall by chopping out bits
> of test code to see what makes it disappear.
>
> Perhaps also try swapping MakeAioBuffer with MakeAioBufferZero
> in case pre-existing data into the C.malloc()d block is confusing
> Go ?
Interestingly if I remove libnbd_020_aio_buffer_test.go completely,
and disable GODEBUG, then the tests pass. (Reproducer commands at end
of email). So I guess at least one of the problems is confined to
this test and/or functions it calls in the main library.
Unfortunately this test is huge.
At your suggestion, replacing every MakeAioBuffer with
MakeAioBufferZero in that test, but it didn't help. Also tried
replacing malloc -> calloc in the aio_buffer.go implementation which
didn't help.
I'll try some more random things ...
Rich.
$ emacs -nw run.in # comment out GODEBUG line
$ emacs -nw golang/Makefile.am # remove libnbd_020_aio_buffer_test.go line
$ mv golang/libnbd_020_aio_buffer_test.go golang/libnbd_020_aio_buffer_test.nogo
$ make run
$ make
$ make -C golang check
...
PASS: run-tests.sh
So when skipping libnbd_020_aio_buffer_test.go we don't get the warning about
Go pointer in C memory?
If true, can you find the test triggering this issue?
You can run only some tests using -run={regex}, for example:
$ go test -v -run=TestAioBuffer.+AfterFree
=== RUN TestAioBufferBytesAfterFree
--- PASS: TestAioBufferBytesAfterFree (0.00s)
=== RUN TestAioBufferSliceAfterFree
--- PASS: TestAioBufferSliceAfterFree (0.00s)
=== RUN TestAioBufferGetAfterFree
--- PASS: TestAioBufferGetAfterFree (0.00s)
PASS