discovery: ensure stopping/starting a gossipSyncer is idempotent

This commit is contained in:
Olaoluwa Osuntokun 2018-06-04 16:43:53 -07:00
parent 3bc026aece
commit a9340d22c4

@ -175,6 +175,9 @@ type gossipSyncerCfg struct {
//
// TODO(roasbeef): modify to only sync from one peer at a time?
type gossipSyncer struct {
started uint32
stopped uint32
// remoteUpdateHorizon is the update horizon of the remote peer. We'll
// use this to properly filter out any messages.
remoteUpdateHorizon *lnwire.GossipTimestampRange
@ -226,6 +229,10 @@ func newGossiperSyncer(cfg gossipSyncerCfg) *gossipSyncer {
// Start starts the gossipSyncer and any goroutines that it needs to carry out
// its duties.
func (g *gossipSyncer) Start() error {
if !atomic.CompareAndSwapUint32(&g.started, 0, 1) {
return nil
}
log.Debugf("Starting gossipSyncer(%x)", g.peerPub[:])
g.wg.Add(1)
@ -237,6 +244,10 @@ func (g *gossipSyncer) Start() error {
// Stop signals the gossipSyncer for a graceful exit, then waits until it has
// exited.
func (g *gossipSyncer) Stop() error {
if !atomic.CompareAndSwapUint32(&g.stopped, 0, 1) {
return nil
}
close(g.quit)
g.wg.Wait()