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

Fix data race in GetTxoutSetInfo for issue #226 #228

Closed whunmr closed 5 years ago

whunmr commented 5 years ago

fix data race in #226

and another two data races:

==================
WARNING: DATA RACE
Write at 0x00c0000ec210 by goroutine 82:
  github.com/copernet/copernicus/model/chain.(*Chain).SetTip()
      /Users/bj1809120051/.go/src/github.com/copernet/copernicus/model/chain/chain.go:345 +0x3d1
  github.com/copernet/copernicus/logic/lchain.UpdateTip()
      /Users/bj1809120051/.go/src/github.com/copernet/copernicus/logic/lchain/lchain.go:390 +0x96
  github.com/copernet/copernicus/logic/lchain.ConnectTip()
      /Users/bj1809120051/.go/src/github.com/copernet/copernicus/logic/lchain/lchain.go:301 +0x1db0
  github.com/copernet/copernicus/logic/lchain.ActivateBestChainStep()
      /Users/bj1809120051/.go/src/github.com/copernet/copernicus/logic/lchain/lactivechain.go:186 +0x750
  github.com/copernet/copernicus/logic/lchain.ActivateBestChain()
      /Users/bj1809120051/.go/src/github.com/copernet/copernicus/logic/lchain/lactivechain.go:85 +0x5c1
  github.com/copernet/copernicus/service.ProcessNewBlock()
      /Users/bj1809120051/.go/src/github.com/copernet/copernicus/service/blockservice.go:97 +0x92e
  github.com/copernet/copernicus/service.ProcessBlock()
      /Users/bj1809120051/.go/src/github.com/copernet/copernicus/service/blockservice.go:51 +0x75b
  github.com/copernet/copernicus/net/syncmanager.(*SyncManager).handleBlockMsg()
      /Users/bj1809120051/.go/src/github.com/copernet/copernicus/net/syncmanager/syncmanager.go:650 +0x563
  github.com/copernet/copernicus/net/syncmanager.(*SyncManager).messagesHandler()
      /Users/bj1809120051/.go/src/github.com/copernet/copernicus/net/syncmanager/syncmanager.go:1301 +0xc38

Previous read at 0x00c0000ec210 by goroutine 135:
  github.com/copernet/copernicus/model/chain.(*Chain).TipHeight()
      /Users/bj1809120051/.go/src/github.com/copernet/copernicus/model/chain/chain.go:170 +0x50
  github.com/copernet/copernicus/rpc.handleWaitForBlockHeight()
      /Users/bj1809120051/.go/src/github.com/copernet/copernicus/rpc/rpcblockchain.go:1007 +0x29b
  github.com/copernet/copernicus/rpc.(*Server).standardCmdResult()
      /Users/bj1809120051/.go/src/github.com/copernet/copernicus/rpc/rpcserver.go:217 +0x1f6
  github.com/copernet/copernicus/rpc.(*Server).jsonRPCRead()
      /Users/bj1809120051/.go/src/github.com/copernet/copernicus/rpc/rpcserver.go:378 +0x1d4a
  github.com/copernet/copernicus/rpc.(*Server).Start.func1()
      /Users/bj1809120051/.go/src/github.com/copernet/copernicus/rpc/rpcserver.go:448 +0x43e
  net/http.HandlerFunc.ServeHTTP()
      /usr/local/opt/go/libexec/src/net/http/server.go:1964 +0x6f
  net/http.(*ServeMux).ServeHTTP()
      /usr/local/opt/go/libexec/src/net/http/server.go:2361 +0x2cb
  net/http.serverHandler.ServeHTTP()
      /usr/local/opt/go/libexec/src/net/http/server.go:2741 +0x34e
  net/http.(*conn).serve()
      /usr/local/opt/go/libexec/src/net/http/server.go:1847 +0x1f7b

==================
==================
WARNING: DATA RACE
Write at 0x00c0000fe0c0 by goroutine 76:
  github.com/copernet/copernicus/model/chain.(*Chain).SetTip()
      /Users/bj1809120051/.go/src/github.com/copernet/copernicus/model/chain/chain.go:328 +0x3e4
  github.com/copernet/copernicus/logic/lchain.UpdateTip()
      /Users/bj1809120051/.go/src/github.com/copernet/copernicus/logic/lchain/lchain.go:390 +0x96
  github.com/copernet/copernicus/logic/lchain.DisconnectTip()
      /Users/bj1809120051/.go/src/github.com/copernet/copernicus/logic/lchain/lchain.go:367 +0x989
  github.com/copernet/copernicus/rpc.handleInvalidateBlock()
      /Users/bj1809120051/.go/src/github.com/copernet/copernicus/rpc/rpcblockchain.go:900 +0x57e
  github.com/copernet/copernicus/rpc.(*Server).standardCmdResult()
      /Users/bj1809120051/.go/src/github.com/copernet/copernicus/rpc/rpcserver.go:217 +0x1f6
  github.com/copernet/copernicus/rpc.(*Server).jsonRPCRead()
      /Users/bj1809120051/.go/src/github.com/copernet/copernicus/rpc/rpcserver.go:378 +0x1d4a
  github.com/copernet/copernicus/rpc.(*Server).Start.func1()
      /Users/bj1809120051/.go/src/github.com/copernet/copernicus/rpc/rpcserver.go:448 +0x43e
  net/http.HandlerFunc.ServeHTTP()
      /usr/local/opt/go/libexec/src/net/http/server.go:1964 +0x6f
  net/http.(*ServeMux).ServeHTTP()
      /usr/local/opt/go/libexec/src/net/http/server.go:2361 +0x2cb
  net/http.serverHandler.ServeHTTP()
      /usr/local/opt/go/libexec/src/net/http/server.go:2741 +0x34e
  net/http.(*conn).serve()
      /usr/local/opt/go/libexec/src/net/http/server.go:1847 +0x1f7b

Previous read at 0x00c0000fe0c0 by goroutine 83:
  github.com/copernet/copernicus/model/chain.(*Chain).GetIndex()
      /Users/bj1809120051/.go/src/github.com/copernet/copernicus/model/chain/chain.go:264 +0x74
  github.com/copernet/copernicus/model/chain.(*Chain).Contains()
      /Users/bj1809120051/.go/src/github.com/copernet/copernicus/model/chain/chain.go:286 +0x8d
  github.com/copernet/copernicus/model/chain.(*Chain).FindFork()
      /Users/bj1809120051/.go/src/github.com/copernet/copernicus/model/chain/chain.go:410 +0x135
  github.com/copernet/copernicus/net/syncmanager.(*SyncManager).syncPoints()
      /Users/bj1809120051/.go/src/github.com/copernet/copernicus/net/syncmanager/syncmanager.go:763 +0x268
  github.com/copernet/copernicus/net/syncmanager.(*SyncManager).fetchHeaderBlocks()
      /Users/bj1809120051/.go/src/github.com/copernet/copernicus/net/syncmanager/syncmanager.go:793 +0x37b
  github.com/copernet/copernicus/net/syncmanager.(*SyncManager).handleBlockMsg()
      /Users/bj1809120051/.go/src/github.com/copernet/copernicus/net/syncmanager/syncmanager.go:707 +0x102f
  github.com/copernet/copernicus/net/syncmanager.(*SyncManager).messagesHandler()
      /Users/bj1809120051/.go/src/github.com/copernet/copernicus/net/syncmanager/syncmanager.go:1301 +0xc38
wolfstudy commented 5 years ago

LGTM @whunmr