channel_notifier: update backup on pending chan
To fix the discrepancy between getting the channel backups via RPC where all pending channels are included, we also update the channel.backup file on disk whenever we get a pending channel event notification.
This commit is contained in:
parent
182835d504
commit
d8c62c37a8
@ -7,6 +7,7 @@ import (
|
||||
"github.com/btcsuite/btcd/btcec"
|
||||
"github.com/btcsuite/btcd/wire"
|
||||
"github.com/lightningnetwork/lnd/chanbackup"
|
||||
"github.com/lightningnetwork/lnd/channeldb"
|
||||
"github.com/lightningnetwork/lnd/channelnotifier"
|
||||
)
|
||||
|
||||
@ -51,6 +52,35 @@ func (c *channelNotifier) SubscribeChans(startingChans map[wire.OutPoint]struct{
|
||||
quit := make(chan struct{})
|
||||
chanUpdates := make(chan chanbackup.ChannelEvent, 1)
|
||||
|
||||
// sendChanOpenUpdate is a closure that sends a ChannelEvent to the
|
||||
// chanUpdates channel to inform subscribers about new pending or
|
||||
// confirmed channels.
|
||||
sendChanOpenUpdate := func(newOrPendingChan *channeldb.OpenChannel) {
|
||||
nodeAddrs, err := c.addrs.AddrsForNode(
|
||||
newOrPendingChan.IdentityPub,
|
||||
)
|
||||
if err != nil {
|
||||
pub := newOrPendingChan.IdentityPub
|
||||
ltndLog.Errorf("unable to fetch addrs for %x: %v",
|
||||
pub.SerializeCompressed(), err)
|
||||
}
|
||||
|
||||
chanEvent := chanbackup.ChannelEvent{
|
||||
NewChans: []chanbackup.ChannelWithAddrs{
|
||||
{
|
||||
OpenChannel: newOrPendingChan,
|
||||
Addrs: nodeAddrs,
|
||||
},
|
||||
},
|
||||
}
|
||||
|
||||
select {
|
||||
case chanUpdates <- chanEvent:
|
||||
case <-quit:
|
||||
return
|
||||
}
|
||||
}
|
||||
|
||||
// In order to adhere to the interface, we'll proxy the events from the
|
||||
// channel notifier to the sub-swapper in a format it understands.
|
||||
go func() {
|
||||
@ -74,37 +104,18 @@ func (c *channelNotifier) SubscribeChans(startingChans map[wire.OutPoint]struct{
|
||||
// TODO(roasbeef): batch dispatch ntnfs
|
||||
|
||||
switch event := e.(type) {
|
||||
// A new channel has been opened and is still
|
||||
// pending. We can still create a backup, even
|
||||
// if the final channel ID is not yet available.
|
||||
case channelnotifier.PendingOpenChannelEvent:
|
||||
pendingChan := event.PendingChannel
|
||||
sendChanOpenUpdate(pendingChan)
|
||||
|
||||
// A new channel has been opened, we'll obtain
|
||||
// the node address, then send to the
|
||||
// A new channel has been confirmed, we'll
|
||||
// obtain the node address, then send to the
|
||||
// sub-swapper.
|
||||
case channelnotifier.OpenChannelEvent:
|
||||
nodeAddrs, err := c.addrs.AddrsForNode(
|
||||
event.Channel.IdentityPub,
|
||||
)
|
||||
if err != nil {
|
||||
pub := event.Channel.IdentityPub
|
||||
ltndLog.Errorf("unable to "+
|
||||
"fetch addrs for %x: %v",
|
||||
pub.SerializeCompressed(),
|
||||
err)
|
||||
}
|
||||
|
||||
channel := event.Channel
|
||||
chanEvent := chanbackup.ChannelEvent{
|
||||
NewChans: []chanbackup.ChannelWithAddrs{
|
||||
{
|
||||
OpenChannel: channel,
|
||||
Addrs: nodeAddrs,
|
||||
},
|
||||
},
|
||||
}
|
||||
|
||||
select {
|
||||
case chanUpdates <- chanEvent:
|
||||
case <-quit:
|
||||
return
|
||||
}
|
||||
sendChanOpenUpdate(event.Channel)
|
||||
|
||||
// An existing channel has been closed, we'll
|
||||
// send only the chanPoint of the closed
|
||||
|
Loading…
Reference in New Issue
Block a user