andygrunwald / go-jira

Go client library for Atlassian Jira
https://pkg.go.dev/github.com/andygrunwald/go-jira?tab=doc
MIT License
1.46k stars 464 forks source link

Data racing #433

Open AntonYurchenko opened 2 years ago

AntonYurchenko commented 2 years ago

Describe the bug

Data racing has in this package.

To Reproduce

This is my main.go:

package main

import (
    "crypto/tls"
    "fmt"
    "net/http"

    "github.com/andygrunwald/go-jira"
)

func main() {

    tp := jira.BasicAuthTransport{
        Username:  "my_login",
        Password:  "my_password",
        Transport: &http.Transport{TLSClientConfig: &tls.Config{InsecureSkipVerify: true}},
    }

    client, err := jira.NewClient(tp.Client(), "https://jira.host.ru/")
    if err != nil {
        panic(err)
    }

    jql := "my_jql_query_here"

    result, resp, err := client.Issue.Search(jql, &jira.SearchOptions{})
    if err != nil {
        panic(err)
    }
    if resp.StatusCode != 200 {
        panic("Not 200 response")
    }

    fmt.Println("count:", len(result))

}

Start in terminal:

go run ./
count: 17

Start in terminal with enable data race detection:

go run -race ./
objc[93412]: Attempt to use unknown class 0x7ff851c57260.
SIGABRT: abort
PC=0x7ff81040fdfe m=0 sigcode=0

goroutine 0 [idle]:
runtime: unknown pc 0x7ff81040fdfe
stack: frame={sp:0x7ff7bfefe648, fp:0x0} stack=[0x7ff7bfe806d8,0x7ff7bfeff740)
00007ff7bfefe548:  0000000000000002  0000000000000002 
00007ff7bfefe558:  00000000021c7000  00000000021c7400 
00007ff7bfefe568:  0000000000000006  00007ff7bfefe5d0 
00007ff7bfefe578:  00007ff810245619  0000000000000000 
00007ff7bfefe588:  f6b58000c0001006  000000000000ffff 
00007ff7bfefe598:  0000000000000030  0000000000000000 
00007ff7bfefe5a8:  000000000000002d  000000000000002d 
00007ff7bfefe5b8:  0000000000000000  00000000021c7000 
00007ff7bfefe5c8:  00007ff851c6b000  00007ff7bfefe600 
00007ff7bfefe5d8:  00007ff810245546  00007ff81024550e 
00007ff7bfefe5e8:  000000000000002d  0000000000000001 
00007ff7bfefe5f8:  00007ff851c6b000  00007ff7bfefe640 
00007ff7bfefe608:  00007ff810261ad6  000000000000002c 
00007ff7bfefe618:  000000000000002d  0000600003300000 
00007ff7bfefe628:  0000000000000003  0000600002c00000 
00007ff7bfefe638:  0000000000000000  00007ff7bfefe670 
00007ff7bfefe648: <00007ff810411893  0000000000000000 
00007ff7bfefe658:  00000020bfefe6b0  0000600002c00000 
00007ff7bfefe668:  00007ff7bfefe6b0  0000600003300000 
00007ff7bfefe678:  0000000000000003  0000000000000080 
00007ff7bfefe688:  0000000000000001  00007ff7bfefe6a0 
00007ff7bfefe698:  00007ff810411843  00007ff7bfefe6e0 
00007ff7bfefe6a8:  00007ff8102ddbce  0000600002c00080 
00007ff7bfefe6b8:  0000000008c2b033  0000600002c00000 
00007ff7bfefe6c8:  00007ffffffffff8  00007ff851c57260 
00007ff7bfefe6d8:  0000000080080001  00007ff7bfefe7c0 
00007ff7bfefe6e8:  00007ff8102ddb5c  0000003000000010 
00007ff7bfefe6f8:  00007ff7bfefe7d0  00007ff7bfefe710 
00007ff7bfefe708:  00007ff89b0b1b30  00007ff89b0bb4c8 
00007ff7bfefe718:  00007ff851c57260  00007ff851c57260 
00007ff7bfefe728:  0000000000000001  00000000ffffffff 
00007ff7bfefe738:  0000000000000000  00007ff89b0b1e58 
runtime: unknown pc 0x7ff81040fdfe
stack: frame={sp:0x7ff7bfefe648, fp:0x0} stack=[0x7ff7bfe806d8,0x7ff7bfeff740)
00007ff7bfefe548:  0000000000000002  0000000000000002 
00007ff7bfefe558:  00000000021c7000  00000000021c7400 
00007ff7bfefe568:  0000000000000006  00007ff7bfefe5d0 
00007ff7bfefe578:  00007ff810245619  0000000000000000 
00007ff7bfefe588:  f6b58000c0001006  000000000000ffff 
00007ff7bfefe598:  0000000000000030  0000000000000000 
00007ff7bfefe5a8:  000000000000002d  000000000000002d 
00007ff7bfefe5b8:  0000000000000000  00000000021c7000 
00007ff7bfefe5c8:  00007ff851c6b000  00007ff7bfefe600 
00007ff7bfefe5d8:  00007ff810245546  00007ff81024550e 
00007ff7bfefe5e8:  000000000000002d  0000000000000001 
00007ff7bfefe5f8:  00007ff851c6b000  00007ff7bfefe640 
00007ff7bfefe608:  00007ff810261ad6  000000000000002c 
00007ff7bfefe618:  000000000000002d  0000600003300000 
00007ff7bfefe628:  0000000000000003  0000600002c00000 
00007ff7bfefe638:  0000000000000000  00007ff7bfefe670 
00007ff7bfefe648: <00007ff810411893  0000000000000000 
00007ff7bfefe658:  00000020bfefe6b0  0000600002c00000 
00007ff7bfefe668:  00007ff7bfefe6b0  0000600003300000 
00007ff7bfefe678:  0000000000000003  0000000000000080 
00007ff7bfefe688:  0000000000000001  00007ff7bfefe6a0 
00007ff7bfefe698:  00007ff810411843  00007ff7bfefe6e0 
00007ff7bfefe6a8:  00007ff8102ddbce  0000600002c00080 
00007ff7bfefe6b8:  0000000008c2b033  0000600002c00000 
00007ff7bfefe6c8:  00007ffffffffff8  00007ff851c57260 
00007ff7bfefe6d8:  0000000080080001  00007ff7bfefe7c0 
00007ff7bfefe6e8:  00007ff8102ddb5c  0000003000000010 
00007ff7bfefe6f8:  00007ff7bfefe7d0  00007ff7bfefe710 
00007ff7bfefe708:  00007ff89b0b1b30  00007ff89b0bb4c8 
00007ff7bfefe718:  00007ff851c57260  00007ff851c57260 
00007ff7bfefe728:  0000000000000001  00000000ffffffff 
00007ff7bfefe738:  0000000000000000  00007ff89b0b1e58 

