@@ -48,7 +48,6 @@ import (
4848 "github.com/lightningnetwork/lnd/lnrpc/walletrpc"
4949 "github.com/lightningnetwork/lnd/lnrpc/watchtowerrpc"
5050 "github.com/lightningnetwork/lnd/lnrpc/wtclientrpc"
51- "github.com/lightningnetwork/lnd/lntest/wait"
5251 "github.com/lightningnetwork/lnd/lnwallet/btcwallet"
5352 "github.com/lightningnetwork/lnd/macaroons"
5453 "github.com/lightningnetwork/lnd/rpcperms"
@@ -634,7 +633,7 @@ func (g *LightningTerminal) start() error {
634633 }
635634
636635 // Set up all the LND clients required by LiT.
637- err = g .setUpLNDClients ()
636+ err = g .setUpLNDClients (lndQuit )
638637 if err != nil {
639638 g .statusMgr .SetErrored (
640639 subservers .LND , "could not set up LND clients: %v" , err ,
@@ -699,8 +698,9 @@ func (g *LightningTerminal) start() error {
699698}
700699
701700// setUpLNDClients sets up the various LND clients required by LiT.
702- func (g * LightningTerminal ) setUpLNDClients () error {
701+ func (g * LightningTerminal ) setUpLNDClients (lndQuit chan struct {} ) error {
703702 var (
703+ err error
704704 insecure bool
705705 clientOptions []lndclient.BasicClientOption
706706 )
@@ -722,25 +722,57 @@ func (g *LightningTerminal) setUpLNDClients() error {
722722 clientOptions = append (clientOptions , lndclient .Insecure ())
723723 }
724724
725+ // checkRunning checks if we should continue running for the duration of
726+ // the defaultStartupTimeout, or else returns an error indicating why
727+ // a shut-down is needed.
728+ checkRunning := func () error {
729+ select {
730+ case err := <- g .errQueue .ChanOut ():
731+ return fmt .Errorf ("error from subsystem: %v" , err )
732+
733+ case <- lndQuit :
734+ return fmt .Errorf ("LND has stopped" )
735+
736+ case <- interceptor .ShutdownChannel ():
737+ return fmt .Errorf ("received the shutdown signal" )
738+
739+ case <- time .After (defaultStartupTimeout ):
740+ return nil
741+ }
742+ }
743+
725744 // The main RPC listener of lnd might need some time to start, it could
726745 // be that we run into a connection refused a few times. We use the
727746 // basic client connection to find out if the RPC server is started yet
728747 // because that doesn't do anything else than just connect. We'll check
729748 // if lnd is also ready to be used in the next step.
730749 log .Infof ("Connecting basic lnd client" )
731- err := wait .NoError (func () error {
750+
751+ for {
732752 // Create an lnd client now that we have the full configuration.
733753 // We'll need a basic client and a full client because not all
734754 // subservers have the same requirements.
735- var err error
736755 g .basicClient , err = lndclient .NewBasicClient (
737- host , tlsPath , filepath .Dir (macPath ), string ( network ),
738- clientOptions ... ,
756+ host , tlsPath , filepath .Dir (macPath ),
757+ string ( network ), clientOptions ... ,
739758 )
740- return err
741- }, defaultStartupTimeout )
742- if err != nil {
743- return fmt .Errorf ("could not create basic LND Client: %v" , err )
759+ if err == nil {
760+ log .Infof ("Basic lnd client connected" )
761+
762+ break
763+ }
764+
765+ g .statusMgr .SetErrored (
766+ subservers .LIT ,
767+ "Error when setting up basic LND Client: %v" , err ,
768+ )
769+
770+ err = checkRunning ()
771+ if err != nil {
772+ return err
773+ }
774+
775+ log .Infof ("Retrying to connect basic lnd client" )
744776 }
745777
746778 // Now we know that the connection itself is ready. But we also need to
@@ -768,23 +800,39 @@ func (g *LightningTerminal) setUpLNDClients() error {
768800 }()
769801
770802 log .Infof ("Connecting full lnd client" )
771- g .lndClient , err = lndclient .NewLndServices (
772- & lndclient.LndServicesConfig {
773- LndAddress : host ,
774- Network : network ,
775- TLSPath : tlsPath ,
776- Insecure : insecure ,
777- CustomMacaroonPath : macPath ,
778- CustomMacaroonHex : hex .EncodeToString (macData ),
779- BlockUntilChainSynced : true ,
780- BlockUntilUnlocked : true ,
781- CallerCtx : ctxc ,
782- CheckVersion : minimalCompatibleVersion ,
783- },
784- )
785- if err != nil {
786- return fmt .Errorf ("could not create LND Services client: %v" ,
787- err )
803+ for {
804+ g .lndClient , err = lndclient .NewLndServices (
805+ & lndclient.LndServicesConfig {
806+ LndAddress : host ,
807+ Network : network ,
808+ TLSPath : tlsPath ,
809+ Insecure : insecure ,
810+ CustomMacaroonPath : macPath ,
811+ CustomMacaroonHex : hex .EncodeToString (macData ),
812+ BlockUntilChainSynced : true ,
813+ BlockUntilUnlocked : true ,
814+ CallerCtx : ctxc ,
815+ CheckVersion : minimalCompatibleVersion ,
816+ },
817+ )
818+ if err == nil {
819+ log .Infof ("Full lnd client connected" )
820+
821+ break
822+ }
823+
824+ g .statusMgr .SetErrored (
825+ subservers .LIT ,
826+ "Error when creating LND Services client: %v" ,
827+ err ,
828+ )
829+
830+ err = checkRunning ()
831+ if err != nil {
832+ return err
833+ }
834+
835+ log .Infof ("Retrying to create LND Services client" )
788836 }
789837
790838 // Pass LND's build tags to the permission manager so that it can
0 commit comments