Skip to content

Commit 5d1ca50

Browse files
committed
multi: track LiT and LND status
1 parent 1e47aab commit 5d1ca50

2 files changed

Lines changed: 81 additions & 46 deletions

File tree

rpc_proxy.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -421,10 +421,10 @@ func (p *rpcProxy) checkSubSystemStarted(requestURI string) error {
421421
system = subServerName
422422

423423
case p.permsMgr.IsLndURI(requestURI):
424-
return nil
424+
system = LNDSubServer
425425

426426
case p.permsMgr.IsLitURI(requestURI):
427-
return nil
427+
system = LitSubServer
428428

429429
default:
430430
return fmt.Errorf("unknown gRPC web request: %v", requestURI)

terminal.go

Lines changed: 79 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -222,10 +222,50 @@ func (g *LightningTerminal) Run() error {
222222
return fmt.Errorf("error starting UI HTTP server: %v", err)
223223
}
224224

225+
// Attempt to start Lit and all of its sub-servers.
226+
if err = g.start(); err != nil {
227+
g.statusServer.setServerErrored(
228+
LitSubServer, "could not start Lit: %v", err,
229+
)
230+
}
231+
232+
// Now block until we receive an error or the main shutdown
233+
// signal.
234+
<-shutdownInterceptor.ShutdownChannel()
235+
log.Infof("Shutdown signal received")
236+
237+
if g.rpcProxy != nil {
238+
if err := g.rpcProxy.Stop(); err != nil {
239+
log.Errorf("Error stopping rpc proxy: %v", err)
240+
}
241+
}
242+
243+
if g.httpServer != nil {
244+
if err := g.httpServer.Close(); err != nil {
245+
log.Errorf("Error stopping UI server: %v", err)
246+
}
247+
}
248+
249+
if err := g.statusServer.Stop(); err != nil {
250+
log.Errorf("Error stopping status server: %v", err)
251+
}
252+
253+
g.wg.Wait()
254+
255+
return nil
256+
}
257+
258+
// start attempts to start all the various components of Litd. Only Litd and
259+
// LND errors are considered fatal and will result in an error being returned.
260+
// If any of the sub-servers managed by the subServerMgr error while starting
261+
// up, these are considered non-fatal and will not result in an error being
262+
// returned.
263+
func (g *LightningTerminal) start() error {
225264
// Create the instances of our subservers now so we can hook them up to
226265
// lnd once it's fully running.
227266
g.initSubServers()
228267

268+
var err error
229269
g.sessionRpcServer, err = newSessionRPCServer(&sessionRpcServerConfig{
230270
basicAuth: g.rpcProxy.basicAuth,
231271
dbDir: filepath.Join(g.cfg.LitDir, g.cfg.Network),
@@ -300,9 +340,7 @@ func (g *LightningTerminal) Run() error {
300340
go func() {
301341
defer g.wg.Done()
302342

303-
err := lnd.Main(
304-
g.cfg.Lnd, lisCfg, implCfg, shutdownInterceptor,
305-
)
343+
err := lnd.Main(g.cfg.Lnd, lisCfg, implCfg, interceptor)
306344
if e, ok := err.(*flags.Error); err != nil &&
307345
(!ok || e.Type != flags.ErrHelp) {
308346

@@ -344,24 +382,30 @@ func (g *LightningTerminal) Run() error {
344382
return err
345383

346384
case <-lndQuit:
347-
return nil
385+
g.statusServer.setServerErrored(
386+
LNDSubServer, "lndQuit channel closed",
387+
)
388+
return fmt.Errorf("LND has stopped")
348389

349-
case <-shutdownInterceptor.ShutdownChannel():
350-
return errors.New("shutting down")
390+
case <-interceptor.ShutdownChannel():
391+
return fmt.Errorf("received the shutdown signal")
351392
}
352393

353394
// We now know that starting lnd was successful. If we now run into an
354395
// error, we must shut down lnd correctly.
355396
defer func() {
356-
err := g.shutdown()
397+
err := g.shutdownSubServers()
357398
if err != nil {
358399
log.Errorf("Error shutting down: %v", err)
359400
}
360401
}()
361402

362403
// Connect to LND.
363404
if err = g.connectLND(bufRpcListener); err != nil {
364-
return fmt.Errorf("could not connect to LND: %v", err)
405+
g.statusServer.setServerErrored(
406+
LNDSubServer, "could not connect to LND: %v", err,
407+
)
408+
return fmt.Errorf("could not connect to LND")
365409
}
366410

367411
// Initialise any connections to sub-servers that we are running in
@@ -389,12 +433,18 @@ func (g *LightningTerminal) Run() error {
389433
return err
390434

391435
case <-lndQuit:
392-
return nil
436+
g.statusServer.setServerErrored(
437+
LNDSubServer, "lndQuit channel closed",
438+
)
439+
return fmt.Errorf("LND is not running")
393440

394-
case <-shutdownInterceptor.ShutdownChannel():
441+
case <-interceptor.ShutdownChannel():
395442
return errors.New("shutting down")
396443
}
397444

445+
// We can now set the status of LND as running.
446+
g.statusServer.setServerRunning(LNDSubServer)
447+
398448
// If we're in integrated mode, we'll need to wait for lnd to send the
399449
// macaroon after unlock before going any further.
400450
if g.cfg.LndMode == ModeIntegrated {
@@ -405,8 +455,10 @@ func (g *LightningTerminal) Run() error {
405455
// Set up all the LND clients required by LiT.
406456
err = g.setUpLNDClients()
407457
if err != nil {
408-
log.Errorf("Could not set up LND clients: %v", err)
409-
return err
458+
g.statusServer.setServerErrored(
459+
LNDSubServer, "could not set up LND clients: %v", err,
460+
)
461+
return fmt.Errorf("could not start LND")
410462
}
411463

412464
// If we're in integrated and stateless init mode, we won't create
@@ -433,22 +485,28 @@ func (g *LightningTerminal) Run() error {
433485
return fmt.Errorf("could not start litd sub-servers: %v", err)
434486
}
435487

488+
// We can now set the status of LiT as running.
489+
g.statusServer.setServerRunning(LitSubServer)
490+
436491
// Now block until we receive an error or the main shutdown signal.
437492
select {
438493
case err := <-g.errQueue.ChanOut():
439494
if err != nil {
440-
log.Errorf("Received critical error from subsystem, "+
441-
"shutting down: %v", err)
495+
return fmt.Errorf("received critical error from "+
496+
"subsystem, shutting down: %v", err,
497+
)
442498
}
443499

444500
case <-lndQuit:
445-
return nil
501+
g.statusServer.setServerErrored(
502+
LNDSubServer, "lndQuit channel closed",
503+
)
504+
return fmt.Errorf("LND is not running")
446505

447-
case <-shutdownInterceptor.ShutdownChannel():
448-
log.Infof("Shutdown signal received")
506+
case <-interceptor.ShutdownChannel():
449507
}
450508

451-
return nil
509+
return fmt.Errorf("received the shutdown signal")
452510
}
453511

454512
// initSubServers registers the faraday, loop and pool sub-servers with the
@@ -899,8 +957,9 @@ func (g *LightningTerminal) BuildWalletConfig(ctx context.Context,
899957
)
900958
}
901959

902-
// shutdown stops all subservers that were started and attached to lnd.
903-
func (g *LightningTerminal) shutdown() error {
960+
// shutdownSubServers stops all subservers that were started and attached to
961+
// lnd.
962+
func (g *LightningTerminal) shutdownSubServers() error {
904963
var returnErr error
905964

906965
err := g.subServerMgr.Stop()
@@ -934,37 +993,13 @@ func (g *LightningTerminal) shutdown() error {
934993
g.restCancel()
935994
}
936995

937-
if g.rpcProxy != nil {
938-
if err := g.rpcProxy.Stop(); err != nil {
939-
log.Errorf("Error stopping lnd proxy: %v", err)
940-
returnErr = err
941-
}
942-
}
943-
944996
if g.lndConn != nil {
945997
if err := g.lndConn.Close(); err != nil {
946998
log.Errorf("Error closing lnd connection: %v", err)
947999
returnErr = err
9481000
}
9491001
}
9501002

951-
if g.httpServer != nil {
952-
if err := g.httpServer.Close(); err != nil {
953-
log.Errorf("Error stopping UI server: %v", err)
954-
returnErr = err
955-
}
956-
}
957-
958-
if err := g.statusServer.Stop(); err != nil {
959-
log.Errorf("Error stopping status server: %v", err)
960-
returnErr = err
961-
}
962-
963-
// In case the error wasn't thrown by lnd, make sure we stop it too.
964-
interceptor.RequestShutdown()
965-
966-
g.wg.Wait()
967-
9681003
// Do we have any last errors to display? We use an anonymous function,
9691004
// so we can use return instead of breaking to a label in the default
9701005
// case.

0 commit comments

Comments
 (0)