mirror of
https://github.com/lightningnetwork/lnd.git
synced 2025-09-05 17:05:50 +02:00
chainntnfs: use sync.Once to start notifiers.
This commit is contained in:
@@ -53,7 +53,7 @@ type txUpdate struct {
|
||||
type BtcdNotifier struct {
|
||||
epochClientCounter uint64 // To be used atomically.
|
||||
|
||||
started int32 // To be used atomically.
|
||||
start sync.Once
|
||||
stopped int32 // To be used atomically.
|
||||
|
||||
chainConn *rpcclient.Client
|
||||
@@ -134,11 +134,44 @@ func New(config *rpcclient.ConnConfig, chainParams *chaincfg.Params,
|
||||
// Start connects to the running btcd node over websockets, registers for block
|
||||
// notifications, and finally launches all related helper goroutines.
|
||||
func (b *BtcdNotifier) Start() error {
|
||||
// Already started?
|
||||
if atomic.AddInt32(&b.started, 1) != 1 {
|
||||
var startErr error
|
||||
b.start.Do(func() {
|
||||
startErr = b.startNotifier()
|
||||
})
|
||||
return startErr
|
||||
}
|
||||
|
||||
// Stop shutsdown the BtcdNotifier.
|
||||
func (b *BtcdNotifier) Stop() error {
|
||||
// Already shutting down?
|
||||
if atomic.AddInt32(&b.stopped, 1) != 1 {
|
||||
return nil
|
||||
}
|
||||
|
||||
// Shutdown the rpc client, this gracefully disconnects from btcd, and
|
||||
// cleans up all related resources.
|
||||
b.chainConn.Shutdown()
|
||||
|
||||
close(b.quit)
|
||||
b.wg.Wait()
|
||||
|
||||
b.chainUpdates.Stop()
|
||||
b.txUpdates.Stop()
|
||||
|
||||
// Notify all pending clients of our shutdown by closing the related
|
||||
// notification channels.
|
||||
for _, epochClient := range b.blockEpochClients {
|
||||
close(epochClient.cancelChan)
|
||||
epochClient.wg.Wait()
|
||||
|
||||
close(epochClient.epochChan)
|
||||
}
|
||||
b.txNotifier.TearDown()
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
func (b *BtcdNotifier) startNotifier() error {
|
||||
// Start our concurrent queues before starting the chain connection, to
|
||||
// ensure onBlockConnected and onRedeemingTx callbacks won't be
|
||||
// blocked.
|
||||
@@ -182,36 +215,6 @@ func (b *BtcdNotifier) Start() error {
|
||||
return nil
|
||||
}
|
||||
|
||||
// Stop shutsdown the BtcdNotifier.
|
||||
func (b *BtcdNotifier) Stop() error {
|
||||
// Already shutting down?
|
||||
if atomic.AddInt32(&b.stopped, 1) != 1 {
|
||||
return nil
|
||||
}
|
||||
|
||||
// Shutdown the rpc client, this gracefully disconnects from btcd, and
|
||||
// cleans up all related resources.
|
||||
b.chainConn.Shutdown()
|
||||
|
||||
close(b.quit)
|
||||
b.wg.Wait()
|
||||
|
||||
b.chainUpdates.Stop()
|
||||
b.txUpdates.Stop()
|
||||
|
||||
// Notify all pending clients of our shutdown by closing the related
|
||||
// notification channels.
|
||||
for _, epochClient := range b.blockEpochClients {
|
||||
close(epochClient.cancelChan)
|
||||
epochClient.wg.Wait()
|
||||
|
||||
close(epochClient.epochChan)
|
||||
}
|
||||
b.txNotifier.TearDown()
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
// onBlockConnected implements on OnBlockConnected callback for rpcclient.
|
||||
// Ingesting a block updates the wallet's internal utxo state based on the
|
||||
// outputs created and destroyed within each block.
|
||||
|
Reference in New Issue
Block a user