fundingmanager: hold lock during loop

As a follow-up to #4560 we actually need to hold the reservation mutex
during the full loop where we count the pending reservations. Otherwise
the results might become inaccurate for concurrent funding flows.
This commit is contained in:
Oliver Gugger 2020-08-31 09:15:01 +02:00
parent e4764a67cc
commit 199336a342
No known key found for this signature in database
GPG Key ID: 8E4256593F177720

@ -1206,12 +1206,10 @@ func (f *fundingManager) handleFundingOpen(fmsg *fundingOpenMsg) {
msg := fmsg.msg msg := fmsg.msg
amt := msg.FundingAmount amt := msg.FundingAmount
// We count the number of pending channels for this peer. This is the // We get all pending channels for this peer. This is the list of the
// sum of the active reservations and the channels pending open in the // active reservations and the channels pending open in the database.
// database.
f.resMtx.RLock() f.resMtx.RLock()
reservations := f.activeReservations[peerIDKey] reservations := f.activeReservations[peerIDKey]
f.resMtx.RUnlock()
// We don't count reservations that were created from a canned funding // We don't count reservations that were created from a canned funding
// shim. The user has registered the shim and therefore expects this // shim. The user has registered the shim and therefore expects this
@ -1222,6 +1220,7 @@ func (f *fundingManager) handleFundingOpen(fmsg *fundingOpenMsg) {
numPending++ numPending++
} }
} }
f.resMtx.RUnlock()
// Also count the channels that are already pending. There we don't know // Also count the channels that are already pending. There we don't know
// the underlying intent anymore, unfortunately. // the underlying intent anymore, unfortunately.