Ver código fonte

Allowing local joins to happen even when serf is not initialized

With the new Discovery model, join can happen even before serf is
initliazed. It could also happen due to misconfiguration of
--cluster-advertise. The local endpoint join must succeed and later when
the serf initializes and joins the cluster, it will push the local db to
the cluster.

Signed-off-by: Madhu Venugopal <madhu@docker.com>
Madhu Venugopal 9 anos atrás
pai
commit
1081687e38

+ 1 - 5
libnetwork/drivers/overlay/joinleave.go

@@ -75,11 +75,7 @@ func (d *driver) Join(nid, eid string, sboxKey string, jinfo driverapi.JoinInfo,
 
 
 	d.peerDbAdd(nid, eid, ep.addr.IP, ep.mac,
 	d.peerDbAdd(nid, eid, ep.addr.IP, ep.mac,
 		net.ParseIP(d.bindAddress), true)
 		net.ParseIP(d.bindAddress), true)
-	d.notifyCh <- ovNotify{
-		action: "join",
-		nid:    nid,
-		eid:    eid,
-	}
+	d.pushLocalEndpointEvent("join", nid, eid)
 
 
 	return nil
 	return nil
 }
 }

+ 14 - 0
libnetwork/drivers/overlay/overlay.go

@@ -174,6 +174,9 @@ func (d *driver) nodeJoin(node string, self bool) {
 		var err error
 		var err error
 		d.joinOnce.Do(func() {
 		d.joinOnce.Do(func() {
 			err = d.serfJoin(neighIP)
 			err = d.serfJoin(neighIP)
+			if err == nil {
+				d.pushLocalDb()
+			}
 		})
 		})
 		if err != nil {
 		if err != nil {
 			logrus.Errorf("joining serf neighbor %s failed: %v", node, err)
 			logrus.Errorf("joining serf neighbor %s failed: %v", node, err)
@@ -185,6 +188,17 @@ func (d *driver) nodeJoin(node string, self bool) {
 	}
 	}
 }
 }
 
 
+func (d *driver) pushLocalEndpointEvent(action, nid, eid string) {
+	if !d.isSerfAlive() {
+		return
+	}
+	d.notifyCh <- ovNotify{
+		action: "join",
+		nid:    nid,
+		eid:    eid,
+	}
+}
+
 // DiscoverNew is a notification for a new discovery event, such as a new node joining a cluster
 // DiscoverNew is a notification for a new discovery event, such as a new node joining a cluster
 func (d *driver) DiscoverNew(dType driverapi.DiscoveryType, data interface{}) error {
 func (d *driver) DiscoverNew(dType driverapi.DiscoveryType, data interface{}) error {
 	if dType == driverapi.NodeDiscovery {
 	if dType == driverapi.NodeDiscovery {

+ 27 - 2
libnetwork/drivers/overlay/peerdb.go

@@ -56,7 +56,23 @@ func (pKey *peerKey) Scan(state fmt.ScanState, verb rune) error {
 
 
 var peerDbWg sync.WaitGroup
 var peerDbWg sync.WaitGroup
 
 
-func (d *driver) peerDbWalk(nid string, f func(*peerKey, *peerEntry) bool) error {
+func (d *driver) peerDbWalk(f func(string, *peerKey, *peerEntry) bool) error {
+	d.peerDb.Lock()
+	nids := []string{}
+	for nid := range d.peerDb.mp {
+		nids = append(nids, nid)
+	}
+	d.peerDb.Unlock()
+
+	for _, nid := range nids {
+		d.peerDbNetworkWalk(nid, func(pKey *peerKey, pEntry *peerEntry) bool {
+			return f(nid, pKey, pEntry)
+		})
+	}
+	return nil
+}
+
+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]
 	if !ok {
 	if !ok {
@@ -89,7 +105,7 @@ func (d *driver) peerDbSearch(nid string, peerIP net.IP) (net.HardwareAddr, net.
 		found   bool
 		found   bool
 	)
 	)
 
 
-	err := d.peerDbWalk(nid, func(pKey *peerKey, pEntry *peerEntry) bool {
+	err := d.peerDbNetworkWalk(nid, func(pKey *peerKey, pEntry *peerEntry) bool {
 		if pKey.peerIP.Equal(peerIP) {
 		if pKey.peerIP.Equal(peerIP) {
 			peerMac = pKey.peerMac
 			peerMac = pKey.peerMac
 			vtep = pEntry.vtep
 			vtep = pEntry.vtep
@@ -280,3 +296,12 @@ func (d *driver) peerDelete(nid, eid string, peerIP net.IP,
 
 
 	return nil
 	return nil
 }
 }
+
+func (d *driver) pushLocalDb() {
+	d.peerDbWalk(func(nid string, pKey *peerKey, pEntry *peerEntry) bool {
+		if pEntry.isLocal {
+			d.pushLocalEndpointEvent("join", nid, pEntry.eid)
+		}
+		return false
+	})
+}