Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
25 changes: 4 additions & 21 deletions perms/mock.go
Original file line number Diff line number Diff line change
Expand Up @@ -5,8 +5,6 @@ package perms
import (
"net"

"github.com/lightningnetwork/lnd/autopilot"
"github.com/lightningnetwork/lnd/chainreg"
"github.com/lightningnetwork/lnd/lnrpc"
"github.com/lightningnetwork/lnd/lnrpc/autopilotrpc"
"github.com/lightningnetwork/lnd/lnrpc/chainrpc"
Expand All @@ -19,9 +17,7 @@ import (
"github.com/lightningnetwork/lnd/lnrpc/walletrpc"
"github.com/lightningnetwork/lnd/lnrpc/watchtowerrpc"
"github.com/lightningnetwork/lnd/lnrpc/wtclientrpc"
"github.com/lightningnetwork/lnd/lntest/mock"
"github.com/lightningnetwork/lnd/routing"
"github.com/lightningnetwork/lnd/sweep"
)

// mockConfig implements lnrpc.SubServerConfigDispatcher. It provides the
Expand Down Expand Up @@ -50,14 +46,9 @@ func (t *mockConfig) FetchConfig(subServerName string) (interface{}, bool) {
},
}, true
case "AutopilotRPC":
return &autopilotrpc.Config{
Manager: &autopilot.Manager{},
}, true
return &autopilotrpc.Config{}, true
case "ChainRPC":
return &chainrpc.Config{
ChainNotifier: &chainreg.NoChainBackend{},
Chain: &mock.ChainIO{},
}, true
return &chainrpc.Config{}, true
case "DevRPC":
return &devrpc.Config{}, true
case "NeutrinoKitRPC":
Expand All @@ -69,17 +60,9 @@ func (t *mockConfig) FetchConfig(subServerName string) (interface{}, bool) {
Router: &routing.ChannelRouter{},
}, true
case "SignRPC":
return &signrpc.Config{
Signer: &mock.DummySigner{},
}, true
return &signrpc.Config{}, true
case "WalletKitRPC":
return &walletrpc.Config{
FeeEstimator: &chainreg.NoChainBackend{},
Wallet: &mock.WalletController{},
KeyRing: &mock.SecretKeyRing{},
Sweeper: &sweep.UtxoSweeper{},
Chain: &mock.ChainIO{},
}, true
return &walletrpc.Config{}, true
case "WatchtowerRPC":
return &watchtowerrpc.Config{}, true
default:
Expand Down
25 changes: 4 additions & 21 deletions perms/mock_dev.go
Original file line number Diff line number Diff line change
Expand Up @@ -6,8 +6,6 @@ import (
"net"

"github.com/btcsuite/btcd/chaincfg"
"github.com/lightningnetwork/lnd/autopilot"
"github.com/lightningnetwork/lnd/chainreg"
graphdb "github.com/lightningnetwork/lnd/graph/db"
"github.com/lightningnetwork/lnd/lnrpc"
"github.com/lightningnetwork/lnd/lnrpc/autopilotrpc"
Expand All @@ -21,9 +19,7 @@ import (
"github.com/lightningnetwork/lnd/lnrpc/walletrpc"
"github.com/lightningnetwork/lnd/lnrpc/watchtowerrpc"
"github.com/lightningnetwork/lnd/lnrpc/wtclientrpc"
"github.com/lightningnetwork/lnd/lntest/mock"
"github.com/lightningnetwork/lnd/routing"
"github.com/lightningnetwork/lnd/sweep"
)

// mockConfig implements lnrpc.SubServerConfigDispatcher. It provides the
Expand Down Expand Up @@ -52,14 +48,9 @@ func (t *mockConfig) FetchConfig(subServerName string) (interface{}, bool) {
},
}, true
case "AutopilotRPC":
return &autopilotrpc.Config{
Manager: &autopilot.Manager{},
}, true
return &autopilotrpc.Config{}, true
case "ChainRPC":
return &chainrpc.Config{
ChainNotifier: &chainreg.NoChainBackend{},
Chain: &mock.ChainIO{},
}, true
return &chainrpc.Config{}, true
case "DevRPC":
return &devrpc.Config{
ActiveNetParams: &chaincfg.RegressionNetParams,
Expand All @@ -74,17 +65,9 @@ func (t *mockConfig) FetchConfig(subServerName string) (interface{}, bool) {
Router: &routing.ChannelRouter{},
}, true
case "SignRPC":
return &signrpc.Config{
Signer: &mock.DummySigner{},
}, true
return &signrpc.Config{}, true
case "WalletKitRPC":
return &walletrpc.Config{
FeeEstimator: &chainreg.NoChainBackend{},
Wallet: &mock.WalletController{},
KeyRing: &mock.SecretKeyRing{},
Sweeper: &sweep.UtxoSweeper{},
Chain: &mock.ChainIO{},
}, true
return &walletrpc.Config{}, true
case "WatchtowerRPC":
return &watchtowerrpc.Config{}, true
default:
Expand Down
55 changes: 50 additions & 5 deletions subservers/manager.go
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,12 @@ type Manager struct {
servers map[string]*subServerWrapper
permsMgr *perms.Manager
statusServer *status.Manager
mu sync.RWMutex

// critical is a set of sub-server names whose startup failure should
// be treated as fatal for litd.
critical map[string]bool

mu sync.RWMutex
}

// NewManager constructs a new Manager.
Expand All @@ -47,6 +52,7 @@ func NewManager(permsMgr *perms.Manager,
servers: make(map[string]*subServerWrapper),
permsMgr: permsMgr,
statusServer: statusServer,
critical: make(map[string]bool),
}
}

