From 760abd041b3100007987423140db1f169c84dab9 Mon Sep 17 00:00:00 2001 From: Alessandro Boch Date: Tue, 7 Feb 2017 10:04:38 -0800 Subject: [PATCH] Do not hold the peer map lock during the peerDBNetworkWalk Signed-off-by: Alessandro Boch --- drivers/overlay/peerdb.go | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/drivers/overlay/peerdb.go b/drivers/overlay/peerdb.go index fff7e31249..92817a1a98 100644 --- a/drivers/overlay/peerdb.go +++ b/drivers/overlay/peerdb.go @@ -80,25 +80,29 @@ func (d *driver) peerDbWalk(f func(string, *peerKey, *peerEntry) bool) error { func (d *driver) peerDbNetworkWalk(nid string, f func(*peerKey, *peerEntry) bool) error { d.peerDb.Lock() pMap, ok := d.peerDb.mp[nid] + d.peerDb.Unlock() + if !ok { - d.peerDb.Unlock() return nil } - d.peerDb.Unlock() + + mp := map[string]peerEntry{} pMap.Lock() for pKeyStr, pEntry := range pMap.mp { + mp[pKeyStr] = pEntry + } + pMap.Unlock() + + for pKeyStr, pEntry := range mp { var pKey peerKey if _, err := fmt.Sscan(pKeyStr, &pKey); err != nil { logrus.Warnf("Peer key scan on network %s failed: %v", nid, err) } - if f(&pKey, &pEntry) { - pMap.Unlock() return nil } } - pMap.Unlock() return nil }