Merge branch '0-19-2-branch-rc2-10042' into 0-19-2-branch-rc2

This commit is contained in:
Oliver Gugger
2025-07-08 16:25:39 +02:00
4 changed files with 41 additions and 17 deletions

View File

@@ -2229,6 +2229,9 @@ func (s *Switch) GetLinkByShortID(chanID lnwire.ShortChannelID) (ChannelLink,
func (s *Switch) getLinkByShortID(chanID lnwire.ShortChannelID) (ChannelLink, error) { func (s *Switch) getLinkByShortID(chanID lnwire.ShortChannelID) (ChannelLink, error) {
link, ok := s.forwardingIndex[chanID] link, ok := s.forwardingIndex[chanID]
if !ok { if !ok {
log.Debugf("Link not found in forwarding index using "+
"chanID=%v", chanID)
return nil, ErrChannelLinkNotFound return nil, ErrChannelLinkNotFound
} }

View File

@@ -85,22 +85,18 @@ func newBandwidthManager(graph Graph, sourceNode route.Vertex,
// queried is one of our local channels, so any failure to retrieve the link // queried is one of our local channels, so any failure to retrieve the link
// is interpreted as the link being offline. // is interpreted as the link being offline.
func (b *bandwidthManager) getBandwidth(cid lnwire.ShortChannelID, func (b *bandwidthManager) getBandwidth(cid lnwire.ShortChannelID,
amount lnwire.MilliSatoshi) lnwire.MilliSatoshi { amount lnwire.MilliSatoshi) (lnwire.MilliSatoshi, error) {
link, err := b.getLink(cid) link, err := b.getLink(cid)
if err != nil { if err != nil {
// If the link isn't online, then we'll report that it has return 0, fmt.Errorf("error querying switch for link: %w", err)
// zero bandwidth.
log.Warnf("ShortChannelID=%v: link not found: %v", cid, err)
return 0
} }
// If the link is found within the switch, but it isn't yet eligible // If the link is found within the switch, but it isn't yet eligible
// to forward any HTLCs, then we'll treat it as if it isn't online in // to forward any HTLCs, then we'll treat it as if it isn't online in
// the first place. // the first place.
if !link.EligibleToForward() { if !link.EligibleToForward() {
log.Warnf("ShortChannelID=%v: not eligible to forward", cid) return 0, fmt.Errorf("link not eligible to forward")
return 0
} }
// bandwidthResult is an inline type that we'll use to pass the // bandwidthResult is an inline type that we'll use to pass the
@@ -165,10 +161,8 @@ func (b *bandwidthManager) getBandwidth(cid lnwire.ShortChannelID,
}, },
).Unpack() ).Unpack()
if err != nil { if err != nil {
log.Errorf("ShortChannelID=%v: failed to get bandwidth from "+ return 0, fmt.Errorf("failed to consult external traffic "+
"external traffic shaper: %v", cid, err) "shaper: %w", err)
return 0
} }
htlcAmount := result.htlcAmount.UnwrapOr(amount) htlcAmount := result.htlcAmount.UnwrapOr(amount)
@@ -176,9 +170,8 @@ func (b *bandwidthManager) getBandwidth(cid lnwire.ShortChannelID,
// If our link isn't currently in a state where it can add another // If our link isn't currently in a state where it can add another
// outgoing htlc, treat the link as unusable. // outgoing htlc, treat the link as unusable.
if err := link.MayAddOutgoingHtlc(htlcAmount); err != nil { if err := link.MayAddOutgoingHtlc(htlcAmount); err != nil {
log.Warnf("ShortChannelID=%v: cannot add outgoing "+ return 0, fmt.Errorf("cannot add outgoing htlc to channel %v "+
"htlc with amount %v: %v", cid, htlcAmount, err) "with amount %v: %w", cid, htlcAmount, err)
return 0
} }
// If the external traffic shaper determined the bandwidth, we'll return // If the external traffic shaper determined the bandwidth, we'll return
@@ -186,7 +179,7 @@ func (b *bandwidthManager) getBandwidth(cid lnwire.ShortChannelID,
// available on that channel). // available on that channel).
reportedBandwidth := result.bandwidth.UnwrapOr(linkBandwidth) reportedBandwidth := result.bandwidth.UnwrapOr(linkBandwidth)
return reportedBandwidth return reportedBandwidth, nil
} }
// availableChanBandwidth returns the total available bandwidth for a channel // availableChanBandwidth returns the total available bandwidth for a channel
@@ -201,7 +194,15 @@ func (b *bandwidthManager) availableChanBandwidth(channelID uint64,
return 0, false return 0, false
} }
return b.getBandwidth(shortID, amount), true bandwidth, err := b.getBandwidth(shortID, amount)
if err != nil {
log.Warnf("failed to get bandwidth for channel %v: %v",
shortID, err)
return 0, true
}
return bandwidth, true
} }
// firstHopCustomBlob returns the custom blob for the first hop of the payment, // firstHopCustomBlob returns the custom blob for the first hop of the payment,

