mirror of
https://github.com/lightningnetwork/lnd.git
synced 2025-02-22 14:22:37 +01:00
htlcswitch: handle nil circuit properly when settling
We have two sources which can call `handlePacketSettle`, either through the link's `<-s.htlcPlex`, or the `<-s.resolutionMsgs`, which means the `closeCircuit` could be call twice. Previously we already caught this case inside `closeCircuit`, in that we would return a nil circuit upon seeing `ErrUnknownCircuit`, indicating the circuit was removed. However, we still need to account the case when the circuit is the process of being closed, which is now fixed as we will ignore when seeing `ErrCircuitClosing`.
This commit is contained in:
parent
bb9c680a48
commit
944f16255a
2 changed files with 21 additions and 1 deletions
|
@ -1,6 +1,8 @@
|
|||
package htlcswitch
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
|
||||
"github.com/lightningnetwork/lnd/channeldb"
|
||||
"github.com/lightningnetwork/lnd/graph/db/models"
|
||||
"github.com/lightningnetwork/lnd/htlcswitch/hop"
|
||||
|
@ -136,3 +138,12 @@ func (p *htlcPacket) keystone() Keystone {
|
|||
OutKey: p.outKey(),
|
||||
}
|
||||
}
|
||||
|
||||
// String returns a human-readable description of the packet.
|
||||
func (p *htlcPacket) String() string {
|
||||
return fmt.Sprintf("keystone=%v, sourceRef=%v, destRef=%v, "+
|
||||
"incomingAmount=%v, amount=%v, localFailure=%v, hasSource=%v "+
|
||||
"isResolution=%v", p.keystone(), p.sourceRef, p.destRef,
|
||||
p.incomingAmount, p.amount, p.localFailure, p.hasSource,
|
||||
p.isResolution)
|
||||
}
|
||||
|
|
|
@ -2994,6 +2994,15 @@ func (s *Switch) handlePacketSettle(packet *htlcPacket) error {
|
|||
// If the source of this packet has not been set, use the circuit map
|
||||
// to lookup the origin.
|
||||
circuit, err := s.closeCircuit(packet)
|
||||
|
||||
// If the circuit is in the process of closing, we will return a nil as
|
||||
// there's another packet handling undergoing.
|
||||
if errors.Is(err, ErrCircuitClosing) {
|
||||
log.Debugf("Circuit is closing for packet=%v", packet)
|
||||
return nil
|
||||
}
|
||||
|
||||
// Exit early if there's another error.
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
@ -3005,7 +3014,7 @@ func (s *Switch) handlePacketSettle(packet *htlcPacket) error {
|
|||
// and when `UpdateFulfillHTLC` is received. After which `RevokeAndAck`
|
||||
// is received, which invokes `processRemoteSettleFails` in its link.
|
||||
if circuit == nil {
|
||||
log.Debugf("Found nil circuit: packet=%v", spew.Sdump(packet))
|
||||
log.Debugf("Circuit already closed for packet=%v", packet)
|
||||
return nil
|
||||
}
|
||||
|
||||
|
|
Loading…
Add table
Reference in a new issue