htlcswitch: replace outgoing failure with interface

Add a FailureDetail interface which allows us have different kinds of
failures for link errors. This interface will be used to cover failures
that occur when on invoice payment, because the errors have already
been enumerated in the invoices package.
This commit is contained in:
carla 2020-02-06 19:35:16 +02:00
parent bdd9411bbd
commit 9390d3bbfd
No known key found for this signature in database
GPG Key ID: 4CA7FE54A6213C91
3 changed files with 23 additions and 12 deletions

@ -34,8 +34,8 @@ type LinkError struct {
// node. // node.
msg lnwire.FailureMessage msg lnwire.FailureMessage
// OutgoingFailure enriches the wire error with additional information. // FailureDetail enriches the wire error with additional information.
OutgoingFailure FailureDetail
} }
// NewLinkError returns a LinkError with the failure message provided. // NewLinkError returns a LinkError with the failure message provided.
@ -48,11 +48,11 @@ func NewLinkError(msg lnwire.FailureMessage) *LinkError {
// NewDetailedLinkError returns a link error that enriches a wire message with // NewDetailedLinkError returns a link error that enriches a wire message with
// a failure detail. // a failure detail.
func NewDetailedLinkError(msg lnwire.FailureMessage, func NewDetailedLinkError(msg lnwire.FailureMessage,
detail OutgoingFailure) *LinkError { detail FailureDetail) *LinkError {
return &LinkError{ return &LinkError{
msg: msg, msg: msg,
OutgoingFailure: detail, FailureDetail: detail,
} }
} }
@ -72,11 +72,11 @@ func (l *LinkError) WireMessage() lnwire.FailureMessage {
func (l *LinkError) Error() string { func (l *LinkError) Error() string {
// If the link error has no failure detail, return the wire message's // If the link error has no failure detail, return the wire message's
// error. // error.
if l.OutgoingFailure == OutgoingFailureNone { if l.FailureDetail == nil {
return l.msg.Error() return l.msg.Error()
} }
return fmt.Sprintf("%v: %v", l.msg.Error(), l.OutgoingFailure) return fmt.Sprintf("%v: %v", l.msg.Error(), l.FailureDetail)
} }
// ForwardingError wraps an lnwire.FailureMessage in a struct that also // ForwardingError wraps an lnwire.FailureMessage in a struct that also

@ -1,5 +1,13 @@
package htlcswitch package htlcswitch
// FailureDetail is an interface implemented by failures that occur on
// our incoming or outgoing link, or within the switch itself.
type FailureDetail interface {
// FailureString returns the string representation of a failure
// detail.
FailureString() string
}
// OutgoingFailure is an enum which is used to enrich failures which occur in // OutgoingFailure is an enum which is used to enrich failures which occur in
// the switch or on our outgoing link with additional metadata. // the switch or on our outgoing link with additional metadata.
type OutgoingFailure int type OutgoingFailure int
@ -36,8 +44,10 @@ const (
OutgoingFailureCircularRoute OutgoingFailureCircularRoute
) )
// String returns the string representation of a failure detail. // FailureString returns the string representation of a failure detail.
func (fd OutgoingFailure) String() string { //
// Note: it is part of the FailureDetail interface.
func (fd OutgoingFailure) FailureString() string {
switch fd { switch fd {
case OutgoingFailureNone: case OutgoingFailureNone:
return "no failure detail" return "no failure detail"

@ -923,8 +923,8 @@ func (s *Switch) parseFailedPayment(deobfuscator ErrorDecrypter,
) )
log.Errorf("%v: (hash=%v, pid=%d): %v", log.Errorf("%v: (hash=%v, pid=%d): %v",
linkError.OutgoingFailure, paymentHash, paymentID, linkError.FailureDetail.FailureString(),
err) paymentHash, paymentID, err)
return linkError return linkError
} }
@ -942,7 +942,8 @@ func (s *Switch) parseFailedPayment(deobfuscator ErrorDecrypter,
OutgoingFailureOnChainTimeout, OutgoingFailureOnChainTimeout,
) )
log.Info("%v: hash=%v, pid=%d", linkError.OutgoingFailure, log.Info("%v: hash=%v, pid=%d",
linkError.FailureDetail.FailureString(),
paymentHash, paymentID) paymentHash, paymentID)
return linkError return linkError