twilio/twilio-go

Simple example leaking goroutines

avstrong opened this issue · 0 comments

Hi,

Running uber-go/goleak, I found that this example

Run go test ./internal/ -race -v -count=1

Code Snippet

func TestR(t *testing.T) {
	defer goleak.VerifyNone(t)

	client := twilio.NewRestClientWithParams(
		twilio.ClientParams{
			Username: "mydata",
			Password: "mydata",
		},
	)

	params := &openapi.CreateMessageParams{}
	params.SetFrom("+15005550006")
	params.SetTo("+79003223232")
	params.SetBody("10")

	_, err := client.Api.CreateMessage(params)
	require.NoError(t, err)
}

Exception/Log

=== RUN   TestR
    leaks.go:78: found unexpected goroutines:
        [Goroutine 36 in state IO wait, with internal/poll.runtime_pollWait on top of the stack:
        goroutine 36 [IO wait]:
        internal/poll.runtime_pollWait(0x9f627f8, 0x72)
                /usr/local/opt/go/libexec/src/runtime/netpoll.go:234 +0x89
        internal/poll.(*pollDesc).wait(0xc000192398, 0xc0000c6000, 0x0)
                /usr/local/opt/go/libexec/src/internal/poll/fd_poll_runtime.go:84 +0xbd
        internal/poll.(*pollDesc).waitRead(...)
                /usr/local/opt/go/libexec/src/internal/poll/fd_poll_runtime.go:89
        internal/poll.(*FD).Read(0xc000192380, {0xc0000c6000, 0x12cc, 0x12cc})
                /usr/local/opt/go/libexec/src/internal/poll/fd_unix.go:167 +0x419
        net.(*netFD).Read(0xc000192380, {0xc0000c6000, 0x12cc, 0x12cc})
                /usr/local/opt/go/libexec/src/net/fd_posix.go:56 +0x51
        net.(*conn).Read(0xc000094000, {0xc0000c6000, 0x12cc, 0x12cc})
                /usr/local/opt/go/libexec/src/net/net.go:183 +0xb1
        crypto/tls.(*atLeastReader).Read(0xc00038e060, {0xc0000c6000, 0x12cc, 0x12cc})
                /usr/local/opt/go/libexec/src/crypto/tls/conn.go:777 +0x86
        bytes.(*Buffer).ReadFrom(0xc000098278, {0x14f13a0, 0xc00038e060})
                /usr/local/opt/go/libexec/src/bytes/buffer.go:204 +0x113
        crypto/tls.(*Conn).readFromUntil(0xc000098000, {0x9ef5100, 0xc000094000}, 0x5)
                /usr/local/opt/go/libexec/src/crypto/tls/conn.go:799 +0x1df
        crypto/tls.(*Conn).readRecordOrCCS(0xc000098000, 0x0)
                /usr/local/opt/go/libexec/src/crypto/tls/conn.go:606 +0x3fe
        crypto/tls.(*Conn).readRecord(...)
                /usr/local/opt/go/libexec/src/crypto/tls/conn.go:574
        crypto/tls.(*Conn).Read(0xc000098000, {0xc00034c000, 0x1000, 0x0})
                /usr/local/opt/go/libexec/src/crypto/tls/conn.go:1277 +0x29c
        net/http.(*persistConn).Read(0xc00015aa20, {0xc00034c000, 0x1000, 0x1000})
                /usr/local/opt/go/libexec/src/net/http/transport.go:1926 +0x110
        bufio.(*Reader).fill(0xc000300c00)
                /usr/local/opt/go/libexec/src/bufio/bufio.go:101 +0x294
        bufio.(*Reader).Peek(0xc000300c00, 0x1)
                /usr/local/opt/go/libexec/src/bufio/bufio.go:139 +0xcc
        net/http.(*persistConn).readLoop(0xc00015aa20)
                /usr/local/opt/go/libexec/src/net/http/transport.go:2087 +0x2db
        created by net/http.(*Transport).dialConn
                /usr/local/opt/go/libexec/src/net/http/transport.go:1747 +0x2ef8
        
         Goroutine 37 in state select, with net/http.(*persistConn).writeLoop on top of the stack:
        goroutine 37 [select]:
        net/http.(*persistConn).writeLoop(0xc00015aa20)
                /usr/local/opt/go/libexec/src/net/http/transport.go:2386 +0x1a9
        created by net/http.(*Transport).dialConn
                /usr/local/opt/go/libexec/src/net/http/transport.go:1748 +0x2f8b
        ]
--- FAIL: TestR (1.47s)

Technical details:

  • twilio-go version: 0.26.0
  • go version: 1.17