goroutine 6 [syscall]:
runtime.cgocall(0x1001800, 0xc00005ece0, 0xc0000100e0)
        /usr/local/Cellar/go@1.15/1.15.15/libexec/src/runtime/cgocall.go:133 +0x7a fp=0xc00005ecb0 sp=0xc00005ec78 pc=0x104547a
net._C2func_getaddrinfo(0xc000018340, 0x0, 0xc00007af60, 0xc0000100e0, 0xc000000000, 0x0, 0x0)
        _cgo_gotypes.go:100 +0x73 fp=0xc00005ece0 sp=0xc00005ecb0 pc=0x126faf3
net.cgoLookupIPCNAME.func1(0xc000018340, 0x11, 0x11, 0xc00007af60, 0xc0000100e0, 0xc00004b5f8, 0x12728bf, 0x1507420)
        /usr/local/Cellar/go@1.15/1.15.15/libexec/src/net/cgo_unix.go:161 +0xd3 fp=0xc00005ed40 sp=0xc00005ece0 pc=0x1274d13
net.cgoLookupIPCNAME(0x1495658, 0x3, 0xc000018300, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, ...)
        /usr/local/Cellar/go@1.15/1.15.15/libexec/src/net/cgo_unix.go:161 +0x259 fp=0xc00005ef18 sp=0xc00005ed40 pc=0x1271439
net.cgoIPLookup(0xc000026540, 0x1495658, 0x3, 0xc000018300, 0x10)
        /usr/local/Cellar/go@1.15/1.15.15/libexec/src/net/cgo_unix.go:218 +0x7d fp=0xc00005efb8 sp=0xc00005ef18 pc=0x1271f1d
runtime.goexit()
        /usr/local/Cellar/go@1.15/1.15.15/libexec/src/runtime/asm_amd64.s:1374 +0x1 fp=0xc00005efc0 sp=0xc00005efb8 pc=0x10ad4c1
created by net.cgoLookupIP
        /usr/local/Cellar/go@1.15/1.15.15/libexec/src/net/cgo_unix.go:228 +0xde

goroutine 1 [select]:
net/http.(*Transport).getConn(0xc00013c280, 0xc00012c280, 0x0, 0xc00001e140, 0x5, 0xc000018300, 0x14, 0x0, 0x0, 0x0, ...)
        /usr/local/Cellar/go@1.15/1.15.15/libexec/src/net/http/transport.go:1350 +0x9be