View File

@@ -514,7 +514,18 @@ func getOutgoingBalance(node route.Vertex, outgoingChans map[uint64]struct{},
var max, total lnwire.MilliSatoshi var max, total lnwire.MilliSatoshi
cb := func(channel *graphdb.DirectedChannel) error { cb := func(channel *graphdb.DirectedChannel) error {
shortID := lnwire.NewShortChanIDFromInt(channel.ChannelID)
// This log line is needed to debug issues in case we do not
// have a channel in our graph for some reason when evaluating
// the local balance. Otherwise we could not tell whether all
// channels are being evaluated.
log.Tracef("Evaluating channel %v for local balance", shortID)
if !channel.OutPolicySet { if !channel.OutPolicySet {
log.Debugf("ShortChannelID=%v: has no out policy set, "+
"skipping", shortID)
return nil return nil
} }
@@ -536,6 +547,11 @@ func getOutgoingBalance(node route.Vertex, outgoingChans map[uint64]struct{},
// we've already queried the bandwidth hints. // we've already queried the bandwidth hints.
if !ok { if !ok {
bandwidth = lnwire.NewMSatFromSatoshis(channel.Capacity) bandwidth = lnwire.NewMSatFromSatoshis(channel.Capacity)
log.Warnf("ShortChannelID=%v: not found in the local "+
"channels map of the bandwidth manager, "+
"using channel capacity=%v as bandwidth for "+
"this channel", shortID, bandwidth)
} }
if bandwidth > max { if bandwidth > max {
@@ -545,6 +561,9 @@ func getOutgoingBalance(node route.Vertex, outgoingChans map[uint64]struct{},
var overflow bool var overflow bool
total, overflow = overflowSafeAdd(total, bandwidth) total, overflow = overflowSafeAdd(total, bandwidth)
if overflow { if overflow {
log.Warnf("ShortChannelID=%v: overflow detected, "+
"setting total to max value", shortID)
// If the current total and the bandwidth would // If the current total and the bandwidth would
// overflow the maximum value, we set the total to the // overflow the maximum value, we set the total to the
// maximum value. Which is more milli-satoshis than are // maximum value. Which is more milli-satoshis than are

View File

@@ -280,8 +280,9 @@ func (u *edgeUnifier) getEdgeLocal(netAmtReceived lnwire.MilliSatoshi,
edge.policy.ChannelID, amt, edge.policy.ChannelID, amt,
) )
if !ok { if !ok {
log.Debugf("Cannot get bandwidth for edge %v, use max "+ log.Warnf("Cannot get bandwidth for edge %v, use max "+
"instead", edge.policy.ChannelID) "instead", edge.policy.ChannelID)
bandwidth = lnwire.MaxMilliSatoshi bandwidth = lnwire.MaxMilliSatoshi
} }