routing: launch fetchFundingTx in goroutine so router can exit

This commit introduces a wrapper function fetchFundingTxWrapper
which calls fetchFundingTx in a goroutine. This is to avoid an issue
with pruned nodes where the router is attempting to stop, but the
prunedBlockDispatcher is waiting to connect to peers that can serve
the block. This can cause the shutdown process to hang until we
connect to a peer that can send us the block.
This commit is contained in:
Eugene Siegel 2023-11-06 10:14:39 -05:00 committed by eugene
parent 9f42459036
commit faf76fbf0e
No known key found for this signature in database
GPG key ID: 118759E83439A9B1

View file

@ -1590,7 +1590,7 @@ func (r *ChannelRouter) processUpdate(msg interface{},
// to obtain the full funding outpoint that's encoded within
// the channel ID.
channelID := lnwire.NewShortChanIDFromInt(msg.ChannelID)
fundingTx, err := r.fetchFundingTx(&channelID)
fundingTx, err := r.fetchFundingTxWrapper(&channelID)
if err != nil {
// In order to ensure we don't erroneously mark a
// channel as a zombie due to an RPC failure, we'll
@ -1800,6 +1800,36 @@ func (r *ChannelRouter) processUpdate(msg interface{},
return nil
}
// fetchFundingTxWrapper is a wrapper around fetchFundingTx, except that it
// will exit if the router has stopped.
func (r *ChannelRouter) fetchFundingTxWrapper(chanID *lnwire.ShortChannelID) (
*wire.MsgTx, error) {
txChan := make(chan *wire.MsgTx, 1)
errChan := make(chan error, 1)
go func() {
tx, err := r.fetchFundingTx(chanID)
if err != nil {
errChan <- err
return
}
txChan <- tx
}()
select {
case tx := <-txChan:
return tx, nil
case err := <-errChan:
return nil, err
case <-r.quit:
return nil, ErrRouterShuttingDown
}
}
// fetchFundingTx returns the funding transaction identified by the passed
// short channel ID.
//