فهرست منبع

Merge pull request #1638 from aboch/ovlk

Do not hold the peer map lock during the peerDBNetworkWalk
Madhu Venugopal 8 سال پیش
والد
کامیت
82a40d732f
1فایلهای تغییر یافته به همراه9 افزوده شده و 5 حذف شده
  1. 9 5
      libnetwork/drivers/overlay/peerdb.go

+ 9 - 5
libnetwork/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 {
 func (d *driver) peerDbNetworkWalk(nid string, f func(*peerKey, *peerEntry) bool) error {
 	d.peerDb.Lock()
 	d.peerDb.Lock()
 	pMap, ok := d.peerDb.mp[nid]
 	pMap, ok := d.peerDb.mp[nid]
+	d.peerDb.Unlock()
+
 	if !ok {
 	if !ok {
-		d.peerDb.Unlock()
 		return nil
 		return nil
 	}
 	}
-	d.peerDb.Unlock()
+
+	mp := map[string]peerEntry{}
 
 
 	pMap.Lock()
 	pMap.Lock()
 	for pKeyStr, pEntry := range pMap.mp {
 	for pKeyStr, pEntry := range pMap.mp {
+		mp[pKeyStr] = pEntry
+	}
+	pMap.Unlock()
+
+	for pKeyStr, pEntry := range mp {
 		var pKey peerKey
 		var pKey peerKey
 		if _, err := fmt.Sscan(pKeyStr, &pKey); err != nil {
 		if _, err := fmt.Sscan(pKeyStr, &pKey); err != nil {
 			logrus.Warnf("Peer key scan on network %s failed: %v", nid, err)
 			logrus.Warnf("Peer key scan on network %s failed: %v", nid, err)
 		}
 		}
-
 		if f(&pKey, &pEntry) {
 		if f(&pKey, &pEntry) {
-			pMap.Unlock()
 			return nil
 			return nil
 		}
 		}
 	}
 	}
-	pMap.Unlock()
 
 
 	return nil
 	return nil
 }
 }