rpc: ensure the inner grouting within SendPayment will always exit
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.
This commit is contained in:
parent
6ad803b99c
commit
1a90991905
24
rpcserver.go
24
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
|
||||
}
|
||||
}
|
||||
}
|
||||
}()
|
||||
|
Loading…
Reference in New Issue
Block a user