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:
parent
e68750e12a
commit
060aa49a70
2 changed files with 10 additions and 5 deletions
|
@ -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
|
||||||
|
|
|
@ -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)
|
||||||
|
|
Loading…
Reference in a new issue