p2p: comment on the wg.Add before go saveRoutine()

Just noticed while auditing the code in p2p/addrbook.go,
wg.Add(1) but no subsequent defer.
@jaekwon and I had a discussion offline and we agreed to
comment about why the code was that way and why
we shouldn't move the wg.Add(1) into .saveRoutine() because
if go a.saveRoutine() isn't started before anyone invokes
a.Wait(), then we'd have raced a.saveRoutine().
This commit is contained in:
Emmanuel Odeke 2017-11-13 16:28:14 -07:00
parent 238e2b72ee
commit 62c1bc0a20
No known key found for this signature in database
GPG Key ID: 1CA47A292F89DD40

View File

@ -127,8 +127,12 @@ func (a *AddrBook) init() {
func (a *AddrBook) OnStart() error { func (a *AddrBook) OnStart() error {
a.BaseService.OnStart() a.BaseService.OnStart()
a.loadFromFile(a.filePath) a.loadFromFile(a.filePath)
// wg.Add to ensure that any invocation of .Wait()
// later on will wait for saveRoutine to terminate.
a.wg.Add(1) a.wg.Add(1)
go a.saveRoutine() go a.saveRoutine()
return nil return nil
} }
@ -391,6 +395,8 @@ func (a *AddrBook) Save() {
/* Private methods */ /* Private methods */
func (a *AddrBook) saveRoutine() { func (a *AddrBook) saveRoutine() {
defer a.wg.Done()
dumpAddressTicker := time.NewTicker(dumpAddressInterval) dumpAddressTicker := time.NewTicker(dumpAddressInterval)
out: out:
for { for {
@ -403,7 +409,6 @@ out:
} }
dumpAddressTicker.Stop() dumpAddressTicker.Stop()
a.saveToFile(a.filePath) a.saveToFile(a.filePath)
a.wg.Done()
a.Logger.Info("Address handler done") a.Logger.Info("Address handler done")
} }