routing+lnd: prepare closed channel SCIDs in server
The method `FetchClosedChannels` sometimes prematurely mark a pending force closing channel as finalized, therefore we need to furthur check `FetchPendingChannels` to make sure the channel is indeed finalized.
This commit is contained in:
1 parent
e8f292edf4
commit
188aa9a4d4
3 files changed
+83
-53
No files matched your search
@@ -993,19 +993,19 @@ func newServer(cfg *Config, listenAddrs []net.Addr,
|
||||
}
|
||||
|
||||
s.chanRouter, err = routing.New(routing.Config{
|
||||
SelfNode: selfNode.PubKeyBytes,
|
||||
RoutingGraph: graphsession.NewRoutingGraph(chanGraph),
|
||||
Chain: cc.ChainIO,
|
||||
Payer: s.htlcSwitch,
|
||||
Control: s.controlTower,
|
||||
MissionControl: s.missionControl,
|
||||
SessionSource: paymentSessionSource,
|
||||
GetLink: s.htlcSwitch.GetLinkByShortID,
|
||||
NextPaymentID: sequencer.NextID,
|
||||
PathFindingConfig: pathFindingConfig,
|
||||
Clock: clock.NewDefaultClock(),
|
||||
ApplyChannelUpdate: s.graphBuilder.ApplyChannelUpdate,
|
||||
FetchClosedChannels: s.chanStateDB.FetchClosedChannels,
|
||||
SelfNode: selfNode.PubKeyBytes,
|
||||
RoutingGraph: graphsession.NewRoutingGraph(chanGraph),
|
||||
Chain: cc.ChainIO,
|
||||
Payer: s.htlcSwitch,
|
||||
Control: s.controlTower,
|
||||
MissionControl: s.missionControl,
|
||||
SessionSource: paymentSessionSource,
|
||||
GetLink: s.htlcSwitch.GetLinkByShortID,
|
||||
NextPaymentID: sequencer.NextID,
|
||||
PathFindingConfig: pathFindingConfig,
|
||||
Clock: clock.NewDefaultClock(),
|
||||
ApplyChannelUpdate: s.graphBuilder.ApplyChannelUpdate,
|
||||
ClosedSCIDs: s.fetchClosedChannelSCIDs(),
|
||||
})
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("can't create router: %w", err)
|
||||
@@ -4830,3 +4830,52 @@ func shouldPeerBootstrap(cfg *Config) bool {
|
||||
// covering the bootstrapping process.
|
||||
return !cfg.NoNetBootstrap && !isDevNetwork
|
||||
}
|
||||
|
||||
// fetchClosedChannelSCIDs returns a set of SCIDs that have their force closing
|
||||
// finished.
|
||||
func (s *server) fetchClosedChannelSCIDs() map[lnwire.ShortChannelID]struct{} {
|
||||
// Get a list of closed channels.
|
||||
channels, err := s.chanStateDB.FetchClosedChannels(false)
|
||||
if err != nil {
|
||||
srvrLog.Errorf("Failed to fetch closed channels: %v", err)
|
||||
return nil
|
||||
}
|
||||
|
||||
// Save the SCIDs in a map.
|
||||
closedSCIDs := make(map[lnwire.ShortChannelID]struct{}, len(channels))
|
||||
for _, c := range channels {
|
||||
// If the channel is not pending, its FC has been finalized.
|
||||
if !c.IsPending {
|
||||
closedSCIDs[c.ShortChanID] = struct{}{}
|
||||
}
|
||||
}
|
||||
|
||||
// Double check whether the reported closed channel has indeed finished
|
||||
// closing.
|
||||
//
|
||||
// NOTE: There are misalignments regarding when a channel's FC is
|
||||
// marked as finalized. We double check the pending channels to make
|
||||
// sure the returned SCIDs are indeed terminated.
|
||||
//
|
||||
// TODO(yy): fix the misalignments in `FetchClosedChannels`.
|
||||
pendings, err := s.chanStateDB.FetchPendingChannels()
|
||||
if err != nil {
|
||||
srvrLog.Errorf("Failed to fetch pending channels: %v", err)
|
||||
return nil
|
||||
}
|
||||
|
||||
for _, c := range pendings {
|
||||
if _, ok := closedSCIDs[c.ShortChannelID]; !ok {
|
||||
continue
|
||||
}
|
||||
|
||||
// If the channel is still reported as pending, remove it from
|
||||
// the map.
|
||||
delete(closedSCIDs, c.ShortChannelID)
|
||||
|
||||
srvrLog.Warnf("Channel=%v is prematurely marked as finalized",
|
||||
c.ShortChannelID)
|
||||
}
|
||||
|
||||
return closedSCIDs
|
||||
}
|
||||
Reference in new issue
Block a user