@@ -142,8 +142,8 @@ type LightningTerminal struct {
142
142
// guards all incoming calls. This is only set in integrated mode!
143
143
lndInterceptorChain * rpcperms.InterceptorChain
144
144
145
- wg sync.WaitGroup
146
- lndErrChan chan error
145
+ wg sync.WaitGroup
146
+ errQueue * queue. ConcurrentQueue [ error ]
147
147
148
148
lndClient * lndclient.GrpcLndServices
149
149
basicClient lnrpc.LightningClient
@@ -175,9 +175,7 @@ type LightningTerminal struct {
175
175
176
176
// New creates a new instance of the lightning-terminal daemon.
177
177
func New () * LightningTerminal {
178
- return & LightningTerminal {
179
- lndErrChan : make (chan error , 1 ),
180
- }
178
+ return & LightningTerminal {}
181
179
}
182
180
183
181
// Run starts everything and then blocks until either the application is shut
@@ -202,9 +200,9 @@ func (g *LightningTerminal) Run() error {
202
200
// This concurrent error queue can be used by every component that can
203
201
// raise runtime errors. Using a queue will prevent us from blocking on
204
202
// sending errors to it, as long as the queue is running.
205
- errQueue : = queue.NewConcurrentQueue [error ](queue .DefaultQueueSize )
206
- errQueue .Start ()
207
- defer errQueue .Stop ()
203
+ g . errQueue = queue.NewConcurrentQueue [error ](queue .DefaultQueueSize )
204
+ g . errQueue .Start ()
205
+ defer g . errQueue .Stop ()
208
206
209
207
// Construct a new PermissionsManager.
210
208
g .permsMgr , err = NewPermissionsManager ()
@@ -268,6 +266,7 @@ func (g *LightningTerminal) Run() error {
268
266
readyChan := make (chan struct {})
269
267
bufReadyChan := make (chan struct {})
270
268
unlockChan := make (chan struct {})
269
+ lndQuit := make (chan struct {})
271
270
macChan := make (chan []byte , 1 )
272
271
273
272
if g .cfg .LndMode == ModeIntegrated {
@@ -304,11 +303,11 @@ func (g *LightningTerminal) Run() error {
304
303
(! ok || e .Type != flags .ErrHelp ) {
305
304
306
305
log .Errorf ("Error running main lnd: %v" , err )
307
- g .lndErrChan <- err
306
+ g .errQueue . ChanIn () <- err
308
307
return
309
308
}
310
309
311
- close (g . lndErrChan )
310
+ close (lndQuit )
312
311
}()
313
312
} else {
314
313
close (unlockChan )
@@ -337,9 +336,12 @@ func (g *LightningTerminal) Run() error {
337
336
// get the ready signal immediately.
338
337
case <- readyChan :
339
338
340
- case err := <- g .lndErrChan :
339
+ case err := <- g .errQueue . ChanOut () :
341
340
return err
342
341
342
+ case <- lndQuit :
343
+ return nil
344
+
343
345
case <- shutdownInterceptor .ShutdownChannel ():
344
346
return errors .New ("shutting down" )
345
347
}
@@ -375,9 +377,12 @@ func (g *LightningTerminal) Run() error {
375
377
select {
376
378
case <- readyChan :
377
379
378
- case err := <- g .lndErrChan :
380
+ case err := <- g .errQueue . ChanOut () :
379
381
return err
380
382
383
+ case <- lndQuit :
384
+ return nil
385
+
381
386
case <- shutdownInterceptor .ShutdownChannel ():
382
387
return errors .New ("shutting down" )
383
388
}
@@ -404,12 +409,15 @@ func (g *LightningTerminal) Run() error {
404
409
log .Errorf ("Received critical error from loop, shutting down: " +
405
410
"%v" , err )
406
411
407
- case err := <- g .lndErrChan :
412
+ case err := <- g .errQueue . ChanOut () :
408
413
if err != nil {
409
- log .Errorf ("Received critical error from lnd , " +
414
+ log .Errorf ("Received critical error from subsystem , " +
410
415
"shutting down: %v" , err )
411
416
}
412
417
418
+ case <- lndQuit :
419
+ return nil
420
+
413
421
case <- shutdownInterceptor .ShutdownChannel ():
414
422
log .Infof ("Shutdown signal received" )
415
423
}
@@ -607,7 +615,7 @@ func (g *LightningTerminal) startSubservers() error {
607
615
// Start the middleware manager.
608
616
g .middleware = mid .NewManager (
609
617
g .cfg .RPCMiddleware .InterceptTimeout ,
610
- g .lndClient .Client ,
618
+ g .lndClient .Client , g . errQueue . ChanIn (),
611
619
)
612
620
613
621
if err = g .middleware .Start (); err != nil {
@@ -935,15 +943,25 @@ func (g *LightningTerminal) shutdown() error {
935
943
936
944
g .wg .Wait ()
937
945
938
- // The lnd error channel is only used if we are actually running lnd in
939
- // the same process.
940
- if g .cfg .LndMode == ModeIntegrated {
941
- err := <- g .lndErrChan
942
- if err != nil {
943
- log .Errorf ("Error stopping lnd: %v" , err )
944
- returnErr = err
946
+ // Do we have any last errors to display? We use an anonymous function,
947
+ // so we can use return instead of breaking to a label in the default
948
+ // case.
949
+ func () {
950
+ for {
951
+ select {
952
+ case err := <- g .errQueue .ChanOut ():
953
+ if err != nil {
954
+ log .Errorf ("Error while stopping " +
955
+ "litd: %v" , err )
956
+
957
+ returnErr = err
958
+ }
959
+
960
+ default :
961
+ return
962
+ }
945
963
}
946
- }
964
+ }()
947
965
948
966
return returnErr
949
967
}
0 commit comments