From dd8f2888a069f3be464c674789202542fe141ee4 Mon Sep 17 00:00:00 2001 From: yyforyongyu Date: Tue, 25 Mar 2025 18:48:35 +0800 Subject: [PATCH 1/4] lnd: log errors during the startup flow To aid us debugging startup issues. --- server.go | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/server.go b/server.go index d46be20ed..92efe0664 100644 --- a/server.go +++ b/server.go @@ -2195,7 +2195,7 @@ func (c cleaner) add(cleanup func() error) cleaner { func (c cleaner) run() { for i := len(c) - 1; i >= 0; i-- { if err := c[i](); err != nil { - srvrLog.Infof("Cleanup failed: %v", err) + srvrLog.Errorf("Cleanup failed: %v", err) } } } @@ -2498,7 +2498,11 @@ func (s *server) Start() error { // brontide.NewListener() is called in newServer. This means // that we are actually listening and partially accepting // inbound connections even before the connMgr starts. + // + // TODO(yy): move the log into the connMgr's `Start` method. + srvrLog.Info("connMgr starting...") s.connMgr.Start() + srvrLog.Debug("connMgr started") // If peers are specified as a config option, we'll add those // peers first. @@ -2540,6 +2544,9 @@ func (s *server) Start() error { // Subscribe to NodeAnnouncements that advertise new addresses // our persistent peers. if err := s.updatePersistentPeerAddrs(); err != nil { + srvrLog.Errorf("Failed to update persistent peer "+ + "addr: %v", err) + startErr = err return } @@ -2551,10 +2558,15 @@ func (s *server) Start() error { // to ensure we don't reconnect to any nodes we no longer have // open channels with. if err := s.chanStateDB.PruneLinkNodes(); err != nil { + srvrLog.Errorf("Failed to prune link nodes: %v", err) + startErr = err return } if err := s.establishPersistentConnections(); err != nil { + srvrLog.Errorf("Failed to establish persistent "+ + "connections: %v", err) + startErr = err return } From 799ce9752a4f25ee37bf0fe1775ff98ff74fa008 Mon Sep 17 00:00:00 2001 From: yyforyongyu Date: Wed, 26 Mar 2025 00:15:23 +0800 Subject: [PATCH 2/4] lnd: skip `ErrEdgeNotFound` when iterating channels We now skip another error when iterating the channels for our persistent peers to unblock connecting to other peers. --- server.go | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/server.go b/server.go index 92efe0664..f961b2c13 100644 --- a/server.go +++ b/server.go @@ -3547,8 +3547,9 @@ func (s *server) establishPersistentConnections() error { // the reconnection port to the default peer port. linkNodes, err := s.chanStateDB.LinkNodeDB().FetchAllLinkNodes() if err != nil && err != channeldb.ErrLinkNodesNotFound { - return err + return fmt.Errorf("failed to fetch all link nodes: %w", err) } + for _, node := range linkNodes { pubStr := string(node.IdentityPub.SerializeCompressed()) nodeAddrs := &nodeAddresses{ @@ -3563,7 +3564,7 @@ func (s *server) establishPersistentConnections() error { // that have been added via NodeAnnouncement messages. sourceNode, err := s.graphDB.SourceNode() if err != nil { - return err + return fmt.Errorf("failed to fetch source node: %w", err) } // TODO(roasbeef): instead iterate over link nodes and query graph for @@ -3649,8 +3650,15 @@ func (s *server) establishPersistentConnections() error { nodeAddrsMap[pubStr] = n return nil }) - if err != nil && !errors.Is(err, graphdb.ErrGraphNoEdgesFound) { - return err + if err != nil { + srvrLog.Errorf("Failed to iterate channels for node %x", + sourceNode.PubKeyBytes) + + if !errors.Is(err, graphdb.ErrGraphNoEdgesFound) && + !errors.Is(err, graphdb.ErrEdgeNotFound) { + + return err + } } srvrLog.Debugf("Establishing %v persistent connections on start", From b1e55f5fe5e43b20ee7c9146f39e8f537f72369c Mon Sep 17 00:00:00 2001 From: yyforyongyu Date: Wed, 26 Mar 2025 00:18:04 +0800 Subject: [PATCH 3/4] lnd: don't abort the startup on subsystem errors We want to make sure the node can start if non-fatal error is returned. --- server.go | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/server.go b/server.go index f961b2c13..59c084f3a 100644 --- a/server.go +++ b/server.go @@ -2563,12 +2563,10 @@ func (s *server) Start() error { startErr = err return } + if err := s.establishPersistentConnections(); err != nil { srvrLog.Errorf("Failed to establish persistent "+ "connections: %v", err) - - startErr = err - return } // setSeedList is a helper function that turns multiple DNS seed From 1e0ddf3a16fbbe41d12342c1dfd493c8d2b7a5b7 Mon Sep 17 00:00:00 2001 From: yyforyongyu Date: Wed, 26 Mar 2025 00:24:57 +0800 Subject: [PATCH 4/4] docs: update release notes --- docs/release-notes/release-notes-0.19.0.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/docs/release-notes/release-notes-0.19.0.md b/docs/release-notes/release-notes-0.19.0.md index fd3cb2140..39d31196c 100644 --- a/docs/release-notes/release-notes-0.19.0.md +++ b/docs/release-notes/release-notes-0.19.0.md @@ -107,6 +107,10 @@ keysend payment would not fail properly and only resolve after restart. Now keysend payment validation is stricter. +* [Make sure](https://github.com/lightningnetwork/lnd/pull/9643) the startup + process of the node won't be interrupted if a non-fatal error is returned from + the subsystems. + # New Features * Add support for [archiving channel backup](https://github.com/lightningnetwork/lnd/pull/9232)