Merge pull request #2716 from halseth/getutxo-cancel-interface-change
Cancel long-running Neutrino GetUTXO calls on quit
This commit is contained in:
commit
29a60f39e2
@ -764,6 +764,7 @@ func (n *NeutrinoNotifier) RegisterSpendNtfn(outpoint *wire.OutPoint,
|
|||||||
neutrino.EndBlock(&waddrmgr.BlockStamp{
|
neutrino.EndBlock(&waddrmgr.BlockStamp{
|
||||||
Height: int32(historicalDispatch.EndHeight),
|
Height: int32(historicalDispatch.EndHeight),
|
||||||
}),
|
}),
|
||||||
|
neutrino.QuitChan(n.quit),
|
||||||
)
|
)
|
||||||
if err != nil && !strings.Contains(err.Error(), "not found") {
|
if err != nil && !strings.Contains(err.Error(), "not found") {
|
||||||
return nil, err
|
return nil, err
|
||||||
|
@ -124,12 +124,14 @@ func (b *mockArbitratorLog) WipeHistory() error {
|
|||||||
|
|
||||||
type mockChainIO struct{}
|
type mockChainIO struct{}
|
||||||
|
|
||||||
|
var _ lnwallet.BlockChainIO = (*mockChainIO)(nil)
|
||||||
|
|
||||||
func (*mockChainIO) GetBestBlock() (*chainhash.Hash, int32, error) {
|
func (*mockChainIO) GetBestBlock() (*chainhash.Hash, int32, error) {
|
||||||
return nil, 0, nil
|
return nil, 0, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (*mockChainIO) GetUtxo(op *wire.OutPoint, _ []byte,
|
func (*mockChainIO) GetUtxo(op *wire.OutPoint, _ []byte,
|
||||||
heightHint uint32) (*wire.TxOut, error) {
|
heightHint uint32, _ <-chan struct{}) (*wire.TxOut, error) {
|
||||||
return nil, nil
|
return nil, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -38,7 +38,7 @@ func (b *BtcWallet) GetBestBlock() (*chainhash.Hash, int32, error) {
|
|||||||
//
|
//
|
||||||
// This method is a part of the lnwallet.BlockChainIO interface.
|
// This method is a part of the lnwallet.BlockChainIO interface.
|
||||||
func (b *BtcWallet) GetUtxo(op *wire.OutPoint, pkScript []byte,
|
func (b *BtcWallet) GetUtxo(op *wire.OutPoint, pkScript []byte,
|
||||||
heightHint uint32) (*wire.TxOut, error) {
|
heightHint uint32, cancel <-chan struct{}) (*wire.TxOut, error) {
|
||||||
|
|
||||||
switch backend := b.chain.(type) {
|
switch backend := b.chain.(type) {
|
||||||
|
|
||||||
@ -51,6 +51,7 @@ func (b *BtcWallet) GetUtxo(op *wire.OutPoint, pkScript []byte,
|
|||||||
neutrino.StartBlock(&waddrmgr.BlockStamp{
|
neutrino.StartBlock(&waddrmgr.BlockStamp{
|
||||||
Height: int32(heightHint),
|
Height: int32(heightHint),
|
||||||
}),
|
}),
|
||||||
|
neutrino.QuitChan(cancel),
|
||||||
)
|
)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
|
@ -67,8 +67,9 @@ type BtcWallet struct {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// A compile time check to ensure that BtcWallet implements the
|
// A compile time check to ensure that BtcWallet implements the
|
||||||
// WalletController interface.
|
// WalletController and BlockChainIO interfaces.
|
||||||
var _ lnwallet.WalletController = (*BtcWallet)(nil)
|
var _ lnwallet.WalletController = (*BtcWallet)(nil)
|
||||||
|
var _ lnwallet.BlockChainIO = (*BtcWallet)(nil)
|
||||||
|
|
||||||
// New returns a new fully initialized instance of BtcWallet given a valid
|
// New returns a new fully initialized instance of BtcWallet given a valid
|
||||||
// configuration struct.
|
// configuration struct.
|
||||||
|
@ -268,8 +268,10 @@ type BlockChainIO interface {
|
|||||||
// script that the outpoint creates. In the case that the output is in
|
// script that the outpoint creates. In the case that the output is in
|
||||||
// the UTXO set, then the output corresponding to that output is
|
// the UTXO set, then the output corresponding to that output is
|
||||||
// returned. Otherwise, a non-nil error will be returned.
|
// returned. Otherwise, a non-nil error will be returned.
|
||||||
GetUtxo(op *wire.OutPoint, pkScript []byte,
|
// As for some backends this call can initiate a rescan, the passed
|
||||||
heightHint uint32) (*wire.TxOut, error)
|
// cancel channel can be closed to abort the call.
|
||||||
|
GetUtxo(op *wire.OutPoint, pkScript []byte, heightHint uint32,
|
||||||
|
cancel <-chan struct{}) (*wire.TxOut, error)
|
||||||
|
|
||||||
// GetBlockHash returns the hash of the block in the best blockchain
|
// GetBlockHash returns the hash of the block in the best blockchain
|
||||||
// at the given height.
|
// at the given height.
|
||||||
|
@ -971,10 +971,15 @@ func (l *LightningWallet) handleFundingCounterPartySigs(msg *addCounterPartySigs
|
|||||||
txin.Witness[len(txin.Witness)-1],
|
txin.Witness[len(txin.Witness)-1],
|
||||||
)
|
)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
msg.err <- fmt.Errorf("cannot create script: "+
|
||||||
|
"%v", err)
|
||||||
|
msg.completeChan <- nil
|
||||||
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
output, err := l.Cfg.ChainIO.GetUtxo(
|
output, err := l.Cfg.ChainIO.GetUtxo(
|
||||||
&txin.PreviousOutPoint,
|
&txin.PreviousOutPoint,
|
||||||
pkScript, 0,
|
pkScript, 0, l.quit,
|
||||||
)
|
)
|
||||||
if output == nil {
|
if output == nil {
|
||||||
msg.err <- fmt.Errorf("input to funding tx "+
|
msg.err <- fmt.Errorf("input to funding tx "+
|
||||||
|
4
mock.go
4
mock.go
@ -205,12 +205,14 @@ type mockChainIO struct {
|
|||||||
bestHeight int32
|
bestHeight int32
|
||||||
}
|
}
|
||||||
|
|
||||||
|
var _ lnwallet.BlockChainIO = (*mockChainIO)(nil)
|
||||||
|
|
||||||
func (m *mockChainIO) GetBestBlock() (*chainhash.Hash, int32, error) {
|
func (m *mockChainIO) GetBestBlock() (*chainhash.Hash, int32, error) {
|
||||||
return activeNetParams.GenesisHash, m.bestHeight, nil
|
return activeNetParams.GenesisHash, m.bestHeight, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (*mockChainIO) GetUtxo(op *wire.OutPoint, _ []byte,
|
func (*mockChainIO) GetUtxo(op *wire.OutPoint, _ []byte,
|
||||||
heightHint uint32) (*wire.TxOut, error) {
|
heightHint uint32, _ <-chan struct{}) (*wire.TxOut, error) {
|
||||||
return nil, nil
|
return nil, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -181,7 +181,8 @@ func (m *mockChain) addUtxo(op wire.OutPoint, out *wire.TxOut) {
|
|||||||
m.utxos[op] = *out
|
m.utxos[op] = *out
|
||||||
m.Unlock()
|
m.Unlock()
|
||||||
}
|
}
|
||||||
func (m *mockChain) GetUtxo(op *wire.OutPoint, _ []byte, _ uint32) (*wire.TxOut, error) {
|
func (m *mockChain) GetUtxo(op *wire.OutPoint, _ []byte, _ uint32,
|
||||||
|
_ <-chan struct{}) (*wire.TxOut, error) {
|
||||||
m.RLock()
|
m.RLock()
|
||||||
defer m.RUnlock()
|
defer m.RUnlock()
|
||||||
|
|
||||||
|
@ -1113,6 +1113,7 @@ func (r *ChannelRouter) processUpdate(msg interface{}) error {
|
|||||||
// been closed so we'll ignore it.
|
// been closed so we'll ignore it.
|
||||||
chanUtxo, err := r.cfg.Chain.GetUtxo(
|
chanUtxo, err := r.cfg.Chain.GetUtxo(
|
||||||
fundingPoint, fundingPkScript, channelID.BlockHeight,
|
fundingPoint, fundingPkScript, channelID.BlockHeight,
|
||||||
|
r.quit,
|
||||||
)
|
)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
r.rejectMtx.Lock()
|
r.rejectMtx.Lock()
|
||||||
|
@ -10,6 +10,7 @@ import (
|
|||||||
"github.com/btcsuite/btcd/wire"
|
"github.com/btcsuite/btcd/wire"
|
||||||
"github.com/lightningnetwork/lnd/chainntnfs"
|
"github.com/lightningnetwork/lnd/chainntnfs"
|
||||||
"github.com/lightningnetwork/lnd/input"
|
"github.com/lightningnetwork/lnd/input"
|
||||||
|
"github.com/lightningnetwork/lnd/lnwallet"
|
||||||
)
|
)
|
||||||
|
|
||||||
var (
|
var (
|
||||||
@ -237,12 +238,14 @@ func (m *MockNotifier) RegisterSpendNtfn(outpoint *wire.OutPoint,
|
|||||||
|
|
||||||
type mockChainIO struct{}
|
type mockChainIO struct{}
|
||||||
|
|
||||||
|
var _ lnwallet.BlockChainIO = (*mockChainIO)(nil)
|
||||||
|
|
||||||
func (m *mockChainIO) GetBestBlock() (*chainhash.Hash, int32, error) {
|
func (m *mockChainIO) GetBestBlock() (*chainhash.Hash, int32, error) {
|
||||||
return nil, mockChainIOHeight, nil
|
return nil, mockChainIOHeight, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (m *mockChainIO) GetUtxo(op *wire.OutPoint, pkScript []byte,
|
func (m *mockChainIO) GetUtxo(op *wire.OutPoint, pkScript []byte,
|
||||||
heightHint uint32) (*wire.TxOut, error) {
|
heightHint uint32, _ <-chan struct{}) (*wire.TxOut, error) {
|
||||||
|
|
||||||
return nil, nil
|
return nil, nil
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user