net/http.(*Transport).roundTrip(0xc00013c280, 0xc000150100, 0xc0000160f0, 0xc00013a780, 0xc000012de0)
        /usr/local/Cellar/go@1.15/1.15.15/libexec/src/net/http/transport.go:569 +0xaed
net/http.(*Transport).RoundTrip(0xc00013c280, 0xc000150100, 0x8, 0x1496f6b, 0xb)
        /usr/local/Cellar/go@1.15/1.15.15/libexec/src/net/http/roundtrip.go:17 +0x47
github.com/andygrunwald/go-jira.(*BasicAuthTransport).RoundTrip(0xc00007acc0, 0xc000150000, 0xc00007acc0, 0x0, 0x0)
        /Users/user/go/pkg/mod/github.com/andygrunwald/go-jira@v1.14.0/jira.go:366 +0x109
net/http.send(0xc000150000, 0x15023e0, 0xc00007acc0, 0x0, 0x0, 0x0, 0x108f2c0, 0x0, 0xc00010d5d0, 0x108f4a5)
        /usr/local/Cellar/go@1.15/1.15.15/libexec/src/net/http/client.go:252 +0x6db
net/http.(*Client).send(0xc00007acf0, 0xc000150000, 0x0, 0x0, 0x0, 0xc0000100c8, 0x0, 0x1, 0x149793d)
        /usr/local/Cellar/go@1.15/1.15.15/libexec/src/net/http/client.go:176 +0x1d6
net/http.(*Client).do(0xc00007acf0, 0xc000150000, 0x0, 0x0, 0x0)
        /usr/local/Cellar/go@1.15/1.15.15/libexec/src/net/http/client.go:718 +0x2d8
net/http.(*Client).Do(0xc00007acf0, 0xc000150000, 0x0, 0xc00007adb0, 0x30)
        /usr/local/Cellar/go@1.15/1.15.15/libexec/src/net/http/client.go:586 +0x47
github.com/andygrunwald/go-jira.(*Client).Do(0xc00014e000, 0xc000150000, 0x1424b40, 0xc00007adb0, 0x0, 0x0, 0x0)
        /Users/user/go/pkg/mod/github.com/andygrunwald/go-jira@v1.14.0/jira.go:277 +0x95
github.com/andygrunwald/go-jira.(*IssueService).SearchWithContext(0xc000010028, 0x1507460, 0xc0000140c0, 0x1497ac3, 0xd, 0xc00010df30, 0xc000010048, 0xc00014e040, 0xc000010040, 0xc00014e038, ...)
        /Users/user/go/pkg/mod/github.com/andygrunwald/go-jira@v1.14.0/issue.go:1096 +0x27f
github.com/andygrunwald/go-jira.(*IssueService).Search(0xc000010028, 0x1497ac3, 0xd, 0xc00010df30, 0xc00014e000, 0x0, 0x0, 0x14959ec, 0x5, 0x14ad2a0)
        /Users/user/go/pkg/mod/github.com/andygrunwald/go-jira@v1.14.0/issue.go:1105 +0xa5
main.main()
        /Users/user/sandbox/go-jira/main.go:26 +0x385

goroutine 4 [select]:
net.(*Resolver).lookupIPAddr(0x16daae0, 0x1507460, 0xc0000140c0, 0x1495658, 0x3, 0xc000018300, 0x10, 0x1bb, 0x0, 0x0, ...)
        /usr/local/Cellar/go@1.15/1.15.15/libexec/src/net/lookup.go:299 +0x8cc
net.(*Resolver).internetAddrList(0x16daae0, 0x1507460, 0xc0000140c0, 0x1495658, 0x3, 0xc000018300, 0x14, 0x0, 0x0, 0x0, ...)
        /usr/local/Cellar/go@1.15/1.15.15/libexec/src/net/ipsock.go:280 +0x6dc
net.(*Resolver).resolveAddrList(0x16daae0, 0x1507460, 0xc0000140c0, 0x14957c9, 0x4, 0x1495658, 0x3, 0xc000018300, 0x14, 0x0, ...)
        /usr/local/Cellar/go@1.15/1.15.15/libexec/src/net/dial.go:221 +0x5af
net.(*Dialer).DialContext(0x16db0a0, 0x1507460, 0xc0000140c0, 0x1495658, 0x3, 0xc000018300, 0x14, 0x0, 0x0, 0x0, ...)
        /usr/local/Cellar/go@1.15/1.15.15/libexec/src/net/dial.go:403 +0x319
