|
@@ -1,12 +1,14 @@
|
|
|
package overlay
|
|
|
|
|
|
import (
|
|
|
+ "context"
|
|
|
"fmt"
|
|
|
"net"
|
|
|
"sync"
|
|
|
"syscall"
|
|
|
|
|
|
"github.com/Sirupsen/logrus"
|
|
|
+ "github.com/docker/libnetwork/common"
|
|
|
)
|
|
|
|
|
|
const ovPeerTable = "overlay_peer_table"
|
|
@@ -59,8 +61,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 +141,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 +171,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,9 +212,6 @@ func (d *driver) peerDbUpdateSandbox(nid string) {
|
|
|
}
|
|
|
d.peerDb.Unlock()
|
|
|
|
|
|
- peerDbWg.Add(1)
|
|
|
-
|
|
|
- var peerOps []func()
|
|
|
pMap.Lock()
|
|
|
for pKeyStr, pEntry := range pMap.mp {
|
|
|
var pKey peerKey
|
|
@@ -233,28 +227,67 @@ func (d *driver) peerDbUpdateSandbox(nid string) {
|
|
|
// pointing to the same memory location for every iteration. Make
|
|
|
// a copy of pEntry before capturing it in the following closure.
|
|
|
entry := pEntry
|
|
|
- op := func() {
|
|
|
- if err := d.peerAdd(nid, entry.eid, pKey.peerIP, entry.peerIPMask,
|
|
|
- pKey.peerMac, entry.vtep,
|
|
|
- false, false, false); err != nil {
|
|
|
- logrus.Errorf("peerdbupdate in sandbox failed for ip %s and mac %s: %v",
|
|
|
- pKey.peerIP, pKey.peerMac, err)
|
|
|
- }
|
|
|
- }
|
|
|
|
|
|
- peerOps = append(peerOps, op)
|
|
|
+ d.peerAdd(nid, entry.eid, pKey.peerIP, entry.peerIPMask, pKey.peerMac, entry.vtep, false, false, false, false)
|
|
|
}
|
|
|
pMap.Unlock()
|
|
|
+}
|
|
|
|
|
|
- for _, op := range peerOps {
|
|
|
- op()
|
|
|
- }
|
|
|
+type peerOperation struct {
|
|
|
+ isAdd bool
|
|
|
+ networkID string
|
|
|
+ endpointID string
|
|
|
+ peerIP net.IP
|
|
|
+ peerIPMask net.IPMask
|
|
|
+ peerMac net.HardwareAddr
|
|
|
+ vtepIP net.IP
|
|
|
+ updateDB bool
|
|
|
+ l2Miss bool
|
|
|
+ l3Miss bool
|
|
|
+ localPeer bool
|
|
|
+ callerName string
|
|
|
+}
|
|
|
|
|
|
- peerDbWg.Done()
|
|
|
+func (d *driver) peerOpRoutine(ctx context.Context, ch chan *peerOperation) {
|
|
|
+ var err error
|
|
|
+ for {
|
|
|
+ select {
|
|
|
+ case <-ctx.Done():
|
|
|
+ return
|
|
|
+ case op := <-ch:
|
|
|
+ if op.isAdd {
|
|
|
+ err = d.peerAddOp(op.networkID, op.endpointID, op.peerIP, op.peerIPMask, op.peerMac, op.vtepIP, op.updateDB, op.l2Miss, op.l3Miss, op.localPeer)
|
|
|
+ } else {
|
|
|
+ err = d.peerDeleteOp(op.networkID, op.endpointID, op.peerIP, op.peerIPMask, op.peerMac, op.vtepIP, op.localPeer)
|
|
|
+ }
|
|
|
+ if err != nil {
|
|
|
+ logrus.Warnf("Peer operation failed:%s op:%v", err, op)
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
func (d *driver) peerAdd(nid, eid string, peerIP net.IP, peerIPMask net.IPMask,
|
|
|
- peerMac net.HardwareAddr, vtep net.IP, updateDb, l2Miss, l3Miss bool) error {
|
|
|
+ peerMac net.HardwareAddr, vtep net.IP, updateDb, l2Miss, l3Miss, localPeer bool) {
|
|
|
+ callerName := common.CallerName(1)
|
|
|
+ d.peerOpCh <- &peerOperation{
|
|
|
+ isAdd: true,
|
|
|
+ networkID: nid,
|
|
|
+ endpointID: eid,
|
|
|
+ peerIP: peerIP,
|
|
|
+ peerIPMask: peerIPMask,
|
|
|
+ peerMac: peerMac,
|
|
|
+ vtepIP: vtep,
|
|
|
+ updateDB: updateDb,
|
|
|
+ l2Miss: l2Miss,
|
|
|
+ l3Miss: l3Miss,
|
|
|
+ localPeer: localPeer,
|
|
|
+ callerName: callerName,
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+func (d *driver) peerAddOp(nid, eid string, peerIP net.IP, peerIPMask net.IPMask,
|
|
|
+ peerMac net.HardwareAddr, vtep net.IP, updateDb, l2Miss, l3Miss, updateOnlyDB bool) error {
|
|
|
|
|
|
if err := validateID(nid, eid); err != nil {
|
|
|
return err
|
|
@@ -262,6 +295,9 @@ func (d *driver) peerAdd(nid, eid string, peerIP net.IP, peerIPMask net.IPMask,
|
|
|
|
|
|
if updateDb {
|
|
|
d.peerDbAdd(nid, eid, peerIP, peerIPMask, peerMac, vtep, false)
|
|
|
+ if updateOnlyDB {
|
|
|
+ return nil
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
n := d.network(nid)
|
|
@@ -311,6 +347,22 @@ func (d *driver) peerAdd(nid, eid string, peerIP net.IP, peerIPMask net.IPMask,
|
|
|
}
|
|
|
|
|
|
func (d *driver) peerDelete(nid, eid string, peerIP net.IP, peerIPMask net.IPMask,
|
|
|
+ peerMac net.HardwareAddr, vtep net.IP, updateDb bool) {
|
|
|
+ callerName := common.CallerName(1)
|
|
|
+ d.peerOpCh <- &peerOperation{
|
|
|
+ isAdd: false,
|
|
|
+ networkID: nid,
|
|
|
+ endpointID: eid,
|
|
|
+ peerIP: peerIP,
|
|
|
+ peerIPMask: peerIPMask,
|
|
|
+ peerMac: peerMac,
|
|
|
+ vtepIP: vtep,
|
|
|
+ updateDB: updateDb,
|
|
|
+ callerName: callerName,
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+func (d *driver) peerDeleteOp(nid, eid string, peerIP net.IP, peerIPMask net.IPMask,
|
|
|
peerMac net.HardwareAddr, vtep net.IP, updateDb bool) error {
|
|
|
|
|
|
if err := validateID(nid, eid); err != nil {
|