From e6bebc4fe7dc571d011057c4dc100e1675ba4a8f Mon Sep 17 00:00:00 2001 From: yyforyongyu Date: Thu, 20 Oct 2022 19:37:31 +0800 Subject: [PATCH] lnd: make `MailboxDeliveryTimeout` configurable --- config.go | 8 ++++++++ lncfg/htlcswitch.go | 34 ++++++++++++++++++++++++++++++++++ sample-lnd.conf | 7 +++++++ server.go | 2 +- 4 files changed, 50 insertions(+), 1 deletion(-) create mode 100644 lncfg/htlcswitch.go diff --git a/config.go b/config.go index 57b0f5f3d..ef187e6a6 100644 --- a/config.go +++ b/config.go @@ -444,6 +444,8 @@ type Config struct { Sweeper *lncfg.Sweeper `group:"sweeper" namespace:"sweeper"` + Htlcswitch *lncfg.Htlcswitch `group:"htlcswitch" namespace:"htlcswitch"` + // LogWriter is the root logger that all of the daemon's subloggers are // hooked up to. LogWriter *build.RotatingLogWriter @@ -462,6 +464,8 @@ type Config struct { } // DefaultConfig returns all default values for the Config struct. +// +// nolint:lll func DefaultConfig() Config { return Config{ LndDir: DefaultLndDir, @@ -643,6 +647,9 @@ func DefaultConfig() Config { Sweeper: &lncfg.Sweeper{ BatchWindowDuration: sweep.DefaultBatchWindowDuration, }, + Htlcswitch: &lncfg.Htlcswitch{ + MailboxDeliveryTimeout: htlcswitch.DefaultMailboxDeliveryTimeout, + }, } } @@ -1660,6 +1667,7 @@ func ValidateConfig(cfg Config, interceptor signal.Interceptor, fileParser, cfg.RPCMiddleware, cfg.RemoteSigner, cfg.Sweeper, + cfg.Htlcswitch, ) if err != nil { return nil, err diff --git a/lncfg/htlcswitch.go b/lncfg/htlcswitch.go new file mode 100644 index 000000000..4fdc85749 --- /dev/null +++ b/lncfg/htlcswitch.go @@ -0,0 +1,34 @@ +package lncfg + +import ( + "fmt" + "time" +) + +var ( + // MaxMailboxDeliveryTimeout specifies the max allowed timeout value. + // This value is derived from the itest `async_bidirectional_payments`, + // where both side send 483 payments at the same time to stress test + // lnd. + MaxMailboxDeliveryTimeout = 2 * time.Minute +) + +// nolint:lll +type Htlcswitch struct { + MailboxDeliveryTimeout time.Duration `long:"mailboxdeliverytimeout" description:"The timeout value when delivering HTLCs to a channel link. Setting this value too small will result in local payment failures if large number of payments are sent over a short period."` +} + +// Validate checks the values configured for htlcswitch. +func (h *Htlcswitch) Validate() error { + if h.MailboxDeliveryTimeout <= 0 { + return fmt.Errorf("mailboxdeliverytimeout must be positive") + } + + if h.MailboxDeliveryTimeout > MaxMailboxDeliveryTimeout { + return fmt.Errorf("mailboxdeliverytimeout: %v exceeds "+ + "maximum: %v", h.MailboxDeliveryTimeout, + MaxMailboxDeliveryTimeout) + } + + return nil +} diff --git a/sample-lnd.conf b/sample-lnd.conf index 3afa98586..a06342ece 100644 --- a/sample-lnd.conf +++ b/sample-lnd.conf @@ -1423,3 +1423,10 @@ litecoin.node=ltcd ; window to allow more inputs to be added and thereby lower the fee per input. ; sweeper.batchwindowduration=30s +[htlcswitch] + +; The timeout value when delivering HTLCs to a channel link. Setting this value +; too small will result in local payment failures if large number of payments +; are sent over a short period. +; htlcswitch.mailboxdeliverytimeout=60s + diff --git a/server.go b/server.go index a425937c0..a722a16f8 100644 --- a/server.go +++ b/server.go @@ -658,7 +658,7 @@ func newServer(cfg *Config, listenAddrs []net.Addr, AllowCircularRoute: cfg.AllowCircularRoute, RejectHTLC: cfg.RejectHTLC, Clock: clock.NewDefaultClock(), - MailboxDeliveryTimeout: htlcswitch.DefaultMailboxDeliveryTimeout, + MailboxDeliveryTimeout: cfg.Htlcswitch.MailboxDeliveryTimeout, DustThreshold: thresholdMSats, SignAliasUpdate: s.signAliasUpdate, IsAlias: aliasmgr.IsAlias,