From 1a90991905a3d2b427d9aac7f7f7f8345d0c2913 Mon Sep 17 00:00:00 2001 From: Olaoluwa Osuntokun Date: Tue, 22 Aug 2017 00:24:37 -0700 Subject: [PATCH] rpc: ensure the inner grouting within SendPayment will always exit MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This commit adds a new reqQuit channel within SendPayment. The inner goroutine will use this channel to detect if the request itself has exited or not. Without this method, we’d possible leak a goroutine if a client never closed the payment stream. --- rpcserver.go | 24 +++++++++++++++++++++--- 1 file changed, 21 insertions(+), 3 deletions(-) diff --git a/rpcserver.go b/rpcserver.go index c3888c50..65253d15 100644 --- a/rpcserver.go +++ b/rpcserver.go @@ -1405,9 +1405,15 @@ func (r *rpcServer) SendPayment(paymentStream lnrpc.Lightning_SendPaymentServer) // Launch a new goroutine to handle reading new payment requests from // the client. This way we can handle errors independently of blocking // and waiting for the next payment request to come through. + reqQuit := make(chan struct{}) + defer func() { + close(reqQuit) + }() go func() { for { select { + case <-reqQuit: + return case <-r.quit: errChan <- nil return @@ -1421,7 +1427,11 @@ func (r *rpcServer) SendPayment(paymentStream lnrpc.Lightning_SendPaymentServer) errChan <- nil return } else if err != nil { - errChan <- err + select { + case errChan <- err: + case <-reqQuit: + return + } return } @@ -1433,7 +1443,11 @@ func (r *rpcServer) SendPayment(paymentStream lnrpc.Lightning_SendPaymentServer) if nextPayment.PaymentRequest != "" { payReq, err := zpay32.Decode(nextPayment.PaymentRequest) if err != nil { - errChan <- err + select { + case errChan <- err: + case <-reqQuit: + return + } return } @@ -1444,7 +1458,11 @@ func (r *rpcServer) SendPayment(paymentStream lnrpc.Lightning_SendPaymentServer) nextPayment.PaymentHash = payReq.PaymentHash[:] } - payChan <- nextPayment + select { + case payChan <- nextPayment: + case <-reqQuit: + return + } } } }()