From c14458a6b1955fc2a6793eea297b43821837285a Mon Sep 17 00:00:00 2001 From: Antonio Murdaca Date: Thu, 27 Apr 2017 14:35:24 +0200 Subject: [PATCH] BACKPORT: Do not hold the peer map lock during the peerDBNetworkWalk Upstream reference: https://github.com/docker/libnetwork/pull/1638 Upstream reference: https://github.com/moby/moby/pull/31016 BZ https://bugzilla.redhat.com/show_bug.cgi?id=1446184 Signed-off-by: Antonio Murdaca --- .../docker/libnetwork/drivers/overlay/peerdb.go | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/vendor/src/github.com/docker/libnetwork/drivers/overlay/peerdb.go b/vendor/src/github.com/docker/libnetwork/drivers/overlay/peerdb.go index f44b3aef67b23..809d670445d9c 100644 --- a/vendor/src/github.com/docker/libnetwork/drivers/overlay/peerdb.go +++ b/vendor/src/github.com/docker/libnetwork/drivers/overlay/peerdb.go @@ -80,25 +80,30 @@ 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 { log.Warnf("Peer key scan on network %s failed: %v", nid, err) } if f(&pKey, &pEntry) { - pMap.Unlock() return nil } } - pMap.Unlock() return nil }