From 194e24436d928907837d3225ca03e54d494c671a Mon Sep 17 00:00:00 2001 From: Flavio Crisciani Date: Wed, 26 Jul 2017 14:27:27 -0700 Subject: [PATCH] Fix for crash on WaitGroup panic: sync: WaitGroup is reused before previous Wait has returned The panic is due to an EventNotify that arrives in conjunction with a peerAdd or peerDelete. Wait is followed by an Add The current WaitGroup logic does not add any further protection. The pMap mutex should be enough The update operations have to happen inside the pMap lock to be safe, else there is a race between the update operations and new peerAdd and peerDelete Signed-off-by: Flavio Crisciani --- drivers/overlay/peerdb.go | 10 +--------- 1 file changed, 1 insertion(+), 9 deletions(-) diff --git a/drivers/overlay/peerdb.go b/drivers/overlay/peerdb.go index 21cd1fbe3d..7d79f37371 100644 --- a/drivers/overlay/peerdb.go +++ b/drivers/overlay/peerdb.go @@ -59,8 +59,6 @@ func (pKey *peerKey) Scan(state fmt.ScanState, verb rune) error { return nil } -var peerDbWg sync.WaitGroup - func (d *driver) peerDbWalk(f func(string, *peerKey, *peerEntry) bool) error { d.peerDb.Lock() nids := []string{} @@ -141,8 +139,6 @@ func (d *driver) peerDbSearch(nid string, peerIP net.IP) (net.HardwareAddr, net. func (d *driver) peerDbAdd(nid, eid string, peerIP net.IP, peerIPMask net.IPMask, peerMac net.HardwareAddr, vtep net.IP, isLocal bool) { - peerDbWg.Wait() - d.peerDb.Lock() pMap, ok := d.peerDb.mp[nid] if !ok { @@ -173,7 +169,6 @@ func (d *driver) peerDbAdd(nid, eid string, peerIP net.IP, peerIPMask net.IPMask func (d *driver) peerDbDelete(nid, eid string, peerIP net.IP, peerIPMask net.IPMask, peerMac net.HardwareAddr, vtep net.IP) peerEntry { - peerDbWg.Wait() d.peerDb.Lock() pMap, ok := d.peerDb.mp[nid] @@ -215,8 +210,6 @@ func (d *driver) peerDbUpdateSandbox(nid string) { } d.peerDb.Unlock() - peerDbWg.Add(1) - var peerOps []func() pMap.Lock() for pKeyStr, pEntry := range pMap.mp { @@ -244,13 +237,12 @@ func (d *driver) peerDbUpdateSandbox(nid string) { peerOps = append(peerOps, op) } - pMap.Unlock() for _, op := range peerOps { op() } + pMap.Unlock() - peerDbWg.Done() } func (d *driver) peerAdd(nid, eid string, peerIP net.IP, peerIPMask net.IPMask,