lnrpc: add "waiting to start" state to state service
This commit adds a new "waiting to start" state which may be used to query if we're still waiting to become the cluster leader. Once leader we advance the state to "wallet not exist" or "wallet locked" given wallet availablity.
This commit is contained in:
8 files changed
+196
-104
No files matched your search
@@ -275,3 +275,4 @@
|
||||
<time> [ERR] RPCS: [/lnrpc.Lightning/SubscribeInvoices]: context canceled
|
||||
<time> [ERR] RPCS: [/lnrpc.Lightning/SubscribeChannelGraph]: context deadline exceeded
|
||||
<time> [ERR] RPCS: [/invoicesrpc.Invoices/SubscribeSingleInvoice]: context canceled
|
||||
<time> [ERR] RPCS: [/lnrpc.State/SubscribeState]: context canceled
|
||||
@@ -652,6 +652,10 @@ func (hn *HarnessNode) start(lndBinary string, lndError chan<- error) error {
|
||||
return err
|
||||
}
|
||||
|
||||
if err := hn.waitUntilStarted(conn, DefaultTimeout); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
// If the node was created with a seed, we will need to perform an
|
||||
// additional step to unlock the wallet. The connection returned will
|
||||
// only use the TLS certs, and can only perform operations necessary to
|
||||
@@ -664,6 +668,49 @@ func (hn *HarnessNode) start(lndBinary string, lndError chan<- error) error {
|
||||
return hn.initLightningClient(conn)
|
||||
}
|
||||
|
||||
// waitUntilStarted waits until the wallet state flips from "WAITING_TO_START".
|
||||
func (hn *HarnessNode) waitUntilStarted(conn grpc.ClientConnInterface,
|
||||
timeout time.Duration) error {
|
||||
|
||||
stateClient := lnrpc.NewStateClient(conn)
|
||||
ctx, cancel := context.WithCancel(context.Background())
|
||||
defer cancel()
|
||||
|
||||
stateStream, err := stateClient.SubscribeState(
|
||||
ctx, &lnrpc.SubscribeStateRequest{},
|
||||
)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
errChan := make(chan error, 1)
|
||||
started := make(chan struct{})
|
||||
go func() {
|
||||
for {
|
||||
resp, err := stateStream.Recv()
|
||||
if err != nil {
|
||||
errChan <- err
|
||||
}
|
||||
|
||||
if resp.State != lnrpc.WalletState_WAITING_TO_START {
|
||||
close(started)
|
||||
return
|
||||
}
|
||||
}
|
||||
}()
|
||||
|
||||
select {
|
||||
|
||||
case <-started:
|
||||
case err = <-errChan:
|
||||
|
||||
case <-time.After(timeout):
|
||||
return fmt.Errorf("WaitUntilLeader timed out")
|
||||
}
|
||||
|
||||
return err
|
||||
}
|
||||
|
||||
// initClientWhenReady waits until the main gRPC server is detected as active,
|
||||
// then complete the normal HarnessNode gRPC connection creation. This can be
|
||||
// used it a node has just been unlocked, or has its wallet state initialized.
|
||||
|
||||
Reference in new issue
Block a user