chain service: use safe AddrManager address accessor #230
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
This PR requires btcsuite/btcd#1760. The
replace
would be removed and the btcdrequire
updated if that is merged. The data races between neutrino and btcd are described on that PR.The
*KnownAddress
returned by(*AddrManager).GetAddress
is not safe for use while other goroutines are using theAddrManager
's methods for updating peer states e.g.Connect
/Attempt
/AddAddresses
/SetServices
.The
newAddressFunc
closure created byNewChainService
as theConnManager
'sGetNewAddress
function was usingGetNetAddress
concurrent with other peer management goroutines. e.g. aPeer
'sinHandler
that has a callbacks toAddAddresses
andSetServices
.This resolves the issue by using the new
GetNetAddress
method instead ofGetAddress
. This is safe since the returnedwire.NetAddress
is immutable, unlike theKnownAddress
fromGetAddress
.