Expand Down Expand Up @@ -103,14 +109,31 @@ func (s *Manager) GetServer(name string) (SubServer, bool) {
return ss.SubServer, true
}

// SetCritical marks the given sub-server as critical. If a critical sub-server
// fails to start, litd will treat the failure as fatal and will not continue
// starting up. This must be called before StartIntegratedServers or
// ConnectRemoteSubServers.
func (s *Manager) SetCritical(name string) {
s.mu.Lock()
defer s.mu.Unlock()

s.critical[name] = true
}

// StartIntegratedServers starts all the manager's sub-servers that should be
// started in integrated mode.
// started in integrated mode. All sub-servers are attempted regardless of
// individual failures. After all attempts, if any sub-server that has been
// marked as critical via SetCritical failed to start, an error is returned.
// Non-critical sub-server failures are logged but do not prevent litd from
// continuing.
func (s *Manager) StartIntegratedServers(lndClient lnrpc.LightningClient,
lndGrpc *lndclient.GrpcLndServices, withMacaroonService bool) {
lndGrpc *lndclient.GrpcLndServices, withMacaroonService bool) error {

s.mu.Lock()
defer s.mu.Unlock()

var criticalErr error

for _, ss := range s.servers {
if ss.Remote() {
continue
Expand All @@ -126,19 +149,32 @@ func (s *Manager) StartIntegratedServers(lndClient lnrpc.LightningClient,
)
if err != nil {
s.statusServer.SetErrored(ss.Name(), err.Error())

if s.critical[ss.Name()] && criticalErr == nil {
criticalErr = fmt.Errorf("critical "+
"sub-server %s failed to "+
"start: %w", ss.Name(), err)
}

continue
}

s.statusServer.SetRunning(ss.Name())
}

return criticalErr
}

// ConnectRemoteSubServers creates connections to all the manager's sub-servers
// that are running remotely.
func (s *Manager) ConnectRemoteSubServers() {
// that are running remotely. All sub-servers are attempted regardless of
// individual failures. After all attempts, if any sub-server that has been
// marked as critical via SetCritical failed to connect, an error is returned.
func (s *Manager) ConnectRemoteSubServers() error {
s.mu.Lock()
defer s.mu.Unlock()

var criticalErr error

for _, ss := range s.servers {
if !ss.Remote() {
continue
Expand All @@ -147,11 +183,20 @@ func (s *Manager) ConnectRemoteSubServers() {
err := ss.connectRemote()
if err != nil {
s.statusServer.SetErrored(ss.Name(), err.Error())

if s.critical[ss.Name()] && criticalErr == nil {
criticalErr = fmt.Errorf("critical "+
"sub-server %s failed to "+
"connect: %w", ss.Name(), err)
}

continue
}

s.statusServer.SetRunning(ss.Name())
}

return criticalErr
}

// RegisterRPCServices registers all the manager's sub-servers with the given
Expand Down
Loading