copernet / copernicus

An alternative implementation of the Bitcoin Cash protocol, written in Golang
https://copernet.io
BSD 2-Clause "Simplified" License
85 stars 34 forks source link

Remove unnecessary read lock in CheckTxBeforeAcceptToMemPool #232

Closed whitefen closed 5 years ago

whitefen commented 5 years ago

Mempool mutex 'RLock' is called outside and inside FindTx() in function 'CheckTxBeforeAcceptToMemPool'. Goroutine might be blocked if a write Lock called between twice RLock. (peerDoneHandler -> RemoveOrphansByTag -> mempool.(*TxMempool).Lock)

whunmr commented 5 years ago
(dlv) goroutine  268051
Switched from 268037 to 268051 (thread 16077)
(dlv) stack
 0  0x0000000000434959 in runtime.gopark
    at /usr/local/go/src/runtime/proc.go:292
 1  0x0000000000434a0e in runtime.goparkunlock
    at /usr/local/go/src/runtime/proc.go:297
 2  0x0000000000445b68 in runtime.semacquire1
    at /usr/local/go/src/runtime/sema.go:144
 3  0x00000000004457e9 in sync.runtime_Semacquire
    at /usr/local/go/src/runtime/sema.go:56
 4  0x000000000046e411 in sync.(*RWMutex).RLock
    at /usr/local/go/src/sync/rwmutex.go:50
 5  0x0000000000ada3ed in github.com/copernet/copernicus/model/mempool.(*TxMempool).RLock
    at /root/go/src/github.com/copernet/copernicus/model/mempool/txmempool.go:106
 6  0x0000000000bd3418 in github.com/copernet/copernicus/service/mining.(*BlockAssembler).addPackageTxs
    at /root/go/src/github.com/copernet/copernicus/service/mining/mining.go:191
 7  0x0000000000bd48f8 in github.com/copernet/copernicus/service/mining.(*BlockAssembler).CreateNewBlock
    at /root/go/src/github.com/copernet/copernicus/service/mining/mining.go:341
 8  0x0000000000be0a10 in github.com/copernet/copernicus/rpc.handleGetBlockTemplateRequest
    at /root/go/src/github.com/copernet/copernicus/rpc/mining.go:193
 9  0x0000000000be02b0 in github.com/copernet/copernicus/rpc.handleGetblocktemplate
    at /root/go/src/github.com/copernet/copernicus/rpc/mining.go:132
10  0x0000000000bfe9e4 in github.com/copernet/copernicus/rpc.(*Server).standardCmdResult
    at /root/go/src/github.com/copernet/copernicus/rpc/rpcserver.go:219
11  0x0000000000c00633 in github.com/copernet/copernicus/rpc.(*Server).jsonRPCRead
    at /root/go/src/github.com/copernet/copernicus/rpc/rpcserver.go:380
12  0x0000000000c09259 in github.com/copernet/copernicus/rpc.(*Server).Start.func1
    at /root/go/src/github.com/copernet/copernicus/rpc/rpcserver.go:450
13  0x00000000007e33e4 in net/http.HandlerFunc.ServeHTTP
    at /usr/local/go/src/net/http/server.go:1947
14  0x00000000007e6063 in net/http.(*ServeMux).ServeHTTP
    at /usr/local/go/src/net/http/server.go:2337
15  0x00000000007e7444 in net/http.serverHandler.ServeHTTP
    at /usr/local/go/src/net/http/server.go:2694
16  0x00000000007e23d2 in net/http.(*conn).serve
    at /usr/local/go/src/net/http/server.go:1830
17  0x0000000000464251 in runtime.goexit
    at /usr/local/go/src/runtime/asm_amd64.s:2361
(dlv) goroutine  15
Switched from 14 to 15 (thread 16078)
(dlv) stack
 0  0x0000000000434959 in runtime.gopark
    at /usr/local/go/src/runtime/proc.go:292
 1  0x0000000000434a0e in runtime.goparkunlock
    at /usr/local/go/src/runtime/proc.go:297
 2  0x0000000000445b68 in runtime.semacquire1
    at /usr/local/go/src/runtime/sema.go:144
 3  0x00000000004457e9 in sync.runtime_Semacquire
    at /usr/local/go/src/runtime/sema.go:56
 4  0x000000000046e411 in sync.(*RWMutex).RLock
    at /usr/local/go/src/sync/rwmutex.go:50
 5  0x0000000000ada3ed in github.com/copernet/copernicus/model/mempool.(*TxMempool).RLock
    at /root/go/src/github.com/copernet/copernicus/model/mempool/txmempool.go:106
 6  0x0000000000adbeab in github.com/copernet/copernicus/model/mempool.(*TxMempool).FindTx
    at /root/go/src/github.com/copernet/copernicus/model/mempool/txmempool.go:294
 7  0x0000000000b0bdc9 in github.com/copernet/copernicus/logic/ltx.CheckTxBeforeAcceptToMemPool
    at /root/go/src/github.com/copernet/copernicus/logic/ltx/ltx.go:107
 8  0x0000000000b16958 in github.com/copernet/copernicus/logic/lmempool.AcceptTxToMemPool
    at /root/go/src/github.com/copernet/copernicus/logic/lmempool/ltxmempool.go:22
 9  0x0000000000b173ac in github.com/copernet/copernicus/logic/lmempool.TryAcceptOrphansTxs
    at /root/go/src/github.com/copernet/copernicus/logic/lmempool/ltxmempool.go:81
10  0x0000000000b55234 in github.com/copernet/copernicus/service.ProcessTransaction
    at /root/go/src/github.com/copernet/copernicus/service/transactionservice.go:31
11  0x0000000000b6cee5 in github.com/copernet/copernicus/net/syncmanager.(*SyncManager).handleTxMsg
    at /root/go/src/github.com/copernet/copernicus/net/syncmanager/syncmanager.go:488
12  0x0000000000b7572a in github.com/copernet/copernicus/net/syncmanager.(*SyncManager).messagesHandler
    at /root/go/src/github.com/copernet/copernicus/net/syncmanager/syncmanager.go:1278
13  0x0000000000464251 in runtime.goexit
    at /usr/local/go/src/runtime/asm_amd64.s:2361

503_too_busy_hang_stack.txt.zip