net/http.(*Transport).dial(0xc00013c280, 0x1507460, 0xc0000140c0, 0x1495658, 0x3, 0xc000018300, 0x14, 0x0, 0x0, 0x0, ...)
        /usr/local/Cellar/go@1.15/1.15.15/libexec/src/net/http/transport.go:1153 +0x249
net/http.(*Transport).dialConn(0xc00013c280, 0x1507460, 0xc0000140c0, 0x0, 0xc00001e140, 0x5, 0xc000018300, 0x14, 0x0, 0xc000120b40, ...)
        /usr/local/Cellar/go@1.15/1.15.15/libexec/src/net/http/transport.go:1582 +0x2b7f
net/http.(*Transport).dialConnFor(0xc00013c280, 0xc0001302c0)
        /usr/local/Cellar/go@1.15/1.15.15/libexec/src/net/http/transport.go:1424 +0x152
created by net/http.(*Transport).queueForDial
        /usr/local/Cellar/go@1.15/1.15.15/libexec/src/net/http/transport.go:1393 +0x6b0

goroutine 5 [select]:
net.cgoLookupIP(0x1507420, 0xc00012c2c0, 0x1495658, 0x3, 0xc000018300, 0x10, 0x0, 0x0, 0x0, 0x0, ...)
        /usr/local/Cellar/go@1.15/1.15.15/libexec/src/net/cgo_unix.go:229 +0x1e9
net.(*Resolver).lookupIP(0x16daae0, 0x1507420, 0xc00012c2c0, 0x1495658, 0x3, 0xc000018300, 0x10, 0x0, 0x0, 0x0, ...)
        /usr/local/Cellar/go@1.15/1.15.15/libexec/src/net/lookup_unix.go:96 +0x217
net.glob..func1(0x1507420, 0xc00012c2c0, 0xc000012e20, 0x1495658, 0x3, 0xc000018300, 0x10, 0x0, 0x0, 0x0, ...)
        /usr/local/Cellar/go@1.15/1.15.15/libexec/src/net/hook.go:23 +0x9f
net.(*Resolver).lookupIPAddr.func1(0x0, 0x0, 0x0, 0x0)
        /usr/local/Cellar/go@1.15/1.15.15/libexec/src/net/lookup.go:293 +0x162
internal/singleflight.(*Group).doCall(0x16daaf0, 0xc0000781e0, 0xc000018320, 0x14, 0xc00012c300)
        /usr/local/Cellar/go@1.15/1.15.15/libexec/src/internal/singleflight/singleflight.go:95 +0x52
created by internal/singleflight.(*Group).DoChan
        /usr/local/Cellar/go@1.15/1.15.15/libexec/src/internal/singleflight/singleflight.go:88 +0x4be

rax    0x2000209
rbx    0x80
rcx    0x7ff7bfefe648
rdx    0x0
rdi    0x8
rsi    0x1
rbp    0x7ff7bfefe690
rsp    0x7ff7bfefe648
r8     0x600002c00000
r9     0x80
r10    0x0
r11    0x246
r12    0x0
r13    0x0
r14    0x1
r15    0x8
rip    0x7ff81040fdfe
rflags 0x246
cs     0x7
fs     0x0
gs     0x0
exit status 2

Expected behavior

Start application with key-race should not throw panic.

Possible Solution

Maybe you unsafe use one variable from different goroutines?

Your Environment

Include as many relevant details about the environment you experienced the problem in

Additional context

I think this behavior can cause incorrect data to be received on request from Jira API.

github-actions[bot] commented 2 years ago

Hi! Thank you for taking the time to create your first issue! Really cool to see you here for the first time. Please give us a bit of time to review it.

benjivesterby commented 2 years ago

@AntonYurchenko can you please upgrade to Go 1.17.6 and let me know if this is still an issue?

andygrunwald commented 2 years ago

Hey,

I am very sorry that this issue has been open for a long time with no final solution. We work on this project in our spare time, and sometimes, other priorities take over. This is the typical open source dilemma.

However, there is news: We are kicking off v2 of this library 🚀

To provide visibility, we created the Road to v2 Milestone and calling for your feedback in https://github.com/andygrunwald/go-jira/issues/489

The development will take some time; however, I hope you can benefit from the changes. If you seek priority development for your issue + you like to sponsor it, please contact me.

What does this mean for my issue?

We will work on this issue indirectly. This means that during the development phase, we aim to tackle it. Maybe in a different way like it is currently handled. Please understand that this will take a while because we are running this in our spare time.

Final words

Thanks for using this library. If there is anything else you would like to tell us, let us know!