1
0
Fork 0
mirror of https://github.com/moby/moby.git synced 2022-11-09 12:21:53 -05:00

Fix gossip network event overwriting self

When a node joins a network it sends out a gossip event before it
updates it's own in-memory state. This can create a race where the node
gets the event back from a remote node before we update in-memory state
and we treat that as latest state. To avoid this race, always generate
the gossip after updating local state.

Signed-off-by: Jana Radhakrishnan <mrjana@docker.com>
This commit is contained in:
Jana Radhakrishnan 2016-04-23 13:26:34 -07:00
parent e68750e12a
commit 060aa49a70
2 changed files with 10 additions and 5 deletions

View file

@ -197,9 +197,14 @@ func (nDB *NetworkDB) gossip() {
broadcastQ := nDB.networks[nDB.config.NodeName][nid].tableBroadcasts broadcastQ := nDB.networks[nDB.config.NodeName][nid].tableBroadcasts
nDB.RUnlock() nDB.RUnlock()
if broadcastQ == nil {
logrus.Errorf("Invalid broadcastQ encountered while gossiping for network %s", nid)
continue
}
msgs := broadcastQ.GetBroadcasts(compoundOverhead, bytesAvail) msgs := broadcastQ.GetBroadcasts(compoundOverhead, bytesAvail)
if len(msgs) == 0 { if len(msgs) == 0 {
break continue
} }
// Create a compound message // Create a compound message

View file

@ -336,10 +336,6 @@ func (nDB *NetworkDB) WalkTable(tname string, fn func(string, string, []byte) bo
func (nDB *NetworkDB) JoinNetwork(nid string) error { func (nDB *NetworkDB) JoinNetwork(nid string) error {
ltime := nDB.networkClock.Increment() ltime := nDB.networkClock.Increment()
if err := nDB.sendNetworkEvent(nid, networkJoin, ltime); err != nil {
return fmt.Errorf("failed to send leave network event for %s: %v", nid, err)
}
nDB.Lock() nDB.Lock()
nodeNetworks, ok := nDB.networks[nDB.config.NodeName] nodeNetworks, ok := nDB.networks[nDB.config.NodeName]
if !ok { if !ok {
@ -356,6 +352,10 @@ func (nDB *NetworkDB) JoinNetwork(nid string) error {
nDB.networkNodes[nid] = append(nDB.networkNodes[nid], nDB.config.NodeName) nDB.networkNodes[nid] = append(nDB.networkNodes[nid], nDB.config.NodeName)
nDB.Unlock() nDB.Unlock()
if err := nDB.sendNetworkEvent(nid, networkJoin, ltime); err != nil {
return fmt.Errorf("failed to send leave network event for %s: %v", nid, err)
}
logrus.Debugf("%s: joined network %s", nDB.config.NodeName, nid) logrus.Debugf("%s: joined network %s", nDB.config.NodeName, nid)
if _, err := nDB.bulkSync(nid, true); err != nil { if _, err := nDB.bulkSync(nid, true); err != nil {
logrus.Errorf("Error bulk syncing while joining network %s: %v", nid, err) logrus.Errorf("Error bulk syncing while joining network %s: %v", nid, err)